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 相关文章推荐
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
Apr 12 PHP
php 正则匹配函数体
Aug 25 PHP
php中转义mysql语句的实现代码
Jun 24 PHP
php代码运行时间查看类代码分享
Aug 06 PHP
PHP通过正则表达式下载图片到本地的实现代码
Sep 19 PHP
解析yahoo邮件用phpmailer发送的实例
Jun 24 PHP
ThinkPHP实现批量删除数据的代码实例
Jul 02 PHP
php源码分析之DZX1.5加密解密函数authcode用法
Jun 17 PHP
WordPress开发中短代码的实现及相关函数使用技巧
Jan 05 PHP
PHP获取客户端及服务器端IP的封装类
Jul 21 PHP
phpmailer绑定邮箱的实现方法
Dec 01 PHP
关于PHP数组迭代器的使用方法实例
Nov 17 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模板Smarty的初级使用方法以及心得分享
2013/06/21 PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
2014/10/24 PHP
ThinkPHP实现支付宝接口功能实例
2014/12/02 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
详解WordPress中提醒安装插件以及隐藏插件的功能实现
2015/12/25 PHP
php简单的上传类分享
2016/05/15 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
javascript 操作文件 实现方法小结
2009/07/02 Javascript
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
2013/11/25 Javascript
extjs4 treepanel动态改变行高度示例
2013/12/17 Javascript
JS常用字符串处理方法应用总结
2014/05/22 Javascript
js闭包的用途详解
2014/11/09 Javascript
详解JavaScript中的every()方法
2015/06/08 Javascript
非常实用的js验证框架实现源码 附原理方法
2016/06/08 Javascript
node.js实现快速截图
2016/08/27 Javascript
基于vue2.0实现简单轮播图
2017/11/27 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
详解vue 路由跳转四种方式 (带参数)
2019/04/28 Javascript
VUE组件中的 Drawer 抽屉实现代码
2019/08/06 Javascript
JSX在render函数中的应用详解
2019/09/04 Javascript
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
python基于windows平台锁定键盘输入的方法
2015/03/05 Python
jupyter安装小结
2016/03/13 Python
Python网络编程 Python套接字编程
2017/09/13 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
python 列表,数组和矩阵sum的用法及区别介绍
2018/06/28 Python
python获取指定字符串中重复模式最高的字符串方法
2018/06/29 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
python或C++读取指定文件夹下的所有图片
2019/08/31 Python
Django框架安装方法图文详解
2019/11/04 Python
经典团队口号大全
2014/06/21 职场文书
客户付款通知书
2015/04/23 职场文书
忠诚教育学习心得体会
2016/01/23 职场文书
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
2021/11/11 Python
Python学习之包与模块详解
2022/03/19 Python