详解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 相关文章推荐
xml+php动态载入与分页
Oct 09 PHP
关于PHP堆栈与列队的学习
Jun 21 PHP
解析Extjs与php数据交互(增删查改)
Jun 25 PHP
zend framework文件上传功能实例代码
Dec 25 PHP
php输入流php://input使用示例(php发送图片流到服务器)
Dec 25 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
Dec 24 PHP
php foreach如何跳出两层循环(详解)
Nov 05 PHP
PHP Mysqli 常用代码集合
Nov 12 PHP
Yii 2.0自带的验证码使用经验分享
Jun 19 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
PHP设计模式之简单工厂和工厂模式实例分析
Mar 25 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
Sep 29 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
PHP中,文件上传
2006/12/06 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
2017/10/19 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
2018/10/17 PHP
Flash对联广告的关闭按钮讨论
2007/01/30 Javascript
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
JavaScript 特殊字符
2007/04/05 Javascript
jQuery 注意事项 与原因分析
2009/04/24 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
简单方法判断JavaScript对象为null或者属性为空
2014/09/26 Javascript
jquery实现全选、反选、获得所有选中的checkbox
2020/09/13 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
2017/07/24 Javascript
React进阶学习之组件的解耦之道
2017/08/07 Javascript
解决axios发送post请求返回400状态码的问题
2018/08/11 Javascript
详解Vue底部导航栏组件
2019/05/02 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
[00:53]TI3正赛第三天 DK怒破A队不败金身 现场国旗飘扬热血激昂
2013/08/10 DOTA
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
2017/07/28 Python
python 3.7.0 安装配置方法图文教程
2018/08/27 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
pandas 空的dataframe 插入列名的示例
2018/10/30 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
pycharm 使用anaconda为默认环境的操作
2021/02/05 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
2021/03/03 Python
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
文员自我评价怎么写
2013/09/19 职场文书
高中自我鉴定
2013/12/20 职场文书
宿舍违规检讨书
2014/01/12 职场文书
中学生自我评价范文
2014/02/08 职场文书
大四学生个人总结
2015/02/15 职场文书
匿名信格式范文
2015/05/27 职场文书
Vue3中toRef与toRefs的区别
2022/03/24 Vue.js