详解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 相关文章推荐
example1.php
Oct 09 PHP
IP138 IP地址查询小偷实现代码
Feb 15 PHP
Base64在线编码解码实现代码 演示与下载
Jan 08 PHP
用PHP实现小写金额转换大写金额的代码(精确到分)
Jan 10 PHP
解析用PHP实现var_export的详细介绍
Jun 20 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
Jul 15 PHP
php之readdir函数用法实例
Nov 13 PHP
php使用Imagick生成图片的方法
Jul 31 PHP
PHP中快速生成随机密码的几种方式
Apr 17 PHP
yii2.0整合阿里云oss的示例代码
Sep 19 PHP
Smarty模板语法详解
Jul 20 PHP
Yii框架安装简明教程
May 15 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 常用的header头部定义汇总
2015/06/19 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
封装了一个支持匿名函数的Javascript事件监听器
2014/06/05 Javascript
js的toLowerCase方法用法实例
2015/01/27 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
jQuery验证插件validate使用详解
2016/05/11 Javascript
实用jquery操作表单元素的简单代码
2016/07/04 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
2017/02/04 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
2017/05/03 Javascript
手把手教你搭建ES6的开发运行环境
2017/07/11 Javascript
使用JS动态显示文本
2017/09/09 Javascript
vue2.0+koa2+mongodb实现注册登录
2018/04/10 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
Nodejs使用Mongodb存储与提供后端CRD服务详解
2018/09/04 NodeJs
vue.js实现会动的简历(包含底部导航功能,编辑功能)
2019/04/08 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
Python中元组,列表,字典的区别
2017/05/21 Python
python存储16bit和32bit图像的实例
2018/12/05 Python
python自动化测试无法启动谷歌浏览器问题
2019/10/10 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
2020/02/07 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
新闻专业大学生找工作的自我评价
2013/10/30 职场文书
2014年医德医风工作总结
2014/11/13 职场文书
关于环保的广播稿
2015/12/17 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
Python实现生成bmp图像的方法
2021/06/13 Python
javascript的setTimeout()使用方法总结
2021/11/20 Javascript
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers