PHP file_get_contents设置超时处理方法


Posted in PHP onSeptember 30, 2013

file_get_contents的超时处理

话说,从PHP5开始,file_get_content已经支持context了(手册上写着:5.0.0 Added the context support. ),也就是说,从5.0开始,file_get_contents其实也可以POST数据。

今天说的这篇是讲超时的,确实在跨服务器提交的时候,不可避免的会遇到超时的情况,这个时候怎么办?set_time_limit是没有用的,只有用context中的timeout时间来控制。相反,我们不是要抑止,而是要管理。比如在超时返回错误后,进行一次尝试,就象js中的 settimeout那样,对函数重新处理。错误超过3次或者5次后,我们就确实的认为无法连接服务器而彻底放弃。这,是一个好办法,应该值得推荐使用。其实。不全是file_get_contents,只要支持context的都应该加上,避免超时浪费时间。这样可以被支持的函数大致有:fsocketopen(该函数的最后一个参数。好象比较推荐在读stream的时候,使用stream_time_out函数进行控制),fopen(也是从PHP5开始加入context支持),file(PHP5加入支持),curl(curl有自已的变量 CURLOPT_TIMEOUT)等 。

在使用file_get_contents函数的时候,经常会出现超时的情况,在这里要通过查看一下错误提示,看看是哪种错误,比较常见的是读取超 时,这种情况大家可以通过一些方法来尽量的避免或者解决。这里就简单介绍两种:

一、增加超时的时间限制

这里需要注意: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'=>1,//单位秒  
   )   
);     $cnt=0;   
while($cnt<3 && ($bb=file_get_contents("https://3water.com", false, stream_context_create($opts)))===FALSE) $cnt++;   
echo $cnt;   
echo $bb; 

二、一次有延时的话那就多试几次

有时候失败是因为网络等因素造成,没有解决办法,但是可以修改程序,失败时重试几次,仍然失败就放弃,因为file_get_contents()如果失 败将返回 FALSE,所以可以下面这样编写代码:

$cnt=0;   
 while($cnt<3 && ($bb=file_get_contents("https://3water.com", false, stream_context_create($opts)))===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' => 'admin@admin.com',   
    'submit' => 'submit',   
);   
echo Post ( 'https://3water.com', $data ); 

OK , 上面函数完美了,既解决了超时控制又解决了Post传值。

PHP 相关文章推荐
php 购物车实例(申精)
May 11 PHP
php设计模式 DAO(数据访问对象模式)
Jun 26 PHP
PHP中实现中文字符进制转换原理分析
Dec 06 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
Dec 19 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
Jan 06 PHP
mysqli_set_charset和SET NAMES使用抉择及优劣分析
Jan 13 PHP
深入apache host的配置详解
Jun 09 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
Jul 05 PHP
PHP正则表达式 /i, /is, /s, /isU等介绍
Oct 23 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
Dec 07 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
Aug 01 PHP
基于Laravel 多个中间件的执行顺序详解
Oct 21 PHP
PHP CURL CURLOPT参数说明(curl_setopt)
Sep 30 #PHP
PHP 验证码不显示只有一个小红叉的解决方法
Sep 30 #PHP
php json_encode值中大括号与花括号区别
Sep 30 #PHP
php 判断是否是中文/英文/数字示例代码
Sep 30 #PHP
PHP swfupload图片上传的实例代码
Sep 30 #PHP
Zend studio文件注释模板设置方法
Sep 29 #PHP
php中将数组转成字符串并保存到数据库中的函数代码
Sep 29 #PHP
You might like
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
对php 判断http还是https,以及获得当前url的方法详解
2019/01/15 PHP
laravel-admin select框默认选中的方法
2019/10/03 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
Mootools 1.2教程 定时器和哈希简介
2009/09/15 Javascript
通过隐藏option实现select的联动效果
2009/11/10 Javascript
mailto的使用技巧分享
2012/12/21 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
2013/08/01 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
JavaScript实现添加及删除事件的方法小结
2015/08/04 Javascript
JavaScript驾驭网页-CSS与DOM
2016/03/24 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
JavaScript实现弹出广告功能
2017/03/30 Javascript
vue-cli如何添加less 以及sass
2017/07/06 Javascript
jQuery实现模糊查询的方法分析
2018/05/10 jQuery
node.js实现微信开发之获取用户授权
2019/03/18 Javascript
Python itertools模块详解
2015/05/09 Python
关于Python元祖,列表,字典,集合的比较
2017/01/06 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
Python中的groupby分组功能的实例代码
2018/07/11 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
3种python调用其他脚本的方法
2020/01/06 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
如何向scrapy中的spider传递参数的几种方法
2020/11/18 Python
pycharm实现猜数游戏
2020/12/07 Python
RentCars.com巴西:汽车租赁网站
2016/08/22 全球购物
澳大利亚第一的设计师礼服租赁网站:GlamCorner
2017/08/13 全球购物
意大利灯具购物网站:Lampade.it
2018/10/18 全球购物
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
个人担保书格式范文
2014/05/12 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
2014年实习期工作总结
2014/11/27 职场文书
团委副书记工作总结
2015/08/14 职场文书
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang