4

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

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

有什么方法可以将一段代码包装成这样的东西吗?

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

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

4

1 回答 1

2

不仅仅是代码的一部分。

但是,根据要求,有替代解决方案,无需修改原始代码:

设置时间限制

set_time_limit()如果运行时间过长,将中止整个脚本。您仍然可以设置关机功能

pcntl_alarm

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

默认超时

如果该类使用流函数,您可以设置默认超时:

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

在单独的进程中执行

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

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

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

于 2011-08-15T15:53:36.837 回答