[英]Terminate PHP script on server through AJAX call
我编写了一个PHP脚本来导入大量数据。 导入过程通过Ajax调用触发,并且ajax请求继续等待服务器响应。 因为我在专用服务器上工作所以没有超时问题。
问题是我们需要一个功能来终止导入过程。 例如客户端的停止按钮。 我们认为如果我们已经杀死了等待的ajax调用,那么服务器上的进程也将停止,因为没有请求服务 。 但不幸的是情况并非如此,当Ajax请求已经从客户端被杀死时,脚本继续在服务器端执行。
其次,我们在这个项目中使用PHP会话。 假设取消按钮需要对服务器上的另一个脚本进行Ajax调用以停止进程,那么如果已经有等待的ajax请求,该请求将如何到达服务器。 Php / Apache将保留第二个请求,直到第一个请求周期完成。
注意:根据我们的项目架构,我们需要在每个页面上使用session_start()。 如果有人能指导这些问题,那将是一件好事。
如何在PHP脚本上设置略高于AJAX超时的时间限制? 如果PHP脚本随着时间的推移运行,它应该会终止它。 与此类似的东西:
<?php
set_time_limit(20);
while ($i<=10)
{
echo "i=$i ";
sleep(100);
$i++;
}
?>
资料来源: http : //php.net/manual/en/function.set-time-limit.php
一旦脚本运行,它只能通过结束处理脚本的php进程来停止。 一种可能性是在调用另一个脚本时使用会话来存储“继续”条件。
例如:
脚本1是工人(进口商)
脚本2是ajax重复调用的函数,只要导入器可以工作。
脚本1和2共享让我们说$_SESSION['lastPing']
。
所以
脚本2设置$_SESSION['lastPing'] = time();
每次通话。
脚本1有一个条件if($_SESSION['lastPing'] - 30 > time()){ die(); }
if($_SESSION['lastPing'] - 30 > time()){ die(); }
您可以在运行脚本开始时将进程ID写入文件,数据库或缓存。 您可以使用http://php.net/manual/en/function.getmypid.php获取进程ID。 假设每个脚本都有自己的进程ID。
kill脚本(不使用锁定的会话)可以读取进程ID并尝试终止它。
您可以使用proc_
函数来处理此问题。 可能的步骤概述:
proc_open
运行导入脚本。 proc_terminate
并退出循环。 转到以下链接以获取问题的确切解决方案:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.