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 相关文章推荐
基于mysql的bbs设计(一)
Oct 09 PHP
PHP 批量删除数据的方法分析
Oct 30 PHP
php代码中使用换行及(\n或\r\n和br)的应用
Feb 02 PHP
基于php 随机数的深入理解
Jun 05 PHP
PHP判断变量是否为0的方法
Feb 08 PHP
php多文件上传实现代码
Feb 20 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
Win7下手动安装apache2.2、php5.4笔记
Apr 03 PHP
微信access_token的获取开发示例
Apr 16 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
May 12 PHP
利用php + Laravel如何实现部署自动化详解
Oct 11 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
Apr 13 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
收音机的保养
2021/03/01 无线电
php读取数据库信息的几种方法
2008/05/24 PHP
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
PHP之COOKIE支持详解
2010/09/20 PHP
PHP中获取变量的变量名的一段代码的bug分析
2011/07/07 PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
PHP之uniqid()函数用法
2014/11/03 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
关于PHP内置的字符串处理函数详解
2017/02/04 PHP
项目实践之javascript技巧
2007/12/06 Javascript
使用jquery解析XML的方法
2014/09/05 Javascript
使用VS开发 Node.js指南
2015/01/06 Javascript
直接拿来用的15个jQuery代码片段
2015/09/23 Javascript
Javascript 字符串模板的简单实现
2016/02/13 Javascript
JS控制弹出悬浮窗口(一览画面)的实例代码
2016/05/30 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
浅谈Vue数据响应
2018/11/05 Javascript
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
layer.alert回调函数执行关闭弹窗的实例
2019/09/11 Javascript
JS简单表单验证功能完整示例
2020/01/26 Javascript
用Python登录Gmail并发送Gmail邮件的教程
2015/04/17 Python
详谈python中冒号与逗号的区别
2018/04/18 Python
python3.6编写的单元测试示例
2019/08/17 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
python利用faker库批量生成测试数据
2020/10/15 Python
python selenium 获取接口数据的实现
2020/12/07 Python
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
2014/04/16 HTML / CSS
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
啤酒销售实习自我鉴定
2013/09/24 职场文书
致铅球运动员加油稿
2014/02/13 职场文书
英文求职信范文
2014/05/23 职场文书
工厂采购员岗位职责
2015/04/07 职场文书
班级管理经验交流材料
2015/11/02 职场文书
《帝国时代4》赛季预告 新增内容编译器可创造地图
2022/04/03 其他游戏