1

main.phptest.phpがあります。

  1. test.phpはmain.phpで実行する必要があります
  2. 両方のスクリプトを無限に実行する必要があります。
  3. main.phpは、 test.phpが実行されているかどうかを定期的にチェックし、実行されていない場合 (エラーが発生した場合) に再度実行する必要があります。
  4. エラーログも必要です。
  5. main.phpが受信した場合、それはtest.php'test stop'に送信'close'され、test.phpは停止する必要があります (実行後に注文 (など) をmain.phpに送信する方法がわかりませんか?)'test stop'

私はこのサンプルを持っています:

main.php :

     <?php

function execute(){
    $desc = array(
        0 => array('pipe', 'r'), 
        1 => array('pipe', 'w'),
        2 => array('file', 'log.txt', 'a') 
    );
    $cmd = "start /b C:\wamp\bin\php\php5.4.3\php.exe test.php";
    $p = proc_open($cmd, $desc, $pipes);
    $res[0] = $p;
    $res[1] = $pipes;
    return $res;
}
$res = execute();

while(1) {

    $status = proc_get_status($res[0]);
    if (!$status['running']) {
        $res = execute();
    }

    if ( trim(fgets(STDIN)) == 'stop test' ) {
      fwrite($res[1][0], 'close');

      fclose($res[1][0]);
      fclose($res[1][1]);
      fclose($res[1][2]);
      proc_close($res[0]);
      break;
    }

}
?>

test.php :

<?php

while (1) {

     // ---------
     // other commands
     // ---------
     // ---------


$status = trim(fgets(STDIN));

if ($status == 'close') exit();

}
?>

これは私のコードの要約でしたが、正しく動作しません。

たとえば、スクリプトがtest.php$status = trim(fgets(STDIN));のこの行に到着すると、入力があるまで待機し、入力を送信しない場合、スクリプトは停止し、残りのコードを実行しませんが、スクリプトをループで実行し、main.phpまで注文を実行します。彼に入力を渡します。

私は窓に取り組んでいます。

4

1 に答える 1

0

PHP は、あなたが達成しようとしていることに最適なツールではないと思います。C や Visual Basic などでプログラムを作成してみませんか?

ただし、PHP でも解決可能です。独自のエラー処理関数を作成し、set_error_handler('my_custom_error_function')関数を介して test.php に割り当てることをお勧めします。

my_custom_error_function() では、エラーを記録して test.php を再起動できます。ログ ファイルに行を 追加するには、file_put_contents('.\error.log', $error_string, FILE_APPEND) を使用します。

fgets() は、開いているファイル ハンドルを想定しています。そのため、ルーチンを確認する (または追加のコードを提供する) ことをお勧めします。file_get_contents() も調べてください。

于 2013-07-29T12:38:18.233 に答える