我编写了一个PHP脚本来导入大量数据。导入过程通过Ajax调用触发,并且ajax请求继续等待服务器响应。当我在专用服务器上工作时,没有超时问题。
问题是我们需要一个功能来终止导入过程。例如客户端的停止按钮。 我们认为如果我们已经杀死了等待的ajax呼叫,那么服务器上的进程也将停止,因为没有请求服务。但不幸的是情况并非如此,脚本继续在服务器端执行,而Ajax请求已经从客户端被杀死。
其次,我们在这个项目中使用PHP会话。假设取消按钮需要对服务器上的另一个脚本进行Ajax调用以停止进程,那么如果已经有等待的ajax请求,该请求将如何到达服务器。 Php / Apache将保留第二个请求,直到第一个请求周期完成。
注意:根据我们的项目架构,我们需要在每个页面上使用session_start()。如果有人能指导这些问题,那将是件好事。
答案 0 :(得分:1)
在PHP中执行长时间运行的进程时要小心,因为PHP的zend引擎& GC不适合长时间运行的过程。
所以,我强烈建议使用像gearman这样的合适的职位经理。 gearman确实有php extensions。使用作业管理器可以让您完全控制每个过程。你可以开始/停止进程& TAKS。
另一个选择是使用队列(如amqp)来更清晰地处理这些任务。哪一个更适合您的用例,我会让您决定。
答案 1 :(得分:0)
如何在PHP脚本上设置略高于AJAX超时的时间限制?如果PHP脚本随着时间的推移运行,它应该会终止它。类似的东西:
<?php
set_time_limit(20);
while ($i<=10)
{
echo "i=$i ";
sleep(100);
$i++;
}
?>
答案 2 :(得分:0)
一旦脚本运行,它只能通过结束处理脚本的php进程来停止。一种可能性是在调用另一个脚本时使用会话来存储“继续”条件。
例如:
脚本1是工人(进口商)
脚本2是ajax重复调用的函数,只要导入器可以工作即可
脚本1和2分享让我们说$_SESSION['lastPing']
。
所以
脚本2在每次通话时设置$_SESSION['lastPing'] = time();
脚本1的条件为if($_SESSION['lastPing'] - 30 > time()){ die(); }
答案 3 :(得分:0)
您可以在运行脚本开始时将进程ID写入文件,数据库或缓存。您可以使用http://php.net/manual/en/function.getmypid.php获取进程ID。这假定每个脚本都有自己的进程ID。
kill脚本(不使用锁定的会话)可以读取该进程ID并尝试终止它。
答案 4 :(得分:0)
您可以使用proc_
functions处理此问题。可能的步骤概述:
proc_open
运行导入脚本
c)开始轮询循环,检查(2a)中的记录以查看该令牌仍处于处理状态。如果没有,请致电proc_terminate
并退出循环。答案 5 :(得分:0)
转到以下链接以获取问题的确切解决方案:
PHP auto-kill a script if the HTTP request is cancelled/closed