PHP CLI继续每2秒检查一次MYSQL数据库,直到用户决定退出



我在互联网上找不到太多关于PHP CLI的信息,所以我很难弄清楚如何完成我的代码。

基本上,应用程序应该继续每2秒检查一次MYSQL数据库而不退出,除非用户输入了字母"q"。

在实现MYSQL之前,我只是不断地打印单词"pro",所以我的代码看起来像这样:

<?php
    fwrite(STDOUT, "This should print word 'pro' continuouslyn");
    fwrite(STDOUT, "tto exit, simply press 'q' and entern");
    do {
        fwrite(STDOUT, "pron");
    }while (fgetc(STDIN) != 'q');
?>

几乎当用户输入"q"时,应用程序就会终止,但问题是它只打印出一次"pro",当我按下回车键时。

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 startedn";
  do {
    // Do actual work here
    echo "I'm polling the databasen";
    // 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 somethingn";
      $char = fread(STDIN, 1);
      if ($char == 'q') {
        // The user pressed 'q'
        echo "You told me to quitn";
        break;
      } else {
        echo "I don't understand '$char'n";
      }
    }
  } while (TRUE); // Loop forever
  // Do shutdown work here
  echo "I'm shutting downn";

请注意,由于这些事情的工作方式的性质,您可能不得不要求用户按q + enter,而不仅仅是q——我真的不明白为什么会这样,也许其他人可以在这里提供缺失的部分?

您可以使用pcntl_signal()为SIGQUIT(即Ctrl-C)注册一个处理程序,而不是在按下Q时停止

最新更新