使用set_time_limit

时间:2015-12-04 08:42:34

标签: php exec infinite-loop

我可以停止

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文件(我也想运行不会无限运行的不同类)

3 个答案:

答案 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;