`
hn67
  • 浏览: 78623 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

file_get_contents 函数添加超时设置

    博客分类:
  • PHP
阅读更多

在PHP实际开发中很多时候我们都会用到 file_get_contents 这个 函数来获取远程页面返回的内容 ,但是如果远程响应时间很慢的话 ,file_get_contents() 就会一直卡在那儿,不会超时,这时候我们有时候会发现Web服务的 Linux 服务器,突然系统负载上升,使用 top 命令查看,很多 php-cgi 进程 CPU 使用率接近100%。

 

我们知道,在 php.ini 中,有一个参数 max_execution_time 可以设置 PHP 脚本的最大执行时间,但是,在 php-cgi(php-fpm) 中,该参数不会起效。真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf 配置文件中的以下参数:

The timeout (in seconds) for serving a single request after which the worker process will be terminated
Should be used when 'max_execution_time' ini option does not stop script execution for some reason
'0s' means 'off'
<value name="request_terminate_timeout">0s</value>

 

 默认值为 0 秒,也就是说,PHP 脚本会一直执行下去。这样,当所有的 php-cgi 进程都卡在 file_get_contents() 函数时,这台  WebServer 已经无法再处理新的 PHP 请求了修改该参数,设置一个 PHP 脚本最大执行时间是必要的,但是,治标不治本。例如改成 <value name="request_terminate_timeout">30s</value>,如果发生 file_get_contents() 获取网页内容较慢的情况,这就意味着 150 个 php-cgi 进程,每秒钟只能处理 5 个请求,WebServer 同样很难避免“502 Bad Gateway”。

  要做到彻底解决,只能让 PHP 程序员们改掉直接使用 file_get_contents("http://example.com/") 的习惯,而是稍微修改一下,加个超时时间,用以下方式来实现 HTTP GET 请求。要是觉得麻烦,可以自行将以下代码封装成一个函数。

<?php
$ctx = stream_context_create(array(
   'http' => array(
       'timeout' => 1 //设置一个超时时间,单位为秒
       )
   )
);
file_get_contents("http://example.com/", 0, $ctx);
?>
 

遇到问题的童鞋们 你们可以去试试。。。

分享到:
评论

相关推荐

    PHP file_get_contents 函数超时的几种解决方法

    这里就简单介绍两种: 一、增加超时的时间限制 这里需要注意:set_time_limit只是设置你的PHP程序的超时时间,而不是file_get_contents函数读取URL的超时时间。 我一开始以为set_time_limit也能影响到file_get_...

    PHP file_get_contents设置超时处理方法

    file_get_contents的超时处理 话说,从PHP5开始,file_get_content已经支持context了(手册上写着:5.0.0 Added the context support. ),也就是说,从5.0开始,file_get_contents其实也可以POST数据。 今天说的这...

    PHP file_get_contents函数读取远程数据超时的解决方法

    在网络状况比较差的情况下file_get_contents函数经常读取远程数据失败。 解决办法如下: 复制代码 代码如下: /*设置超时配合失败之后尝试多次读取,效果比原先好很多*/ $url = ‘https://www.jb51.net’;  $opts = ...

    深入php函数file_get_contents超时处理的方法详解

    增加超时的时间限制 这里需要注意:set_time_limit只是设置你的PHP程序的超时时间,而不是file_get_contents函数读取URL的超时时间。真正的修改 file_get_contents延时可以用resource $context的timeout参数: 复制...

    比file_get_contents稳定的curl_get_contents分享

    分享一个实际在用的函数: 复制代码 代码如下: /*比file_get_contents稳定的多!$timeout为超时时间,单位是秒,默认为1s。*/ function curl_get_contents($url,$timeout=1) { $curlHandle = curl_init(); curl_...

    PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析

    函数,来获取一个 URL 的返回内容,但是,如果 http://example.com/ 这个网站响应缓慢,file_get_contents&#40;&#41; 就会一直卡在那儿,不会超时。 我们知道,在 php.ini 中,有一个参数 max_execution_time 可以...

    PHP中file_get_contents高級用法实例

    注意:set_time_limit只是设定你的PHP程式的超时时间,而不是file_get_contents函数读取URL的超时时间。 我一开始以为set_time_limit也能影响到file_get_contents,后来经测试是无效的。真正的修改file_g

    探讨file_get_contents与curl效率及稳定性的分析

    做过好多抓取别家网站内容的产品,习惯了使用方便快捷的file_get_contents函数,但是总是会遇到获取失败的问题,尽管按照手册中的例子设置了超时,可多数时候不会奏效:复制代码 代码如下:$config[‘context’] = ...

    PHP stream_context_create()函数的使用示例

    ,file_get_contents&#40;&#41;等过程的超时设置、代理服务器、请求方式、头信息设置的特殊过程。 比如说,上篇php教程中gd库实现下载网页所有图片中,第10行: 利用了stream_context_create()设置代理服务器: 复制...

    PHP请求远程地址设置超时时间的解决方法

    php请求远程地址设置超时时间,主要讲解file_get_contents、fopen、curl这三个简单常用函数设置超时时间的方法,一般情况下建议使用curl,性能最好,效率也最高。 1、file_get_contents 请求超时设置 $timeout = ...

    php下载文件超时时间的设置方法

    可以使用curl自己实现一个curl_file_get_contents函数 //CURLOPT_FOLLOWLOCATION TRUE 时将会根据服务器返回 HTTP 头中的 "Location: " 重定向。(注意:这是递归的,"Location: " 发送几次就重定向几次,除非设置...

    php curl登陆qq后获取用户信息时证书错误

    今晚开放ecmall商城的QQ登陆功能,在回调时产生错误,file_get_contents函数执行时,没有抓取到正确的信息,于是改用curl,但是提示证书错误。 在网上找到了解决方法,就是去掉证书认证。 复制代码 代码如下: curl_...

    PHP stream_context_create()作用和用法分析

    ,file_get_contents&#40;&#41;等过程的超时设置、代理服务器、请求方式、头信息设置的特殊过程。 函数原型:resource stream_context_create ([ array $options [, array $params ]] ) 用法 例子一: 复制代码 代码...

    GTK+2.0 中文版(基于GNOME官方文档翻译)

    _get_type() 函数 _class_init() 函数 _init() 函数 其余的... 从头创建构件 介绍 在屏幕上显示构件 表盘构件的原形 主体 gtk_dial_realize() 大小磋商 gtk_dial_expose() 事件处理 可能...

Global site tag (gtag.js) - Google Analytics