是否可以在被某些外部事件启动后取消循环的执行


Is it possible to cancel execution of a loop once started by some external event

我正在使用php和mysql以及AJAX开发一个Web应用程序。在我的一个脚本中,有一个从 mysql 表中获取数据的规定。但是,如果我想在执行过程中取消我调用以获取数据的 php 脚本的执行怎么办?让我进一步澄清它。就像由于循环繁重而需要 30 分钟才能完成 AJAX 调用,并且我想通过单击某个按钮在完成之前退出该调用。我怎样才能实现这个目标。否则,我的脚本运行良好,只是如果我不想等待最终的 AJAX 响应文本并尝试切换到 Web 应用程序的其他页面,它会挂起。

您可以创建如下脚本:

$someStorage->set($sessionId . '_someFuncStop', true);

通过 AJAX 调用它,当按下按钮 STOP 时。

在带有循环的脚本中,检查存储中的变量

while(1) {
    if ($someStorage->get($sessionId . '_someFuncStop') === true ) break;
}

据我所知,PHP 不支持某种可能因外部原因中断运行脚本的事件侦听器。

您可能需要考虑 2 条路径(如果您不想在服务器上编写会终止执行脚本的系统进程的 shell 脚本):

  1. ignore_user_abort功能,它不是100%可靠的

http://php.net/manual/en/function.ignore-user-abort.php

  1. 您希望终止的循环中,创建一个数据库调用(或从文件中读取),您可以在其中设置某种标志,如果设置了该标志,则在脚本中运行 break/return/die 命令。然后,您提到的按钮可以写入数据库/文件并设置中断标志。(通常,这对于脚本中断并不真正有用,因为大多数脚本在数十毫秒内运行,并且标志设置得不够快,无法在数十分钟内终止脚本,但是,这是一个可行的解决方案。