【问题标题】:PHP with AJAX - Continue Processing After Sending Response to the User带有 AJAX 的 PHP - 向用户发送响应后继续处理
【发布时间】:2018-02-22 08:48:09
【问题描述】:

我必须在服务器端做很多处理,但不想让用户知道。我想立即向用户发送响应,然后在服务器端运行该进程。

我做了一些研究,到目前为止我已经做到了:

function process(){
    ignore_user_abort(true);
    set_time_limit(0);

    ob_start();
    // Send response to the user
    header('Connection: close');
    header('Content-Length: '.ob_get_length());
    ob_end_flush();
    ob_flush();
    flush();

    // Post process

}

据我所知,这应该立即返回用户响应,然后运行发布流程。但它不起作用:它仍然等到所有过程完成。

顺便说一句,如果有帮助,我将发送一个 AJAX 请求。起初我认为这可能是会话锁定的问题,但现在我什至没有使用任何会话(session_status() 返回1)。

PHP版本是7.1

注意:我已经阅读了其他相关问题,其中上述方法可以正常工作,但由于某种原因它不适用于我的情况。

【问题讨论】:

  • 更好的设计是将这种离线数据处理交给另一个进程,例如由 cron 作业定期触发的脚本。例如,您的面向用户的脚本只需将任务的详细信息和任何必要的数据写入数据库表,而 cron 作业脚本将在表中查找新任务,并使用提供的信息运行它们。这样就完全不依赖 UI。
  • @ADyson 感谢您的信息。上述功能应该可以工作。但是由于使用 Cron Job 需要对数据库进行一些重大修改(这对我来说很痛苦,因为我正在免费做这个项目),我会等待解决方案。但如果我得不到解决方案,我将不得不忍受痛苦。
  • 据我所知,输出刷新不适用于 ajax。您为处理响应设置的回调将仅在它看到响应完成时运行。它不能在每次获得部分响应时重复运行(即使您已经发送了要发送的所有输出,也不要忘记,直到 PHP 脚本完成它不会向客户端发送最终响应) - 你必须以完全不同的方式编写回调代码来应对这种情况,而且我从未见过这样的实现。
  • 无论如何,从长远来看,重新设计使用后台调度批处理器也可能是有益的,特别是如果你让它有点通用并可能在其他项目中重用,或者在这个如果您有其他任务需要以相同的方式运行,则项目。如果您四处搜索,甚至可能有这样的东西作为免费模块提供 - 这是一个相当普遍的要求。
  • @ADyson,你是对的。 This answer 似乎提出了一种解决方法,但它对我没有多大帮助。我认为最好的替代方法是使用您之前建议的 Cron Job。

标签: php ajax http process response


【解决方案1】:

看起来(正如@ADyson 在评论中所说)刷新输出似乎不适用于 AJAX。因此,解决问题的唯一方法是使用 Cron Job。为此,我使用了PHP Cron Scheduler。但是 crontab 可以直接用于将 Cron Job 添加到列表中。

我将后期处理添加到另一个 PHP 文件并进行了适当的更改,以便它可以从脚本执行相同的任务并将文件添加到调度程序。

这个解决方案可能看起来很痛苦,但除了使用 Cron Job 之外,没有其他解决方案。

【讨论】:

    猜你喜欢
    • 2010-12-01
    • 2011-04-19
    • 1970-01-01
    • 2012-04-24
    • 2021-10-11
    • 2022-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多