background image

今天说的这篇是讲超时的,确实在跨服务器提交的时候,不可避免的会遇到超时的情况,
这个时候怎么办?

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,