PHP 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)等 。

一、增加超时的时间限制

这里需要注意: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://www.jb51.net", 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://www.jb51.net", false, stream_context_create($opts)))===FALSE) $cnt++;

以上方法对付超时已经OK了。那么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‘ => ‘[email protected]‘,
    ‘submit‘ => ‘submit‘,
);
echo Post ( ‘http://www.jb51.net‘, $data );  

OK , 上面函数完美了,既解决了超时控制又解决了Post传值。

时间: 2024-07-30 03:58:28

PHP file_get_contents设置超时处理方法的相关文章

Unix网络编程 高级IO套接字设置超时

我们知道,对于一个套接字的读写(read/write)操作默认是阻塞的,如果当前套接字还不可读/写,那么这个操作会一直阻塞下去,这样对于一个需要高性能的服务器来说,是不能接受的.所以,我们可以在进行读写操作的时候可以指定超时值,这样就读写操作就不至于一直阻塞下去. 在涉及套接字的I/O操作上设置超时的方法有三种: 1:调用alarm,它在指定的超时期满时产生SIGALRM信号.这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用. 2:在select中阻

给file_get_contents函数设置超时时间

$opts = array( 'http'=>array( 'method'=>"GET", 'timeout'=>60, ) ); $context = stream_context_create($opts); $html =file_get_contents('http://www.example.com', false, $context); 这样,file_get_contents获取数据时,超出60秒将会自动退出. 还可以利用file_get_conten

C# UdpClient 设置超时时间

/********************************************************************** * C# UdpClient 设置超时时间 * 说明: * 网络通信中设置超时时间是常有的时,记录UDP获取.发送超时设置方法. * * 2016-12-8 深圳 南山平山村 曾剑锋 *********************************************************************/ 一.参考文档: 1. Can

为Process.waitFor设置超时

Java中在使用Runtime.getRuntime().exec(command)调用系统命令后 一般会调用Process.waitFor()来等待命令执行结束 获取执行结果 今天一个悲剧的事实证明了 即使只是调用了很简单的脚本命令 在调用Process.waitFor()后同样可能发生无休止或者接近于无休止的阻塞 处理完故障之后痛定思痛 决定在代码中加入超时控制 但是Process.waitFor()本身并不支持超时时间设置 一个方法是改用非阻塞的Process.exitValue()方法

网络超时检测方法

超时检测的必要性:避免进程在没有数据时无限制地阻塞,当设定的时间到时,进程从原操作返回继续运行. 方法(1):使用setsockopt函数 时间结构体 struct timeval  tv; 可设定 tv.tv_sec = 5; // 设置5秒时间 tv.tv_usec = 0; 然后设置超时选项 setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); 注意:将进程中和sockfd相关的阻塞,变为非阻塞. 实例代码: serve

Axis2 客户端调用 设置超时时间

我用的是axis2-1.6.2版本.请看下面的客户端代码: import org.apache.axis2.client.Options; import com.ctis.ta.service.impl.OpenAccountForUnitServiceStub;import com.ctis.ta.service.impl.OpenAccountForUnitServiceStub.OpenAndCheck;import com.ctis.ta.service.impl.OpenAccount

如何给ExecutorService异步计算设置超时

ExecutorService接口使用submit方法会返回一个Future<V>对象,Future表示异步计算的结果.它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果.计算完成后只能使用get方法来获取结果,如有必要,计算完成前可以阻塞此方法.取消则由cancel方法来执行.还提供了其他方法,以确定任务是正常完成还是被取消了.一旦计算完成,就不能再取消计算.如果为了可取消性而使用Future但又不提供可用的结果,则可以声明Future<?>形式类型.并返回nul

apache httpclient4 设置超时时间

旧的方法(已被禁用) CloseableHttpClient httpclient = HttpClients.createDefault(); httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,5000); httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,5000); 新的方法 HttpPost httpp

IOS AFNetWorking 设置超时时间

(原创经验总结) 1.关于AF 超时的说法 系统默认的timeInterval  是60s  ASI默认是10s 但是有一个说法是 AF “AFN在GET条件下设置的NSURLRequest能起作用,但在POST条件下不启用(原因是apple内部机制,固定为240s)” 这个说法比较老了 最新的也没什么去更正到底咋回事 经过测试 IOS5是240s的说法  IOS8不是 完全是自定义的 根据stack flow的意思说 分界线在ios6 结论:ios>=ios6.0?自定义:240s 2.以下有