我可以停止
exec("Ping www.google.com");
使用" ini_set(' max_execution_time',5)"或" set_time_limit(5)" 但不是
exec("java myclass"); //infinite Loop class
为什么呢?以及如何阻止exec()?
让我们说我要运行的java类包含:
for(int A = 0; A == 0;)
{
System.out.println(A + " ");
}
如何使用PHP阻止它们?
注意:我无法编辑java文件(我也想运行不会无限运行的不同类)
答案 0 :(得分:0)
您可以尝试创建一个exec.php
文件,将代码放在
<?php
ini_set('max_execution_time', 5)
exec("java myclass");
?>
您需要执行exec("PATH/exec.php")
而不是exec("java myclass")
;
答案 1 :(得分:0)
正如documentation所解释的那样,这只是不可移植的:
set_time_limit()函数和配置指令 max_execution_time仅影响脚本的执行时间 本身。在执行之外发生的活动所花费的任何时间 使用system(),流操作等系统调用的脚本 确定最大值时,不包括数据库查询等 脚本运行的时间。这在Windows上不正确 测量时间是真实的。
然而在实践中我发现Windows不一定以这种方式工作。因此,我认为这是不可能的,而不是非便携式。
您必须使用更高级的Process Control Extensions,通常类似于PCNTL。
答案 2 :(得分:0)
您可以使用proc_函数来获得更好的控制。您可以在manual中找到它。 您可以在下面找到有用的代码。它只能在windows下工作,你需要在linux上使用不同的kill例程。该脚本在大约5秒钟后终止(其他无限运行)ping过程。
<?php
function kill($pid){
return stripos(php_uname('s'), 'win')>-1 ? exec("taskkill /F /T /PID $pid") : exec("kill -9 $pid");
}
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("file", "tmp/error-output.txt", "a+") // stderr is a file to write to
);
$process = proc_open("Ping www.google.com -t",$descriptorspec,$pipes);
$terminate_after = 5; // seconds after process is terminated
usleep($terminate_after*1000000); // wait for 5 seconds
// terminate the process
$pstatus = proc_get_status($process);
$PID = $pstatus['pid'];
kill($PID); // instead of proc_terminate($resource);
fclose($pipes[0]);
fclose($pipes[1]);
proc_close($process);
$time = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];
echo 'Process terminated after: '.$time;