【问题标题】:Is it possible to cancel execution of a loop once started by some external event一旦由某些外部事件启动,是否可以取消执行循环
【发布时间】:2015-01-30 10:15:00
【问题描述】:

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

【问题讨论】:

标签: php mysql ajax


【解决方案1】:

您可以像这样创建脚本:

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

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

在您的脚本中使用循环检查来自存储的 var

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

【讨论】:

  • 感谢 Animir 提供示例提示
【解决方案2】:

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

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

  1. ignore_user_abort 函数,虽然它不是 100% 可靠的

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多