我只是想知道是否可以检测正在运行的脚本的当前执行时间,我正在创建一个应用程序来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或其他语言来完成,那么如果可以集成外部方法,我将不得不咨询开发人员。
答案 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";