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 相关文章推荐
mac下安装nginx和php
Nov 04 PHP
codeigniter自带数据库类使用方法说明
Mar 25 PHP
php中出现空白页的原因及解决方法汇总
Jul 08 PHP
php获取apk包信息的方法
Aug 15 PHP
Ajax实现对静态页面的文章访问统计功能示例
Oct 10 PHP
php Session无效分析资料整理
Nov 29 PHP
php的laravel框架快速集成微信登录的方法
Dec 12 PHP
Zend Framework数据库操作技巧总结
Feb 18 PHP
PHP回调函数与匿名函数实例详解
Aug 16 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 PHP
PHP利用Mysql锁解决高并发的方法
Sep 04 PHP
PHP htmlspecialchars_decode()函数用法讲解
Mar 01 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极大的增强功能和性能
2006/10/09 PHP
PHP获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
初学CAKEPHP 基础教程
2009/11/02 PHP
php 中文字符入库或显示乱码问题的解决方法
2010/04/12 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
JavaScript italics方法入门实例(把字符串显示为斜体)
2014/10/17 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
NodeJS学习笔记之(Url,QueryString,Path)模块
2015/01/13 NodeJs
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
基于jQuery的select下拉框选择触发事件实例分析
2016/11/18 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
2016/12/02 Javascript
webpack2.0配置postcss-loader的方法
2017/08/17 Javascript
View.post() 不靠谱的地方你知道多少
2017/08/29 Javascript
javascript将list转换成树状结构的实例
2017/09/08 Javascript
vue的mixins属性详解
2018/03/14 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)
2020/05/15 Javascript
Python变量作用范围实例分析
2015/07/07 Python
Python使用Django实现博客系统完整版
2020/09/29 Python
Python函数式编程实例详解
2020/01/17 Python
HTML5本地存储之IndexedDB
2017/06/16 HTML / CSS
美国知名平价彩妆品牌:e.l.f. Cosmetics
2017/11/20 全球购物
日语系毕业生推荐信
2013/11/11 职场文书
毕业寄语大全
2014/04/09 职场文书
医学生求职信
2014/07/01 职场文书
电子商务优秀毕业生求职信
2014/07/11 职场文书
党员先进性教育整改措施
2014/09/18 职场文书
导游词之太行山青龙峡
2020/01/14 职场文书
go原生库的中bytes.Buffer用法
2021/04/25 Golang
详解使用 CSS prefers-* 规范提升网站的可访问性与健壮性
2021/05/25 HTML / CSS
浅析Python中的套接字编程
2021/06/22 Python
MySQL中IO问题的深入分析与优化
2022/04/02 MySQL
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL