Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP与AJAX-在向用户发送响应后继续处理_Php_Ajax_Http_Process_Response - Fatal编程技术网

PHP与AJAX-在向用户发送响应后继续处理

PHP与AJAX-在向用户发送响应后继续处理,php,ajax,http,process,response,Php,Ajax,Http,Process,Response,我必须在服务器端进行大量处理,但不希望用户知道这一点。我希望立即向用户发送响应,然后在服务器端运行该进程 我做了一些研究,到目前为止,我做了以下工作: function process(){ ignore_user_abort(true); set_time_limit(0); ob_start(); // Send response to the user header('Connection: close'); header('Content

我必须在服务器端进行大量处理,但不希望用户知道这一点。我希望立即向用户发送响应,然后在服务器端运行该进程

我做了一些研究,到目前为止,我做了以下工作:

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

}
据我所知,这应该立即返回用户响应,然后运行post进程。但它不起作用:它仍然要等到所有的过程都完成

顺便说一下,如果有帮助的话,我会发送一个AJAX请求。起初我认为会话锁定可能有问题,但现在我甚至没有使用任何会话(
session\u status()
返回
1

PHP版本是7.1

注意:我读过其他相关的问题,上面的方法工作得很好,但由于某种原因,它在我的案例中不起作用。

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

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

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

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

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


此解决方案似乎是一个真正的难题,但除了使用Cron作业之外,没有解决此问题的方法。

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