【问题标题】:Can I make a section of code time out?我可以让一段代码超时吗?
【发布时间】:2011-10-27 09:13:06
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你能改为异步调用吗?
  • @nico 你将如何在 PHP 中做到这一点?没有多线程,不能保证 pcntl_fork() 可用,并且许多资源类型不支持非阻塞模式......如果你只知道使用 PHP 核心的方法,我非常希望听到它(我没有意味着这个评论像它所做的那样讽刺......)
  • Ben,类中连接远程服务器的底层函数是什么? socket扩展中的所有connect函数都有超时参数,fsockopen()也一样,后续操作可以使用stream_set_timeout()配合流资源或者socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,$timeout)配合sockets扩展...
  • 在服务器上可能有一个单独的脚本专门用于处理远程连接 - 要建立连接,您需要向另一个脚本发送请求(请求超时)。如果远程连接脚本在超时之前未能完成,原始脚本可以检测到它并继续前进。
  • @DaveRandom:我显然是在说异步调用客户端。

标签: php multithreading timeout remote-connection


【解决方案1】:

不仅仅是代码的一部分。

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

设置时间限制

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() fork,但这不适合服务器环境。

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

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

【讨论】:

  • proc_open 进程如何计时?
  • 在进程的标准输出流上使用stream_select()popen() 也可以达到同样的效果。
猜你喜欢
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 2021-07-30
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多