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 相关文章推荐
Windows下PHP5和Apache的安装与配置
Sep 05 PHP
我的论坛源代码(二)
Oct 09 PHP
使用 php4 加速 web 传输
Oct 09 PHP
PHP 变量类型的强制转换
Oct 23 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
Jun 02 PHP
PHP连接SQLServer2005方法及代码
Dec 26 PHP
PHP中的Session对象如何使用
Sep 25 PHP
详解php设置session(过期、失效、有效期)
Nov 12 PHP
PHP搭建大文件切割分块上传功能示例
Jan 04 PHP
PHP中include()与require()的区别说明
Feb 14 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
Mar 18 PHP
thinkphp5.1框架模板赋值与变量输出示例
May 25 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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
全国FM电台频率大全 - 21 海南省
2020/03/11 无线电
php初始化对象和析构函数的简单实例
2014/03/11 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
2014/04/29 PHP
PHP读取RSS(Feed)简单实例
2014/06/12 PHP
浅谈PHP中的数据传输CURL
2016/09/06 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
Symfony查询方法实例小结
2017/06/28 PHP
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
Node.js使用gm拼装sprite图片
2017/07/04 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
jQuery 禁止表单用户名、密码自动填充功能
2017/10/30 jQuery
jquery获取img的src值实例介绍
2019/01/16 jQuery
JS实现网页端猜数字小游戏
2020/03/06 Javascript
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
跟老齐学Python之变量和参数
2014/10/10 Python
python实现TCP服务器端与客户端的方法详解
2015/04/30 Python
Python实现模拟登录及表单提交的方法
2015/07/25 Python
Python实现统计代码行的方法分析
2017/07/12 Python
Python网络编程详解
2017/10/31 Python
浅谈Python反射 &amp; 单例模式
2019/03/21 Python
基于python3实现倒叙字符串
2020/02/18 Python
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2014/01/19 面试题
党员承诺书怎么写
2014/05/20 职场文书
保护水资源的标语
2014/06/17 职场文书
明确岗位职责
2015/02/14 职场文书
党支部综合考察意见
2015/06/01 职场文书
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers
Python爬虫 简单介绍一下Xpath及使用
2022/04/26 Python