2

実行中のスクリプトの現在の実行タイミングを検出できるかどうか疑問に思っていたので、ネットワーク上のいくつかのコンピューターに 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);
}

後でこれは統計を表示するために使用されます..問題は、マネージャーのコンピューターがpingコマンドを発行するときにオンまたはオフなどの両方の電源状態の影響を受けるため、ハングすることです..メソッドを使用して現在実行中の関数をキャプチャしmicrotime();、しきい値を超えた場合は次の要素に移動します。これを PHP のコアに留めておきたいのですが、そのような解決策が AJAX または別の言語を介してのみ実行できる場合は、外部メソッドを統合しても問題ないかどうか開発者に相談する必要があります。

4

2 に答える 2

1

このpingコマンドを使用すると、あきらめるまでの待機時間を指定できます。

ping -c 5 -t 1 127.0.0.2

これは、送信された ping の数に関係なく、1 秒後に返されます。正確なコマンド ライン引数は、プラットフォームによって異なります。

または、 を使用できる場合は、 ;pcntlを調べてください。キャッチできる一定の時間が経過すると、アプリケーションにシグナルpcntl_alarm()が配信されます。SIGALRM

最後に、私はこれを自分でテストしていませんが、パイプの 1 つを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 に答える