【发布时间】:2014-04-20 21:35:20
【问题描述】:
我目前正在我的 CMS 应用程序中处理计划任务(如 cronjobs)系统。我想知道当一段代码的执行时间超过指定的时间限制时是否有可能终止它。
一些计划任务可能很繁重,一个任务可能会陷入无限循环,以保持简短;任务可能占用大量时间的原因有很多。与此有关的少数问题之一是该任务会占用比实际需要更多的资源,这会降低运行它的服务器的性能,这会使 CMS 和它自身的站点不那么可靠。
将系统想象如下:一旦触发了计划任务管理器,它将执行在该时间安排的所有任务。想象一个简单的 for 循环,它会一个接一个地同步执行每个任务。想想下面这个简单的例子:
// This array would contain an array with all scheduled tasks that should be executed.
$tasks = Array();
// Loop through each task
foreach($tasks as $t) {
// Execute the task
$t->execute();
}
现在,$task->execute(); 方法让 PHP 的解释器等待,直到任务的代码被执行。我的问题是,如果执行时间超过指定时间,是否有任何可能的方法来终止在 execute(); 方法后面运行的代码。
例如,如果提供了 10 秒的时间限制,并且任务执行其代码的时间超过 30 秒,则任务的运行代码应在 10 秒后终止,以允许任务调度程序继续执行下一个任务。
可以使用一个简单的 if 语句在每个计划任务的代码中实现此功能,该语句会在每次执行部分代码时检查时间。这样做的问题是,这需要在每个任务的代码中实现,因为该系统旨在供第 3 方开发人员使用这些类型的任务来正确使用他们的插件来实现这些任务。我不喜欢“强迫”所有使用这些任务的开发人员来实现这些功能。
我知道 PHP 提供的 set_time_limit(); 方法,但问题是虽然这个方法会终止整个会话而不是那个方法,这就是为什么这不能解决问题。
【问题讨论】:
-
与stackoverflow.com/questions/10587323/timeout-a-function-in-php 非常相似的问题。简而言之:默认情况下 PHP 是单线程的,因此您无法从脚本本身控制执行。但是,有一些非默认扩展,例如 pthread,它允许您生成一个工作线程并从您的主线程中再次杀死它。
-
非常感谢您的回答,以及与此问题相关的另一个问题的链接。这基本上意味着这是不可能的,主要是因为我不想使用一些扩展,因为系统应该能够在任何 Apache 服务器上运行而不会出现问题。不过,我会研究一下这个方法,因为我可能希望有选择地实现这个功能。再次感谢您的回答。您想将此作为答案发布,以便我接受吗?
标签: php timeout scheduled-tasks limit