在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);
?>
遇到问题的童鞋们 你们可以去试试。。。
分享到:
相关推荐
本文将详细讲解两种解决`file_get_contents`函数超时的方法。 ### 方法一:增加超时时间限制 首先,我们要明确一点:`set_time_limit` 函数仅用于设置整个PHP脚本的执行时间限制,并不能直接影响`file_get_...
在PHP中,set_time_limit函数是用来设置脚本执行的最大时间,然而,这个函数并不适用于file_get_contents函数的超时控制。file_get_contents函数读取URL超时是由其他机制控制的。 从PHP 5.0版本开始,file_get_...
总的来说,解决`file_get_contents` 读取远程数据超时的问题,主要通过设置超时时间和采用重试机制,以及在处理大文件时选择更合适的读取方法。理解这些技巧将有助于编写更健壮和高效的PHP代码。
为了更有效地解决这个问题,开发人员应当修改使用`file_get_contents()`的方式,添加超时设置。通过创建一个流上下文(stream context),可以为HTTP请求设置特定的超时时间,如下所示: ```php $ctx = stream_...
本文将深入讲解如何对 `file_get_contents()` 函数进行超时处理。 首先,我们要理解 `set_time_limit()` 函数的作用。它主要用于设置当前PHP脚本运行的最大时间(以秒为单位),但这个限制并不直接影响 `file_get_...
例如,如果我们想从文件 "2.sql" 中的第 1MB 处开始读取,且只想读取接下来的 1024 字节,我们可以这样使用 file_get_contents 函数: ```php $content = file_get_contents("2.sql", FALSE, NULL, 1024 * 1024, ...
此外,对于超时问题,`file_get_contents` 有一个名为`ini_set('default_socket_timeout', $seconds)` 的设置,可以用来调整超时时间,而cURL则直接通过`CURLOPT_CONNECTTIMEOUT` 进行控制。如果遇到`file_get_...
如果服务器没有安装`curl`库,而`file_get_contents`又无法满足需求,可以考虑使用`stream_context_create`创建自定义的HTTP上下文,通过设置超时时间来优化`file_get_contents`的性能。 在选择`curl`还是`file_get...
本篇文章将深入探讨导致 `file_get_contents` 函数抓取内容失败的几个主要原因,并提供相应的解决策略。 首先,最常见的原因是服务器配置问题。PHP的`allow_url_fopen` 设置默认在某些服务器上可能是关闭的。`allow...
当需要编写兼容 `file_get_contents` 和 `curl` 的通用函数时,可以使用 `function_exists()` 来判断哪个函数可用。示例中的 `vita_get_url_content()` 函数就是这样实现的,先尝试使用 `file_get_contents`,如果...
在PHP编程中,`file_get_contents` 是一个非常实用的函数,可以用来读取本地或远程文件内容。然而,当尝试使用 `file_get_contents` 函数读取HTTPS(安全的HTTP)连接时,可能会遇到一些问题。这主要是由于PHP默认...
在PHP编程中,`file_get_contents` 是一个非常实用的函数,用于从本地或远程位置读取文件内容。然而,当尝试获取的远程页面已经经过gzip压缩时,可能会遇到返回内容显示为乱码的问题。这是因为`file_get_contents`...
上述内容提到的代码例子主要演示了如何使用file_get_contents()函数来向指定URL发送POST请求并提交数据。下面将详细解释代码中的各个部分以及相关的知识点。 首先,定义要提交的数据,这里使用了一个关联数组$data...
不过,`file_get_contents` 不支持所有协议,且不提供一些高级特性,如自定义头信息、POST 数据或超时控制。当需要更复杂的网络操作时,`file_get_contents` 可能不够用。 3. **Socket** Socket 提供了底层网络...
首先,file_get_contents函数有一个超时参数,这个参数可以控制函数在执行过程中等待多久。在默认情况下,如果服务器没有响应,file_get_contents可能永远等待下去。这在某些情况下可能会导致程序挂起,特别是当网络...