详解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下获取客户端ip地址的函数
Mar 15 PHP
JpGraph php柱状图使用介绍
Aug 23 PHP
提升PHP性能的21种方法介绍
Jun 25 PHP
php一次性删除前台checkbox多选内容的方法
Sep 22 PHP
使用php验证复选框有效性的示例
Nov 13 PHP
PHP动态生成javascript文件的2个例子
Apr 11 PHP
Laravel框架实现发送短信验证功能代码
Jun 06 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
Aug 01 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
Oct 19 PHP
通过源码解析Laravel的依赖注入
Jan 22 PHP
PHP中关于php.ini参数优化详解
Feb 28 PHP
php+laravel 扫码二维码签到功能
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
discuz免激活同步登入代码修改方法(discuz同步登录)
2013/12/24 PHP
php简单实现多字节字符串翻转的方法
2015/03/31 PHP
PHP7变量处理机制修改
2021/03/09 PHP
js 页面传参数时 参数值含特殊字符的问题
2009/12/13 Javascript
优化javascript的执行速度
2010/01/23 Javascript
jQuery点击tr实现checkbox选中的方法
2013/03/19 Javascript
jQuery中bind,live,delegate与one方法的用法及区别解析
2013/12/30 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
js 点击a标签 获取a的自定义属性方法
2016/11/21 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
2016/12/22 Javascript
vue使用自定义icon图标的方法
2018/05/14 Javascript
代码分析vue中如何配置less
2018/09/28 Javascript
node版本管理工具n包使用教程详解
2018/11/09 Javascript
微信小程序配置服务器提示验证token失败的解决方法
2019/04/03 Javascript
python读取excel表格生成erlang数据
2017/08/26 Python
Python中使用支持向量机SVM实践
2017/12/27 Python
python 多线程中子线程和主线程相互通信方法
2018/11/09 Python
python获取微信小程序手机号并绑定遇到的坑
2018/11/19 Python
django 自定义过滤器的实现
2019/02/26 Python
python3 sorted 如何实现自定义排序标准
2020/03/12 Python
使用Keras实现Tensor的相乘和相加代码
2020/06/18 Python
windows+vscode安装paddleOCR运行环境的步骤
2020/11/11 Python
Under Armour安德玛法国官网:美国高端运动科技品牌
2018/06/29 全球购物
英语国培研修感言
2014/02/13 职场文书
保护黄河倡议书
2014/05/16 职场文书
学校春季防火方案
2014/06/08 职场文书
人事专员岗位职责说明书
2014/07/30 职场文书
公司新人试用期自我评价
2014/09/17 职场文书
王兆力在市委党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
交通事故协议书范本
2014/11/18 职场文书
毕业生班级鉴定评语
2015/01/04 职场文书
欢迎词怎么写
2015/01/23 职场文书
2015年超市工作总结范文
2015/05/26 职场文书
MySql新手入门的基本操作汇总
2021/05/13 MySQL