在使用file_get_contents函数的时候,经常会出现超时的情况,在这里要通过查看一下错误提示,看看是哪种错误,比较常见的是读取超时,这种情况大家可以通过一些方法来尽量的避免或者解决。这里就简单介绍两种:
一、增加超时的时间限制
这里需要注意:set_time_limit只是设置 你的PHP程序的超时时间,而不是file_get_contents函数读取URL的超时时间。
我一开始以为set_time_limit也能影响到file_get_contents,后来经测试,是无效的。真正的修改file_get_contents延时可以用resource $context的timeout参数:
'http'=>array(
'method'=>"GET",
'timeout'=>60,
)
);
$context = stream_context_create($opts);
$html =file_get_contents('http://www.example.com', false, $context);
fpassthru($fp);
二、一次有延时的话那就多试几次
有时候失败是因为网络等因素造成,没有解决办法 ,但是可以修改程序,失败时重试几次,仍然失败就放弃,因为file_get_contents()如果失败将返回 FALSE,所以可以下面这样编写代码:
$cnt=0;
while($cnt < 3 && ($str=@file_get_contents('http...'))===FALSE) $cnt++;
以上方法对付超时已经OK了。
这里会出现一个潜在的错误:如果文件不存在的话,程序将进入死循环,因此,加入判断次数。假设只检查4次。
$i=0;
while(!$content or $i==4){
@$content =file_get_contents($url);
$i++;
}
if($i==4) exit("next");
4次之后还没取到,直接进入下一个函数吧!上面只是终止全部操作,这里的函数可以自行配置
那么Post呢?细心点有人发现了'method'=>"GET", 对!是不是能设置成post呢?百度找了下相关资料,还真可以!而且有人写出了山寨版的post传值函数,如下:
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.updateweb.cn', $data);
OK , 上面函数完美了,既解决了超时控制又解决了Post传值。再配合康盛的改良版RC4加密解密算法,做一个安全 性很高的webservice就简单多了。
相关推荐
首先,我们要明确一点:`set_time_limit` 函数仅用于设置整个PHP脚本的执行时间限制,并不能直接影响`file_get_contents`函数的超时设置。如果你发现`file_get_contents`在获取远程URL时超时,需要通过创建自定义的...
1. 增加超时的时间限制:通过设置context的timeout参数来延长超时时间。示例如下: ```php $opts = array( 'http' => array( 'method' => "GET", 'timeout' => 10, // 单位是秒 ) ); $cnt = 0; while($cnt ($...
总的来说,解决`file_get_contents` 读取远程数据超时的问题,主要通过设置超时时间和采用重试机制,以及在处理大文件时选择更合适的读取方法。理解这些技巧将有助于编写更健壮和高效的PHP代码。
如果遇到`file_get_contents`超时,可以尝试增加超时时间,或者使用cURL进行更精细的控制。 总之,当`file_get_contents`遇到获取不到网页内容的问题时,可以考虑使用cURL作为替代,利用其强大的功能和更好的错误...
它主要用于设置当前PHP脚本运行的最大时间(以秒为单位),但这个限制并不直接影响 `file_get_contents()` 的超时设置。`file_get_contents()` 的超时是由其内部使用的流上下文(stream context)控制的。 要修改 `...
这可以通过适当调整脚本执行时间限制来实现。 3. 在使用 fread 或 file_get_contents 时,如果有条件应当使用 offset 和 maxlen 参数来精确控制读取的范围,以减少内存的占用。 4. 如果使用内存映射文件技术,可以...
如果服务器没有安装`curl`库,而`file_get_contents`又无法满足需求,可以考虑使用`stream_context_create`创建自定义的HTTP上下文,通过设置超时时间来优化`file_get_contents`的性能。 在选择`curl`还是`file_get...
在描述的问题中,服务器的CPU负载增加,`php-cgi`进程的CPU使用率达到100%,通常是由`file_get_contents()`长时间等待远程响应而引起的。`file_get_contents()`函数在处理HTTP请求时,并不会受到`php.ini`配置文件中...
如果您无法修改服务器配置,或者上述方法不适用,您可以选择使用cURL库来代替 `file_get_contents`。cURL是一个强大的URL传输库,支持多种协议,包括HTTPS。下面是一个使用cURL的示例函数 `http_request`,它封装了...
在处理`file_get_contents`时,你可能会遇到其他问题,比如超时或者网络不稳定。可以使用`set_time_limit`和`ini_set('default_socket_timeout')`设置超时限制,或者通过`stream_context_create`创建自定义的流上...
7. **超时问题**:默认情况下,`file_get_contents` 的超时时间较短,如果目标服务器响应慢,可能导致请求超时。可以设置 `ini_set('default_socket_timeout', seconds)` 来增加超时时间。 综上所述,当遇到 `file_...
file_get_contents() 默认是通过GET方法获取数据,但通过适当配置,它也可以用来通过POST方法发送数据。 上述内容提到的代码例子主要演示了如何使用file_get_contents()函数来向指定URL发送POST请求并提交数据。...
提问我循环用file_get_contents抓取一堆url,但总是会在不到第100个URL的时候停下,提示我:“Warning: file_get_contents(URL) [function.file-get-contents]: failed to open stream: HTTP request failed...
不过,`file_get_contents` 不支持所有协议,且不提供一些高级特性,如自定义头信息、POST 数据或超时控制。当需要更复杂的网络操作时,`file_get_contents` 可能不够用。 3. **Socket** Socket 提供了底层网络...
针对 `file_get_contents()` 的超时问题,我们可以利用其第三个参数 `context` 来设置超时时间。例如: ```php $url = "http://zhoz.com/zhoz.php"; $ctx = stream_context_create(array( 'http' => array( 'time...
`curl_setopt()` 用来设置 `curl` 的各种选项,例如 `CURLOPT_URL` 设置目标URL,`CURLOPT_RETURNTRANSFER` 控制是否返回响应内容,`CURLOPT_CONNECTTIMEOUT` 设定连接超时时间。`curl_exec()` 执行 `curl` 会话并...