我目前正在开发一个 PHP UI,它收集信息、解析信息、将其发送到另一个程序、收集输出并将其呈现给用户。
通常它工作得很好。但是,有时,另一个程序可能需要很长时间才能完成(大约 2 到 15 个小时,我让它运行一夜,然后在早上完成)。我想实现一个允许用户取消程序的 KILL 按钮,因为它不仅需要永远完成,而且会占用服务器并阻止用户在此期间做任何其他事情。
它当前的设置方式是这样的:page1.php 收集所有用户输入。page2.php 检查用户输入。如果它不好,它会打印错误。如果输入是好的,它会解析它并通过系统调用将其发送到另一个程序。发生这种情况时,屏幕上会出现一个“正在计算...”的 gif。程序完成后,输出将显示在页面上。
理想情况下,我希望终止按钮与计算 gif 同时(并且仅同时)出现,并且我希望它能够终止进程(并让输出反映进程是被杀)。
到目前为止,我已经能够让按钮在我想要的时间和地点出现。但是,我无法获得我正在寻找的实际杀死功能。目前我已经设置了它,以便使用带有在单击时执行的 javascript 函数的 html 按钮制作按钮。该javascript函数包含带有系统调用的php代码,该系统调用可以找到目标进程并杀死它们(我知道系统调用可以正常工作,因为我可以在终端窗口中使用它并且它工作得很好)。
以下是相关代码:
startload("calculating");
$opt->run_optimization($output);
stopload("calculating");
这会弹出计算 gif 和终止按钮,然后运行一个进行系统调用的函数,然后删除计算 gif 和终止按钮。
system("./optimi/optimi < $infile > $outfile");
这是对另一个程序 (optimi) 的系统调用。
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;
这是我的杀戮按钮,现在似乎什么也没做。
我应该指出,重写 optimi 程序是我想不惜一切代价避免的事情,考虑到我不是编写它的人,也没有使用过编写它的编程语言。
谢谢。