我目前正在我的 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();
方法,问题是虽然这个方法会终止整个 session 而不是那个方法,这就是为什么这不能解决问题.
最佳答案
将我的评论“移植”到一个答案:
This other question非常相似。
PHP 在其默认实现中在单个线程中运行脚本,因此不可能从脚本本身取消代码执行。
只有非常非常少数 PHP 函数支持异步操作,例如您可以使用 mysqlnd
运行异步查询,但是此特定功能是 mysql 驱动程序的一部分,而不是 PHP。
有一些扩展将 多线程 引入 PHP,即 pthread .
要推荐另一个来源,请阅读 this answer由扩展的作者。
不幸的是,对于“主流”项目(应该在尽可能通用的设置上尽可能好地运行),使用 pthreads
是行不通的。
该扩展不太可能安装在任何共享的网站空间上。
此外,请记住,线程安全编程(或脚本对于那些关心的人)是一项严肃的任务,您必须关心它。这意味着准备您的线程代码,以免相互锁定(死锁)、破坏彼此的数据等。
可以找到有关线程安全 术语的详细答案 here .
彻底考虑所涉及的工作、搞砸的风险以及使用线程的 yield 。
确保您的愿望真的足够重要,足以引入复杂的线程。
关于php - 当执行时间超过指定的时间限制时,是否可以终止代码部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22424571/