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 相关文章推荐
在apache下限制每个虚拟主机的并发数!!!!
Oct 09 PHP
自动把纯文本转换成Web页面的php代码
Aug 27 PHP
《PHP编程最快明白》第八讲:php启发和小结
Nov 01 PHP
PHP中使用mktime获取时间戳的一个黑色幽默分析
May 31 PHP
深入PHP许愿墙模块功能分析
Jun 25 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
Jan 07 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
Feb 15 PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
Apr 11 PHP
php简单的上传类分享
May 15 PHP
thinkPHP中验证码的简单实现方法
Dec 05 PHP
PHP封装的多文件上传类实例与用法详解
Feb 07 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
乐信RP2100的电路分析和打磨
2021/03/02 无线电
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
php设置编码格式的方法
2013/03/05 PHP
php初始化对象和析构函数的简单实例
2014/03/11 PHP
php实现递归的三种基本方式
2020/07/04 PHP
PHP正则表达式之捕获组与非捕获组
2015/11/06 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
yii框架使用分页的方法分析
2019/07/25 PHP
JavaScript 继承详解(一)
2009/07/13 Javascript
javascript cookies操作集合
2010/04/12 Javascript
javascript 禁用IE工具栏,导航栏等等实现代码
2013/04/01 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
JS清空多文本框、文本域示例代码
2014/02/24 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
JS随机密码生成算法
2019/09/23 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
Python操作使用MySQL数据库的实例代码
2017/05/25 Python
Python PyQt5实现的简易计算器功能示例
2017/08/23 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
2019/06/27 Python
使用Python实现跳一跳自动跳跃功能
2019/07/10 Python
Mac安装python3的方法步骤
2019/08/09 Python
python科学计算之narray对象用法
2019/11/25 Python
Python如何使用turtle库绘制图形
2020/02/26 Python
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
幼儿园大班新学期寄语
2014/01/18 职场文书
应届毕业生通用的自荐书范文
2014/02/07 职场文书
上班看电影检讨书
2014/02/12 职场文书
期末学生评语大全
2014/04/24 职场文书
放飞理想演讲稿
2014/09/09 职场文书
交通事故协议书范文
2014/10/23 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
销售工作决心书
2015/02/04 职场文书
小程序自定义轮播图圆点组件
2022/06/25 Javascript