2

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

在 linux 机器上,如果计算机处于关闭状态,则服务器将在发出 ping 命令后挂起主要消息,并且没有更多输出..只会挂起(以我的 linux pinging 经验)

所以我有这个脚本:

$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);
}

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

4

2 回答 2

1

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

ping -c 5 -t 1 127.0.0.2

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

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

最后,我自己没有测试过,您可以尝试在其中一个管道上使用proc_open()和使用;stream_select()如果一段时间后管道上没有发生任何事情,则可以终止该过程。

于 2013-05-17T00:21:23.723 回答
0

如果您想使用 PHP 执行此操作,或遇到类似问题,这里有一个使用php 代码执行后台进程的示例

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";
于 2013-05-17T00:20:16.977 回答