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中Object对象的笔记分享
Jun 28 PHP
apache和php之间协同工作的配置经验分享
Apr 08 PHP
phpQuery让php处理html代码像jQuery一样方便
Jan 06 PHP
深入浅析yii2-gii自定义模板的方法
Apr 26 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
Mar 09 PHP
php显示页码分页类的封装
Jun 08 PHP
详解PHP处理字符串类似indexof的方法函数
Jun 11 PHP
PHP实现将base64编码字符串转换成图片示例
Jun 22 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
Jun 03 PHP
Laravel框架控制器的middleware中间件用法分析
Sep 30 PHP
如何在PHP中读写文件
Sep 07 PHP
PHP tp5中使用原生sql查询代码实例
Oct 28 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
PHP函数常用用法小结
2010/02/08 PHP
基于PHPExcel的常用方法总结
2013/06/13 PHP
使用PHP下载CSS文件中的图片的代码
2013/09/24 PHP
ThinkPHP自动填充实现无限级分类的方法
2014/08/22 PHP
PHP获取一段文本显示点阵宽度和高度的方法
2015/03/12 PHP
ThinkPHP发送邮件示例代码
2016/10/08 PHP
php和js实现根据子网掩码和ip计算子网功能示例
2019/11/09 PHP
Document 对象的常用方法
2009/07/31 Javascript
Jquery之Bind方法参数传递与接收的三种方法
2014/06/24 Javascript
JavaScript的原型继承详解
2015/02/15 Javascript
Angular Js文件上传之form-data
2015/08/28 Javascript
json定义及jquery操作json的方法
2016/09/29 Javascript
微信小程序 绘图之饼图实现
2016/10/24 Javascript
react native与webview通信的示例代码
2017/09/25 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
2019/04/17 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
Python 学习笔记
2008/12/27 Python
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
Python3中多线程编程的队列运作示例
2015/04/16 Python
Python构造自定义方法来美化字典结构输出的示例
2016/06/16 Python
Python 多线程不加锁分块读取文件的方法
2018/12/11 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
Python常用的json标准库
2019/02/19 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
美国内衣第一品牌:Hanes(恒适)
2016/07/29 全球购物
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
巴黎一票通:The Paris Pass
2018/02/10 全球购物
金融管理毕业生求职信
2014/03/03 职场文书
小学生竞选班长演讲稿
2014/04/24 职场文书
感恩父母的演讲稿
2014/05/06 职场文书
事业单位鉴定材料
2014/05/25 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
工商管理自荐书
2014/07/06 职场文书
2014年前台接待工作总结
2014/12/05 职场文书