我有一个脚本来刮一页。脚本运行时,需要3个小时才能完成。 我想在按下它时构建一个按钮,脚本必须停止运行。
有人有想法吗?
答案 0 :(得分:1)
正在运行的脚本是网页吗?
基本上你可以用停止按钮做的就是向网络服务器发送另一个请求(只是停止加载网页不会停止在服务器上运行的请求)。这个其他请求(由另一个PHP线程/进程处理)需要让第一个进程知道它需要停止。进程间(/线程)通信的一种简单方法是让第二个脚本在/ tmp /目录中创建一个文件,并让第一个进程不时地查找该文件。如果第一个进程看到该文件存在,则应该中止处理并删除该文件。为了更健壮,它还应该在启动时删除文件(如果存在)。注意:查看文件是否存在(在linux中)非常快。它不会击中硬盘(因为它将被缓存)。在你真正开始每秒1000次以上之前,你甚至都不会注意到额外的延迟。
显然,这只有在第二个进程在PHP中循环时才有效。如果第二个进程执行一个需要3个小时的SQL查询,则它不能每秒查找一次该文件。在这种情况下,您需要对信号执行某些操作,终止第一个过程,请参阅http://php.net/manual/en/function.posix-kill.php。
答案 1 :(得分:0)
您无法阻止PHP脚本运行。您可以停止客户端的浏览器等待响应,但PHP / Apache进程仍将在后台运行,直到它完成或遇到错误。
如果您只想停止浏览器,那么Sandeep Bansal的答案应该可以解决问题。
答案 2 :(得分:0)
可以通过ajax完成。 将此代码放到html头:
<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'></script>
<script language='javascript' type='text/JavaScript'>
{
function stop_script() {
$.post('stopScript.php');
}
}
</script>
并将按钮添加到您的html正文
<button onclick="stop_script()">Stop</button>
这是您的stopScript.php
<?php
session_start();
$_SESSION["stop_flag"] = "true";
?>
并检查您的php脚本循环中的会话
session_start();
if(isset($_SESSION["stop_flag"]) && $_SESSION["stop_flag"] == "true")exit(0);
或者您可以使用mysql数据表代替会话。我使用了数据表,它对我来说很好用。
答案 3 :(得分:-1)
<input type="button" value="Stop" onclick="window.stop()">
使用Window.stop,它将停止处理页面