实施';杀死';HTML/PHP中的按钮

实施';杀死';HTML/PHP中的按钮,php,javascript,html,Php,Javascript,Html,我目前正在开发一个PHP UI,它收集信息,解析信息,发送给另一个程序,收集输出并将其呈现给用户 正常情况下,它工作得很好。但有时,另一个程序可能需要很长时间才能完成(大约2到15个小时,我让它运行了一夜,在早上就完成了)。我想实现一个KILL按钮,允许用户取消该程序,因为它不仅需要花费很长时间才能完成,而且会绑定服务器,同时阻止用户做任何其他事情 当前的设置方式如下所示: php收集所有用户输入。 php检查用户输入。 如果不好,它会打印错误。 如果输入是好的,它将解析它并通过系统调用将其发送

我目前正在开发一个PHP UI,它收集信息,解析信息,发送给另一个程序,收集输出并将其呈现给用户

正常情况下,它工作得很好。但有时,另一个程序可能需要很长时间才能完成(大约2到15个小时,我让它运行了一夜,在早上就完成了)。我想实现一个KILL按钮,允许用户取消该程序,因为它不仅需要花费很长时间才能完成,而且会绑定服务器,同时阻止用户做任何其他事情

当前的设置方式如下所示: php收集所有用户输入。 php检查用户输入。 如果不好,它会打印错误。 如果输入是好的,它将解析它并通过系统调用将其发送给另一个程序。当这种情况发生时,屏幕上会出现一个“计算…”gif。程序完成后,输出将显示在页面上

最佳情况下,我希望kill按钮与计算gif同时出现(且仅同时出现),并且我希望它能够终止进程(并使输出反映进程已终止的事实)

到目前为止,我已经能够让按钮在我喜欢的时间和地点出现。然而,我还没有能够得到我正在寻找的真正的杀戮功能。目前,我已经将其设置为使用html按钮创建按钮,该按钮带有一个javascript函数,可在单击时执行。javascript函数包含php代码和一个系统调用,该系统调用找到目标进程并杀死它们(我知道系统调用工作正常,因为我可以在终端窗口使用它,它工作得很好)

以下是相关代码:

startload("calculating");
$opt->run_optimization($output);
stopload("calculating");
这将打开计算gif和kill按钮,然后运行一个函数进行系统调用,然后删除计算gif和kill按钮

system("./optimi/optimi < $infile > $outfile");
系统(“/optimi/optimi<$infle>$outfile”);
这是对另一个程序(optimi)的系统调用


print您似乎不了解web服务器如何与浏览器交互

当您向运行php的web服务器发送请求时,web服务器将加载请求的文件,解释任何相关的php代码,然后向浏览器发送文本文件

如果文本文件中有javascript,浏览器将尝试解释/执行它。您不能将php代码放在javascript函数中,并期望在请求页面时,当用户执行某项操作时(页面上的所有php都只执行一次)执行php代码


如果要运行php代码以响应用户交互,则需要设置对相关php脚本的ajax请求。

您似乎不了解web服务器如何与浏览器交互

当您向运行php的web服务器发送请求时,web服务器将加载请求的文件,解释任何相关的php代码,然后向浏览器发送文本文件

如果文本文件中有javascript,浏览器将尝试解释/执行它。您不能将php代码放在javascript函数中,并期望在请求页面时,当用户执行某项操作时(页面上的所有php都只执行一次)执行php代码


如果要运行php代码以响应用户交互,则需要设置对相关php脚本的ajax请求。

我当时正忙于编写与此相同的回复,但这并不是问题的真正答案。即使您创建一个脚本来做您想要做的事情(这很重要,因为让您的apache用户能够将自己升级到root确实是一件非常危险的事情),我也不确定您是否会得到您想要的行为——即返回system()调用。如果这一切正常,那么您可以按照Sam的建议使用Ajax(可能嵌入到“计算”中)通过在其周围添加锚定标记来终止进程。因此我尝试了您的建议并创建了一个AJAX请求。但是,我的kill按钮仍然不起作用。问题似乎是,在程序完成之前,服务器不会响应用户的任何其他内容。即使他们尝试加载不同的页面,它仍然会挂起等待服务器。到目前为止,我是如何通过自己的终端发送kill命令的。我希望kill按钮可以代替我这样做,但它没有。有没有办法让程序以服务器不必等待的方式执行其他任何操作?@MattS-你可能需要separa然后将系统划分为3个脚本-一个带有“开始”按钮的通用UI页面,该按钮发送一个ajax请求以运行脚本,以及一个“终止”按钮,它向kill脚本发送一个ajax请求。@Sam Dufel这不是我现在设置的基本方式吗?我有一个收集输入的页面,有一个“开始”按钮。它加载第二个页面,显示“计算”,直到进程完成,还有一个按钮发送一个ajax请求来终止进程。我看到的唯一区别是我的想法和你的建议之间的区别是“提交”按钮不是ajax请求。没错。你需要让进程异步启动,这样你就不会在进程启动时就用kill按钮离开页面。我当时正忙着写与此相同的回复,然而,这并不是一个真正的问题回答这个问题。即使你创建了一个脚本来做你想做的事情(这很重要,因为让你的apache用户能够将自己升级到root确实是一件非常危险的事情),我也不确定你是否会得到你想要的行为——也就是让系统()调用return。如果这一切正常,那么您可以按照Sam的建议使用Ajax(可能嵌入到“计算”图像中,在图像周围添加终止进程的锚标记。因此,我尝试了您的建议并创建了一个Ajax请求。但是,我的kill按钮
    print <<< KILLBUTTON

<br/>
<button type="button" onclick="kill();">Kill</button>
<br/>

<script type="text/javascript">
function kill(){
    <?php
    system("ps -Af | grep optimi | grep -v grep | awk '{print $2}' | xargs sudo kill"); 
    ?>
}
</script>

KILLBUTTON;