我正在使用一个与服务器建立远程连接的类。我遇到的一个问题是,如果连接没有得到响应,它会等到它发生。
此类没有内置超时,我不想修改它,如果我可以避免它。
有什么办法可以用这样的方式包装一段代码吗?
try(timeout seconds){
}catch(){
//exception handle
}timeout(){
// timeout handline
}
编辑:我使用远程连接作为一个问题。我还需要解决其他问题,例如使用exec或其他类似的东西进行系统调用。
答案 0 :(得分:2)
不仅仅是代码的一部分。
然而,根据要求,有一些替代解决方案,无需修改原始代码:
set_time_limit()
如果运行的时间太长,将中止整个脚本。您仍然可以设置shutdown function。
pcntl_alarm()
会在给定的时间后向您发送一个信号,这可能会中止当时该类正在执行的阻塞系统调用,这可能会让您要求该类在其提供的操作中止这样的方法。但是,这可能不适合在Web服务器环境中使用。
如果类正在使用流函数,则可以设置默认超时:
ini_set('default_socket_timeout', 5);
stream_context_set_default(array(
'http' => array(
'timeout' => 5,
),
));
您可以使用pcntl_fork()
进行分叉,但这不适用于服务器环境。
您还可以使用proc_open
或popen
在单独的进程中执行PHP脚本,如果它运行的时间太长,则将其终止。 (生成该进程后,使用stream_select
对进程'stdout流进行空闲等待。)
或者设置服务器来处理这些任务。