PHP与AJAX - 继续处理发送响应用户
问题描述:
我必须做很多处理的服务器结束后,但不希望用户能够意识到这一点。我想立即向用户发送响应,然后在服务器端运行该进程。PHP与AJAX - 继续处理发送响应用户
我做了一些研究,到目前为止,我已经做到了这一点:
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
}
据我所知,这应该立即返回用户反应,然后运行后的进程。但它不起作用:它仍然在等待所有的过程完成。
Bytheway,我发送一个AJAX请求,如果它有帮助。起初我认为这可能是会话锁定问题,但现在我甚至没有使用任何会话(session_status()
返回1
)。
PHP版本是7.1
注:我读过,其中上面的方法能正常工作等相关问题,但由于某种原因,它不是在我的情况下工作。
答
它看起来像(如@ADyson中的评论称)冲洗输出似乎不工作,AJAX。所以,解决这个问题的唯一办法是使用Cron Job。为此,我使用PHP Cron Scheduler。但是可以直接使用crontab将Cron作业添加到列表中。
我加入了后期处理到另一个PHP文件用合适的变化,以便它可以从脚本执行相同的任务,并添加文件到调度。
该解决方案似乎是一个真正的痛苦,但没有解决比使用定时任务等这个问题。
更好的设计是将这种脱机数据处理转移到另一个处理,例如,由cron作业定期触发的脚本。例如,面向用户的脚本只会将任务的细节和任何必要的数据写入数据库表中,并且cron作业脚本会在表中查找新任务,并使用所提供的信息运行它们。这样在UI上就没有依赖关系了。 – ADyson
@ADyson感谢您的信息。上面的函数应该可以工作。但是由于使用Cron Job需要对数据库进行一些重大修改(这对我来说是一个痛苦,因为我正在免费进行此项目),所以我会等待一个解决方案。但如果我没有得到解决办法,我将别无选择,只能忍受痛苦。 –
据我所知输出刷新不适用于ajax。您设置用于处理响应的回调只有在看到响应完成时才会运行。每次获得部分响应时都不能重复运行(即使已发送要发送的所有输出,也不要忘记,直到PHP脚本完成后才会向客户端发送最终响应) - 你必须以不同的方式编写回调代码以应对这种情况,而且我从来没有见过这样的事情的实现。 – ADyson