详解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初学者头痛的十四个问题
Jul 12 PHP
利用js调用后台php进行数据处理原码
Oct 09 PHP
PHP中redis的用法深入解析
Feb 20 PHP
ThinkPHP分页类使用详解
Mar 05 PHP
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
Dec 05 PHP
Web程序工作原理详解
Dec 25 PHP
php读取csv文件并输出的方法
Mar 14 PHP
smarty学习笔记之常见代码段用法总结
Mar 19 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
Mar 12 PHP
PHP使用SMTP邮件服务器发送邮件示例
Aug 28 PHP
PHP封装的简单连接MongoDB类示例
Feb 13 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
Nov 21 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
杏林同学录(九)
2006/10/09 PHP
PHP $_FILES函数详解
2011/03/09 PHP
php自定义的格式化时间示例代码
2013/12/05 PHP
php缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
2016/01/11 PHP
PHP观察者模式原理与简单实现方法示例
2017/08/25 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
php实现的数组转xml案例分析
2019/09/28 PHP
Avengerls vs Newbee BO3 第一场2.18
2021/03/10 DOTA
Javascript中的相等与不等运算
2010/04/25 Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
2013/12/04 Javascript
jQuery多级弹出菜单插件ZoneMenu
2014/12/18 Javascript
jquery动态添加删除(tr/td)
2015/02/09 Javascript
js实现鼠标经过时图片滚动停止的方法
2015/02/16 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
聊聊JavaScript如何实现继承及特点
2017/04/07 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
网页中的图片查看器viewjs使用方法
2017/07/11 Javascript
jQuery实现的简单无刷新评论功能示例
2017/11/08 jQuery
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
es6 for循环中let和var区别详解
2020/01/12 Javascript
JavaScript实现下拉列表
2021/01/20 Javascript
pygame学习笔记(3):运动速率、时间、事件、文字
2015/04/15 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
Python os模块常用方法和属性总结
2020/02/20 Python
html5 canvas实现跟随鼠标旋转的箭头
2016/03/11 HTML / CSS
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
通信专业个人自我鉴定
2013/10/21 职场文书
20岁生日感言
2014/01/13 职场文书
三下乡活动方案
2014/01/31 职场文书
《陶罐和铁罐》教学反思
2014/02/19 职场文书
数学备课组工作总结
2015/08/12 职场文书
Python基础知识学习之类的继承
2021/05/31 Python
GO中sync包自由控制并发示例详解
2022/08/05 Golang