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脚本的10个技巧(5)
Oct 09 PHP
杏林同学录(四)
Oct 09 PHP
php-cli简介(不会Shell语言一样用Shell)
Jun 03 PHP
深入分析php中接口与抽象类的区别
Jun 08 PHP
ThinkPHP3.1新特性之Action参数绑定
Jun 19 PHP
五款PHP代码重构工具推荐
Oct 14 PHP
php的sso单点登录实现方法
Jan 08 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
May 27 PHP
浅析Yii2中GridView常见操作
Apr 22 PHP
php使用文本统计访问量的方法
May 12 PHP
PHP通过引用传递参数用法分析
Dec 01 PHP
PHP实现的XXTEA加密解密算法示例
Aug 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文件操作实现代码分享
2011/09/01 PHP
深入PHP magic quotes的详解
2013/06/17 PHP
理解PHP中的stdClass类
2014/04/18 PHP
PHP中单引号与双引号的区别分析
2014/08/19 PHP
用jquery实现学校的校历(asp.net+jquery ui 1.72)
2010/01/01 Javascript
JS 数字转换研究总结
2013/12/26 Javascript
JS判断文本框内容改变事件的简单实例
2014/03/07 Javascript
15个jquery常用方法、小技巧分享
2015/01/13 Javascript
Mvc提交表单的四种方法全程详解
2016/08/10 Javascript
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
vue2 全局变量的设置方法
2018/03/09 Javascript
webpack4.x打包过程详解
2018/07/18 Javascript
详解vue-cli脚手架中webpack配置方法
2018/08/22 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
js判断一个对象是数组(函数)的方法实例
2019/12/19 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
详解vue组件之间的通信
2020/08/30 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
Django自定义用户认证示例详解
2018/03/14 Python
python实现根据文件关键字进行切分为多个文件的示例
2018/12/10 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
Python request操作步骤及代码实例
2020/04/13 Python
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
美国体育用品商店:Rally House(NCAA、NFL、MLB、NBA、NHL和MLS)
2018/01/03 全球购物
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
serialVersionUID具有什么样的特征
2014/02/20 面试题
大学生简历自我评价2015
2015/03/03 职场文书
初中生物教学随笔
2015/08/15 职场文书
解决Pytorch中关于model.eval的问题
2021/05/22 Python
spring cloud 配置中心native配置方式
2021/09/25 Java/Android
SpringBoot2零基础到精通之数据与页面响应
2022/03/22 Java/Android
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸