file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。
创建一个可以控制的资源句柄,通过控制资源句柄超时来控制file_get_contents这个方法的超时时间,使用起来很方便,也很简单。
代码如下 |
复制代码 |
$context = stream_context_create(array(
'http' => array(
'timeout' => 3000 //超时时间,单位为秒
)
));
// Fetch the URL's contents
$contents = file_get_contents('http://www.111cn.net', 0, $context);
|
一、增加超时的时间限制
这里需要注意:set_time_limit只是设置你的PHP程序的超时时间,而不是file_get_contents函数读取URL的超时时间。
我一开始以为set_time_limit也能影响到file_get_contents,后来经测试,是无效的。真正的修改file_get_contents延时可以用resource $context的timeout参数:
代码如下 |
复制代码 |
$opts = array(
'http'=>array(
'method'=>"GET",
'timeout'=>60,
)
);
$context = stream_context_create($opts);
$html =file_get_contents('http://www.111cn.net', false, $context);
|
二、一次有延时的话那就多试几次
有时候失败是因为网络等因素造成,没有解决办法,但是可以修改程序,失败时重试几次,仍然失败就放弃,因为file_get_contents()如果失败将返回 FALSE,所以可以下面这样编写代码:
代码如下 |
复制代码 |
$cnt=0;
while($cnt < 3 && ($str=@file_get_contents('http...'))===FALSE) $cnt++;
|
以上方法对付超时已经OK了。那么Post呢?细心点有人发现了'method'=>"GET", 对!是不是能设置成post呢?百度找了下相关资料,还真可以!而且有人写出了山寨版的post传值函数,如下:
代码如下 |
复制代码 |
function Post($url, $post = null)
{
$context = array();
if (is_array($post))
{
ksort($post);
$context['http'] = array
(
'timeout'=>60,
'method' => 'POST',
'content' => http_build_query($post, '', '&'),
);
}
return file_get_contents($url, false, stream_context_create($context));
}
$data = array
(
'name' => 'test',
'email' => 'test@gmail.com',
'submit' => 'submit',
);
echo Post('http://www.111cn.net', $data);
|
php提供了mkdir来创建文件,但对应5.0一下的版本不支持递归创建多级目录,也就是说给定要创建的目录的上级目录不存在,那么就会创建失败。5.0及以上版本通过吧第三个参数设置为TRUE,就能递归创建指定的目录。不过自己实现一个递归创建多目录的函数也很简单,具体代码如下:
例
代码如下 |
复制代码 |
function mkdirs($dir){
if(!is_dir($dir)){
if(!mkdirs(dirname($dir))){
return FALSE;
}
if(!mkdir($dir, 0777)){
return FALSE;
}
}
return TRUE;
}
$path="/aa/bb/cc/cd"; //要创建的目录
$mode=0755; //创建目录的模式
createdir($path,$mode);//测试
|
php创建目录的函数是mkdir($dir,$mode);但是它每次只能创建一个目录,也就是说它不能一次创建多级目录(这点大家肯定知道来的,这里小编多此一举了)。
小编整理了两个可以递归创建目录的方法供大家参考学习,谢谢啦!
代码如下 |
复制代码 |
<?php
/*
*mkdir($dir,$mode)
*PHP 递归创建目录
*/
function mkdirs($dir, $mode = 0777)
{
if (is_dir($dir) || @mkdir($dir, $mode)){
return true;
}
if (!mkdirs(dirname($dir), $mode)){
return false;
}
return @mkdir($dir, $mode);
}
function mkdirs($dir, $mode = 0777)
{
$dirArray = explode("/",$dir);
$dirArray = array_filter($dirArray);
$created = "";
foreach($dirArray as $key => $value){
if(!empty($created)){
$created .= "/".$value;
if(!is_dir($created)){
mkdir($created,$mode);
}
}else{
if(!is_dir($value)){
mkdir($value,$mode);
}
$created .= $value;
}
}
}
?>
//代码应用实例
$path="abc/ff/ss/";
mkdirs($path,$mode = 0777);
|
在php中分页是我们开发中必须要用到的东西,但在觉得在php分页比在asp中方便了很多,下面我来给各位同学详细介绍人几个不错的php分页类吧,各位同学可参考。
这是我自己写的一个php分页实例
代码如下 |
复制代码 |
<html>
<head>
<title>简单的PHP分页程序</title>
</head>
<body>
<?php
//建立连接数据库
$linkID=@mysql_connect("itlobo.com","root","") or die("you could notconnect mysql");
//连接的数据库名称
@mysql_select_db("ceshi") or die("could not select database!");
//取得记录总数
$query="SELECT count(*) FROM user";
$rs = mysql_query($query);
$myrows=mysql_fetch_array($rs);
$numrows=$myrows[0];
//设定每一页显示的记录数
$pagesize = 1;
//计算总页数
$pages=intval($numrows/$pagesize);
if($numrows%$pagesize)
$pages++;
//设置页数
if(isset($_POST['page']))
$page=intval($_POST['page']);
else{
$page = 1; //没有页数则显示第一页;
}
//计算记录偏移量
$offset = ($page-1)*$pagesize;
//读取指定的记录数
$query1="select * from user limit $offset,$pagesize";
$rs = mysql_query($query1);
if($myrows=mysql_fetch_array($rs))
{
$i = 0;
?>
<table width="80%" border="1">
<tr>
<td width="50%">用户名</td>
<td width="50%">密码</td>
</tr>
<?php
do{
$i++;
?>
<tr>
<td width="50%"><?php echo $myrows["username"] ?></td>
<td width="50%"><?php echo $myrows["password"] ?></td>
</tr>
<?php
}
while($myrows=mysql_fetch_array($rs));
echo "</table>";
}
$first = 1;
$prev =$page-1;
$next = $page+1;
$last=$pages;
if($page>1)
{
echo "<a href='fenye.php?page=".$first."'>首页</a>";
echo "<a href='fenye.php?page=".$prev."'>上一页</a>";
}
if($page<$pages)
{
echo "<a href='fenye.php?page=".$next."'>下一页</a>";
echo "<a href='fenye.php?page=".$last."'>最后一页</a>";
}
echo "<div align = 'center'>共有" .$pages. "页(" .$page. "/" .$pages.")";
for($i=1; $i<$page; $i++)
echo "<a href='fenye.php?page=".$i."'>[".$i."]</a>";
echo "[" .$page. "]";
for($i=$page+1; $i<=$pages;$i++)
echo "<a href='fenye.php?page=".$i."'>[".$i."]</a>";
echo"</div>";
?>
</body>
</html>
|
上面代码不能重复使用,后来整理了一个类
代码如下 |
复制代码 |
#pages{display:block; text-align:center; overflow:hidden; color:#000; font-size:13px}
#pages a{color:#333; text-decoration:none; font-family:Verdana,Geneva,sans-serif; padding:2px 3px; display:block}
#pages li{float:left; display:inline-block; border:1px solid #999; margin-right:3px; margin-left:3px}
#pages #spages{background:#CCC; font-weight:bold; color:#36C}
|
PHP分页函数类源码:
代码如下 |
复制代码 |
<?php
/*
* 分页模块
*/
interface Page{
public function showpage();
}
class AdminPage implements Page{
/*
* 构造参数
* SQL语句,每页显示数,url
*/
private $sql;
private $pageline; //每页显示多少行数据
private $urlstr;
private $nowpage;
private $totalNum;
private $pageNum;
private $pageStr;// 形成分页字符串
public function __construct($sql,$p){
$this->sql = $sql;
$this->pageline = $p;
$this->urlstr = $_SERVER['SCRIPT_NAME'];
if(empty($_GET['p'])){
$this->nowpage = 1; //初始化当前页数为1
}else if(is_numeric($_GET['p'])){
$this->nowpage = $_GET['p'];
}else{
$e = new Error(6);
$e->show();
}
$s = new Sql();
$this->totalNum = $s->results_exist_num($this->sql);
$this->pageNum = ceil($this->totalNum/$this->pageline);
}
/*
* 形式为:
* 首页| 上一页| 1 | 2 | 3 | 4 | 5 |下一页 | 末页
*
*
*/
public function showpage(){
if($this->pageNum >=1 && $this->nowpage <5 ){
if( $this->pageNum <=5){
$this->pageStr = '<ul id="pages"><li><a href="'.$this->urlstr.'?p=1" target="rframe" >首页</a></li>';
if($this->nowpage!=1){
$this->pageStr .= '<li><a href="'.$this->urlstr.'?p='.($this->nowpage-1).'" target="rframe" >上一页</a></li>';
}
for($i=1;$i<=$this->pageNum;$i++){
if($i==$this->nowpage){
$this->pageStr .='<li id="spages"><a href="'.$this->urlstr.'?p='.$i.'" target="rframe" >'.$i.'</a></li>';
}else{
$this->pageStr .='<li><a href="'.$this->urlstr.'?p='.$i.'" target="rframe" >'.$i.'</a></li>';
}
}
if($this->nowpage !=$this->pageNum){
$this->pageStr .= '<li><a href="'.$this->urlstr.'?p='.($this->nowpage+1).'" target="rframe" >下一页</a></li>';
}
$this->pageStr .='<li><a href="'.$this->urlstr.'?p='.$this->pageNum.'" target="rframe" >末页</a></li>';
echo $this->pageStr;
}else if($this->pageNum>5){
$this->pageStr = '<ul id="pages"><li><a href="'.$this->urlstr.'?p=1" target="rframe" >首页</a></li>';
if($this->nowpage !=1){
$this->pageStr .= '<li><a href="'.$this->urlstr.'?p='.($this->nowpage-1).'" target="rframe" >上一页</a></li>';
}
for($i=1;$i<=5;$i++){
if($i==$this->nowpage){
$this->pageStr .='<li id="spages"><a href="'.$this->urlstr.'?p='.$i.'" target="rframe" >'.$i.'</a></li>';
}else{
$this->pageStr .='<li><a href="'.$this->urlstr.'?p='.$i.'" target="rframe" >'.$i.'</a></li>';
}
}
if($this->nowpage !=$this->pageNum){
$this->pageStr .= '<li><a href="'.$this->urlstr.'?p='.($this->nowpage+1).'" target="rframe" >下一页</a></li>';
}
$this->pageStr .='<li><a href="'.$this->urlstr.'?p='.$this->pageNum.'" target="rframe" >末页</a></li>';
echo $this->pageStr;
}
}else if($this->nowpage <= $this->pageNum -2 && $this->nowpage>=5){
$this->pageStr = '<ul id="pages"><li><a href="'.$this->urlstr.'?p=1" target="rframe" >首页</a></li>';
$this->pageStr .= '<li><a href="'.$this->urlstr.'?p='.($this->nowpage-1).'" target="rframe" >上一页</a></li>';
for($i=$this->nowpage-2;$i<=$this->nowpage+2;$i++){
if($i==$this->nowpage){
$this->pageStr .='<li id="spages"><a href="'.$this->urlstr.'?p='.$i.'" target="rframe" >'.$i.'</a></li>';
}else{
$this->pageStr .='<li><a href="'.$this->urlstr.'?p='.$i.'" target="rframe" >'.$i.'</a></li>';
}
}
$this->pageStr .= '<li><a href="'.$this->urlstr.'?p='.($this->nowpage+1).'" target="rframe" >下一页</a></li>';
$this->pageStr .='<li><a href="'.$this->urlstr.'?p='.$this->pageNum.'" target="rframe" >末页</a></li>';
echo $this->pageStr;
}else if($this->nowpage>=$this->pageNum-3 && $this->nowpage <=$this->pageNum){
$this->pageStr = '<ul id="pages"><li><a href="'.$this->urlstr.'?p=1" target="rframe" >首页</a></li>';
$this->pageStr .= '<li><a href="'.$this->urlstr.'?p='.($this->nowpage-1).'" target="rframe" >上一页</a></li>';
for($i=$this->pageNum-4;$i<=$this->pageNum;$i++){
if($i==$this->nowpage){
$this->pageStr .='<li id="spages"><a href="'.$this->urlstr.'?p='.$i.'" target="rframe" >'.$i.'</a></li>';
}else{
$this->pageStr .='<li><a href="'.$this->urlstr.'?p='.$i.'" target="rframe" >'.$i.'</a></li>';
}
}
if($this->nowpage !=$this->pageNum){
$this->pageStr .= '<li><a href="'.$this->urlstr.'?p='.($this->nowpage+1).'" target="rframe" >下一页</a></li>';
}
$this->pageStr .='<li><a href="'.$this->urlstr.'?p='.$this->pageNum.'" target="rframe" >末页</a></li>';
echo $this->pageStr;
}
}
}
|
此文主要记录在虚拟机xdebug环境下如何解决宿主机zendstudio与xdebug通信的问题,从而根本坚决在调试界面出现57%进度条的问题:
问题现象:zend studio xdebug 57% waiting for xdebug session
作者本人的开发环境通常是windows宿主机器+vmare Linux虚拟机,通过linux的samba功能将虚拟机下的目录共享给windows做磁盘映射,这样的开发环境可以快速的在windows下实现完整的Linux代码调试环境。
今日在虚拟机下给php装xdebug来调试代码时,按照网上的步骤对xdebug做了配置,因为我的虚拟机环境的网络是走NAT的。
linux虚拟机的网段是192.168.2.0/255.255.255.0 ,网关为192.168.2.2.
windows宿主机器的网段是192.168.1.0/255.255.255.0
在windows下浏览器访问虚拟机下的http服务时都是通过vmare 的nat虚拟网卡转发过去,此网卡绑定的p为192.168.2.1。那么问题就来了,虚拟机下获取到的来路请求ip都是192.168.2.1,获取到xdebug的调试请求后转发信息给zend studio时网络却受阻了。我在设置的xdebug端口号是19000.如下如所示:
可以从图中看到我们的请求在发送给192.168.2.1 的19000端口时,但是这是卡住的原因是syn_sent的过程网络不通,导致php无法连接到windows宿主机下的zend studio。只要问题定位到就好办了,最快的解决方法就是开启iptables的端口转发,将发送到192.168.2.1 端口19000的数据全部转发给宿主机IP:192.168.1.105。
我们用root配置如下iptabless规则:
iptables -t nat -A OUTPUT -p tcp -d 192.168.2.1 --dport 19000 -j DNAT --to 192.168.1.105:19000
这样我们的zend studio就可以轻松收到php发来的xdebug调试数据了。
用NAT网络模式的虚拟环境比较蛋疼,如果换成桥接模式让宿主机和虚拟机同一个网段,那么问题迎刃而解。
本文章来给各位同学介绍我一个常用的php用户注册时的一些用户名和密码验证函数,还有:邮件格式、手机号码格式、 QQ号码的格式、电话号码格式包括区号、检测参数是否为中文等。
代码如下 |
复制代码 |
Class Check{
/**
* IsUsername函数:检测是否符合用户名格式
* $Argv是要检测的用户名参数
* $RegExp是要进行检测的正则语句
* 返回值:符合用户名格式返回用户名,不是返回false
*/
function IsUsername($Argv){
$RegExp='/^[a-zA-Z0-9_]{3,16}$/'; //由大小写字母跟数字组成并且长度在3-16字符直接
return preg_match($RegExp,$Argv)?$Argv:false;
}
/**
* IsMail函数:检测是否为正确的邮件格式
* 返回值:是正确的邮件格式返回邮件,不是返回false
*/
function IsMail($Argv){
$RegExp='/^[a-z0-9][a-z.0-9-_] @[a-z0-9_-] (?:.[a-z]{0,3}.[a-z]{0,2}|.[a-z]{0,3}|.[a-z]{0,2})$/i';
return preg_match($RegExp,$Argv)?$Argv:false;
}
/**
* IsSmae函数:检测参数的值是否相同
* 返回值:相同返回true,不相同返回false
*/
function IsSame($ArgvOne,$ArgvTwo,$Force=false){
return $Force?$ArgvOne===$ArgvTwo:$ArgvOne==$ArgvTwo;
}
/**
* IsQQ函数:检测参数的值是否符合QQ号码的格式
* 返回值:是正确的QQ号码返回QQ号码,不是返回false
*/
function IsQQ($Argv){
$RegExp='/^[1-9][0-9]{5,11}$/';
return preg_match($RegExp,$Argv)?$Argv:false;
}
/**
* IsMobile函数:检测参数的值是否为正确的中国手机号码格式
* 返回值:是正确的手机号码返回手机号码,不是返回false
*/
function IsMobile($Argv){
$RegExp='/^(?:13|15|18)[0-9]{9}$/';
return preg_match($RegExp,$Argv)?$Argv:false;
}
/**
* IsTel函数:检测参数的值是否为正取的中国电话号码格式包括区号
* 返回值:是正确的电话号码返回电话号码,不是返回false
*/
function IsTel($Argv){
$RegExp='/[0-9]{3,4}-[0-9]{7,8}$/';
return preg_match($RegExp,$Argv)?$Argv:false;
}
/**
* IsNickname函数:检测参数的值是否为正确的昵称格式(Beta)
* 返回值:是正确的昵称格式返回昵称格式,不是返回false
*/
function IsNickname($Argv){
$RegExp='/^s*$|^c:\con\con$|[%,*"st<>&'()]|xA1xA1|xACxA3|^Guest|^xD3xCExBFxCD|xB9x43xABxC8/is'; //Copy From DZ
return preg_match($RegExp,$Argv)?$Argv:false;
}
/**
* IsChinese函数:检测参数是否为中文
* 返回值:是返回参数,不是返回false
*/
function IsChinese($Argv,$Encoding='utf8'){
$RegExp = $Encoding=='utf8'?'/^[x{4e00}-x{9fa5}] $/u':'/^([x80-xFF][x80-xFF]) $/';
Return preg_match($RegExp,$Argv)?$Argv:False;
}
} |
标签:[!--infotagslink--]