详解PHP内置访问资源的超时时间 time_out file_get_contents read_file


Posted in PHP onJune 03, 2013

提问
我循环用file_get_contents抓取一堆url,但总是会在不到第100个URL的时候停下,提示我:“Warning: file_get_contents(URL) [function.file-get-
contents]: failed to open stream: HTTP request failed! HTTP/1.0 500 Read timed out
in D:\website\extra.php on line 65”
我在程序的开始已经有set_time_limit(0);了啊,那上面的错误会是因为什么呢?
回答
set_time_limit只是设置你的PHP程序的超时时间,而不是file_get_contents函数读取URL的超时时间。
从警告信息来看,是被抓取的网页出现了服务器500错误,可能是他的程序出现超时了。
如果想改变file_get_contents的超时时间,可以用resource $context的timeout参数:

$opts = array(
'http'=>array(
    'method'=>"GET",
    'timeout'=>60,
   )
);
$context = stream_context_create($opts);
$html =file_get_contents('http://www.example.com', false, $context);
fpassthru($fp);

这样readfile函数的超时时间就设置成了10秒,如果你够细心的话,还会发现数组中还有一些其他的配置,第一维中的http是指定使用的网络协议,二维中的method批的是http的请求方法get,post,head等,timeout就是超时时间了。我想很多人会使用php内置的file_get_contents函数来下载网页,因为这个函数使用起来够简单。很多人也都很简单的使用它,只要传递一个链接它就可以自动的发送get请求,并将网页内容下载下来。如果比较复杂的情况,比如使用POST请求,使用代理下载,定义User-Agent等等,这时很多人就会认为这个函数做不了这样的事情,就会选择其他方式,如curl,来实现。实际上,这些事情file_get_contents也可以做到,
就是通过它的第三个参数,设置http请求的context
支持的设置和使用方式见官方说明:http://www.php.net/manual/en/context.http.php
附:目前我知道的支持context参数的php内置函数有file_get_contents,file_put_contents,readfile,file,fopen,copy(估计这一类的函数都支持吧,待确认)。
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' => 'test@gmail.com',
'submit' => 'submit',
);
echo Post('http://www.yifu.info', $data);

OK , 上面函数完美了,既解决了超时控制又解决了Post传值。再配合康盛的改良版RC4加密解密算法,做一个安全性很高的webservice就简单多了。
PHP 相关文章推荐
PHP 设计模式之观察者模式介绍
Feb 22 PHP
PHP 中关于ord($str)>0x80的详细说明
Sep 23 PHP
header导出Excel应用示例
Jan 24 PHP
php读取mssql的ntext字段返回值为空的解决方法
Dec 30 PHP
PHP实现简单数字分页效果
Jul 26 PHP
thinkphp微信开发(消息加密解密)
Dec 02 PHP
PHP实现的多维数组排序算法分析
Feb 10 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
May 16 PHP
实例讲解php将字符串输出到HTML
Jan 27 PHP
laravel配置Redis多个库的实现方法
Apr 10 PHP
php输出控制函数和输出函数生成静态页面
Jun 27 PHP
php 中的信号处理操作实例详解
Mar 04 PHP
PHP CLI模式下的多进程应用分析
Jun 03 #PHP
基于php-fpm 参数的深入理解
Jun 03 #PHP
php-cli简介(不会Shell语言一样用Shell)
Jun 03 #PHP
基于在生产环境中使用php性能测试工具xhprof的详解
Jun 03 #PHP
php cli模式学习(PHP命令行模式)
Jun 03 #PHP
获取PHP警告错误信息的解决方法
Jun 03 #PHP
php cli 小技巧
Jun 03 #PHP
You might like
神族 Protoss 历史背景
2020/03/14 星际争霸
PHP 图片上传实现代码 带详细注释
2010/04/29 PHP
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
2011/11/02 PHP
浅析php中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
PHP实现百度人脸识别
2019/05/06 PHP
单击浏览器右上角的X关闭窗口弹出提示的小例子
2013/06/12 Javascript
js怎么判断flash swf文件是否加载完毕
2014/08/14 Javascript
JavaScript_object基础入门(必看篇)
2016/06/13 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
js实现登录框鼠标拖拽效果
2017/03/09 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
2017/07/18 jQuery
vue.js实现的绑定class操作示例
2018/07/06 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
2019/07/23 Javascript
JavaScript中的null和undefined用法解析
2019/09/30 Javascript
Python中的exec、eval使用实例
2014/09/23 Python
解析Python中的异常处理
2015/04/28 Python
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
python3.5使用tkinter制作记事本
2016/06/20 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
Python提取支付宝和微信支付二维码的示例代码
2019/02/15 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
创立科技Java面试题
2015/11/29 面试题
金融专业推荐信
2013/11/14 职场文书
求职简历中的自我评价分享
2013/12/08 职场文书
阳光体育活动方案
2014/02/16 职场文书
优秀管理者事迹材料
2014/05/22 职场文书
爱牙日活动总结
2014/08/29 职场文书
群众路线党员自我评议范文2014
2014/09/24 职场文书
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
教育见习报告范文
2014/11/03 职场文书
golang 实现对Map进行键值自定义排序
2021/04/28 Golang
MySQL表字段时间设置默认值
2021/05/13 MySQL
Java使用JMeter进行高并发测试
2021/11/23 Java/Android
Golang数据类型和相互转换
2022/04/12 Golang
springboot+rabbitmq实现智能家居实例详解
2022/07/23 Java/Android