我在互联网上找不到太多关于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时停止