如果执行时间过长,则捕获执行时间并移至下一个元素

时间:2013-05-16 23:40:01

标签: php

我只是想知道是否可以检测正在运行的脚本的当前执行时间,我正在创建一个应用程序来ping网络上的某些计算机。由于这是从Linux机器完成的,因此ping操作系统与Windows不同。

在linux机器上,如果计算机处于关闭状态,那么服务器将在发出ping命令后挂起主消息,而不再有输出..只会挂起(根据我的linux ping经验)

所以我有这个脚本:

$Computer_Array = array( 
  "Managers" => "192.168.0.5",
  "Domain Controller" => "192.168.0.1"
  "Proxy Controller" => "192.168.0.214"
);
foreach ($Computer_Array AS $Addresses){ 
  exec('ping'.$Addresses, $Output);
}

稍后将用于显示统计信息。现在问题是,因为管理员计算机在发布时受到 on off 这两种电源条件的影响ping命令,只是挂起..所以我想知道是否有一种方法来捕获当前执行函数的microtime();,如果它超过阈值,则转到下一个元素。我宁愿将其保留给核心PHP,但如果这样的解决方案只能通过AJAX或其他语言来完成,那么如果可以集成外部方法,我将不得不咨询开发人员。

2 个答案:

答案 0 :(得分:1)

ping命令允许您指定在放弃之前等待的时间:

ping -c 5 -t 1 127.0.0.2

这将在一秒后返回,无论已发送多少ping。确切的命令行参数因平台而异。

或者,如果您可以使用pcntl,请查看pcntl_alarm();在经过一段时间后,它会向您的应用程序发出SIGALRM信号。

最后,我自己没有对此进行测试,您可以尝试使用proc_open()并在其中一个管道上使用stream_select();如果在一段时间后管道上什么也没发生,那么你可以杀掉这个过程。

答案 1 :(得分:0)

如果您想使用PHP执行此操作,或遇到类似问题,请使用php execute a background process中的代码

进行示例

PHP脚本需要对输出文件具有写权限。从ping到另一个PHP脚本,这个概念基本上适用于任何事情。

function isRunning($pid){
    try{
        $result = shell_exec(sprintf("ps %d", $pid));
        if( count(preg_split("/\n/", $result)) > 2){
            return true;
        }
    }catch(Exception $e){}

    return false;
}

$cmd = "ping 127.0.0.1";
$outputfile = "output";
$pidfile = "pid";

$start = microtime(true);

// Don't last longer than 10 seconds
$threshold = 2;

// Ping and get pid
exec(sprintf("%s > %s 2>&1 & echo $! > %s", $cmd, $outputfile, $pidfile));
$pid = `tail -n 1 $pidfile`;

// Let the process run until you want to stop it
while (isRunning($pid)){

    // Check output here...

    if ((microtime(true)-$start) > $threshold){
        $o = `kill $pid`;
        die("Timed out.");
    }
}


$end = microtime(true);
$time = $end - $start;

echo "Finished in $time seconds\n";