我可以让一段代码超时吗?

时间:2011-08-15 15:43:37

标签: php multithreading timeout remote-connection

我正在使用一个与服务器建立远程连接的类。我遇到的一个问题是,如果连接没有得到响应,它会等到它发生。

此类没有内置超时,我不想修改它,如果我可以避免它

有什么办法可以用这样的方式包装一段代码吗?

try(timeout seconds){
}catch(){
    //exception handle
}timeout(){
    // timeout handline
}

编辑:我使用远程连接作为一个问题。我还需要解决其他问题,例如使用exec或其他类似的东西进行系统调用。

1 个答案:

答案 0 :(得分:2)

不仅仅是代码的一部分。

然而,根据要求,有一些替代解决方案,无需修改原始代码:

参数或者set_time_limit

set_time_limit()如果运行的时间太长,将中止整个脚本。您仍然可以设置shutdown function

pcntl_alarm

pcntl_alarm()会在给定的时间后向您发送一个信号,这可能会中止当时该类正在执行的阻塞系统调用,这可能会让您要求该类在其提供的操作中止这样的方法。但是,这可能不适合在Web服务器环境中使用。

默认超时

如果类正在使用流函数,则可以设置默认超时:

ini_set('default_socket_timeout', 5);
stream_context_set_default(array(
    'http' => array(
        'timeout' => 5, 
    ),
));

在单独的流程中执行

您可以使用pcntl_fork()进行分叉,但这不适用于服务器环境。

您还可以使用proc_openpopen在单独的进程中执行PHP脚本,如果它运行的时间太长,则将其终止。 (生成该进程后,使用stream_select对进程'stdout流进行空闲等待。)

或者设置服务器来处理这些任务。