3

PHP CLI に関するインターネット上の情報はあまり多くないため、コードを完成させる方法を理解するのに苦労しています。

基本的に、ユーザーが文字「q」を入力しない限り、アプリケーションは終了せずに 2 秒ごとに MYSQL データベースをチェックし続ける必要があります。

MYSQL を実装する前に、「pro」という単語を継続的に出力することから始めたので、コードは次のようになりました。

<?php
    fwrite(STDOUT, "This should print word 'pro' continuously\n");
    fwrite(STDOUT, "\tto exit, simply press 'q' and enter\n");

    do {
        fwrite(STDOUT, "pro\n");
    }while (fgetc(STDIN) != 'q');
?>

ユーザーが「q」を入力すると、アプリは終了しますが、問題は「pro」を一度だけ出力し、Enter キーを押したときだけです。

4

2 に答える 2

2

fgetc()読み取るデータがあるまでブロックします。つまり、スクリプトがfgetc()呼び出しに到達すると、ユーザーが何かを入力するまで実行が停止します。

これを回避するには、 を使用して読み取るデータがあるかどうかを確認する必要がありますstream_select()stream_select()を使用して、MySQL ポーリングを 2 秒ごとに制限することもできます。基本的なフレームワークは次のようになります。

<?php

  // Do all your init work here, connect to DB etc
  $tickerSecs = 2;
  echo "Hello! I've started\n";

  do {

    // Do actual work here
    echo "I'm polling the database\n";

    // See stream_select() docs for an explanation of why this is necessary
    $r = array(STDIN);
    $w = $e = NULL;
    if (stream_select($r, $w, $e, $tickerSecs) > 0) {
      // The user input something
      echo "You input something\n";
      $char = fread(STDIN, 1);
      if ($char == 'q') {
        // The user pressed 'q'
        echo "You told me to quit\n";
        break;
      } else {
        echo "I don't understand '$char'\n";
      }
    }

  } while (TRUE); // Loop forever

  // Do shutdown work here
  echo "I'm shutting down\n";

q + enterこれらが機能する方法の性質のためだけでなく、ユーザーに押すように要求する必要がある可能性が高いことに注意してくださいq-そして、これがなぜなのかよくわかりません。おそらく他の誰かがここに欠けている部分を提供できますか?

于 2012-08-02T11:09:40.647 に答える
0

Q が押されたときに停止するのではなく、pcntl_signal() を使用して SIGQUIT (つまり Ctrl-C) のハンドラーを登録できます。

于 2012-08-02T11:59:49.047 に答える