今天说的这篇是讲超时的,确实在跨服务器提交的时候,不可避免的会遇到超时的情况,
这个时候怎么办?
set_time_limit 是没有用的,只有用 context 中的 timeout 时间来控制
file_get_contents
的超时处理
话说,从
PHP5 开始,file_get_content 已经支持 context 了(手册上写着:5.0.0 Added the
context support. ),也就是说,从 5.0 开始,
file_get_contents
其实也可以
POST 数据。
今天说的这篇是讲超时的,确实在跨服务器提交的时候,不可避免的会遇到超时的情况,
这个时候怎么办?
set_time_limit 是没有用的,只有用 context 中的 timeout 时间来控制。相反,
我们不是要抑止,而是要管理。比如在超时返回错误后,进行一次尝试,就象
js 中的
settimeout 那样,对函数重新处理。错误超过 3 次或者 5 次后,我们就确实的认为无法连接
服务器而彻底放弃。这,是一个好办法,应该值得推荐使用。其实。不全是
file_get_contents
,只要支持
context 的都应该加上,避免超时浪费时间。这样可以被支持的
函数大致有:
fsocketopen(该函数的最后一个参数。好象比较推荐在读 stream 的时候,使用
stream_time_out 函数进行控制),
fopen
(也是从
PHP5 开始加入 context 支持),file(PHP5 加
入支持
),curl(curl 有自已的变量 CURLOPT_TIMEOUT)等 。
在使用
file_get_contents
函数的时候,经常会出现超时的情况,在这里要通过查看一下错误
提示,看看是哪种错误,比较常见的是读取超
时,这种情况大家可以通过一些方法来尽量
的避免或者解决。这里就简单介绍两种:
一、增加超时的时间限制
这里需要注意:
set_time_limit 只是设置你的 PHP 程序的超时时间,而不是
file_get_contents
函数读取
URL 的超时时 间。
我一开始以为
set_time_limit 也能影响到
file_get_contents
,后来经测试,是无效的。真正的
修改
file_get_contents
延时可以用
resource
$context
的
timeout 参数:
复制代码
代码如下:
$opts
=
array
(
'http'=>
array
(
'method'=>"GET",
'timeout'=>1,
//单位秒
)
);
$cnt
=0;
while
(
$cnt
<3 && (
$bb
=
file_get_contents
("http://php.yl1001.com", false,
stream_context_create(
$opts
)))===FALSE)
$cnt
++;
echo
$cnt
;
echo
$bb
;
二、一次有延时的话那就多试几次
有时候失败是因为网络等因素造成,没有解决办法,但是可以修改程序,失败时重试几次,
仍然失败就放弃,因为
file_get_contents
()如果失 败将返回 FALSE,所以可以下面这样编写
代码:
复制代码
代码如下:
$cnt
=0;
while
(
$cnt
<3 && (
$bb
=
file_get_contents
("http://php.yl1001.com", false,