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下实现折线图效果的代码
Apr 28 PHP
php设计模式 Factory(工厂模式)
Jun 26 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
Oct 23 PHP
php 定义404页面的实现代码
Nov 19 PHP
php简单实现批量上传图片的方法
May 09 PHP
PHP函数引用返回的实例详解
Sep 11 PHP
PHP中静态变量的使用方法实例分析
Dec 01 PHP
PHP将数据导出Excel表中的实例(投机型)
Jul 31 PHP
PHP实现的简单在线计算器功能示例
Aug 02 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
Feb 27 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
Sep 30 PHP
Laravel 验证码认证学习记录小结
Dec 20 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网页病毒清除类
2014/12/08 PHP
Yii2验证器(Validator)用法分析
2016/07/23 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
js常用自定义公共函数汇总
2014/01/15 Javascript
jquery datatable后台封装数据示例代码
2014/08/07 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
javascript浏览器窗口之间传递数据的方法
2015/01/20 Javascript
使用DNode实现php和nodejs之间通信的简单实例
2015/07/06 NodeJs
简单的分页代码js实现
2016/05/17 Javascript
JavaScript中的跨浏览器事件操作的基本方法整理
2016/05/20 Javascript
Jquery和JS获取ul中li标签的实现方法
2016/06/02 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
2018/03/07 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
微信小程序wx.navigateTo方法里的events参数使用详情及场景
2020/01/07 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
微信小程序保持session会话的方法
2020/03/20 Javascript
详解微信小程序工程化探索之webpack实战
2020/04/20 Javascript
[01:05]DOTA2完美大师赛趣味视频之选手教你打职业
2017/11/23 DOTA
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python中的并发编程实例
2014/07/07 Python
python中二维阵列的变换实例
2014/10/09 Python
Python上传package到Pypi(代码简单)
2016/02/06 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
python re正则匹配网页中图片url地址的方法
2018/12/20 Python
python之pyqt5通过按钮改变Label的背景颜色方法
2019/06/13 Python
python实现读取excel文件中所有sheet操作示例
2019/08/09 Python
谈一谈HTML5本地存储技术
2016/03/02 HTML / CSS
新西兰最大的品牌运动鞋购物网站:Platypus NZ
2017/10/27 全球购物
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
杭州联环马网络笔试题面试题
2013/08/04 面试题
无犯罪记录证明样本
2015/06/16 职场文书
Python实战之实现简易的学生选课系统
2021/05/25 Python