简而言之,PHP 不是为此而构建的,但您可能会从这些扩展之一中获得一些帮助。我不确定它们有多彻底,但您可能真的想使用文本 UI 库。(实际上您可能不想为此使用 PHP。)
STDIN
综上所述,您需要逐个字符地获取非阻塞输入。不幸的是,从 PHP 的角度来看,大多数终端都是缓冲的,所以在按下 enter 之前你什么也得不到。
如果您stty -icanon
在终端上运行(或您的操作系统的等效程序)以禁用缓冲,那么以下短程序基本上可以工作:
<?php
stream_set_blocking(STDIN, false);
$line = '';
$time = microtime(true);
$prompt = '> ';
echo $prompt;
while (true)
{
if (microtime(true) - $time > 5)
{
echo "\nTick...\n$prompt$line";
$time = microtime(true);
}
$c = fgetc(STDIN);
if ($c !== false)
{
if ($c != "\n")
$line .= $c;
else
{
if ($line == 'exit' || $line == 'quit')
break;
else if ($line == 'help')
echo "Type exit\n";
else
echo "Unrecognized command.\n";
echo $prompt;
$line = '';
}
}
}
(它依赖于启用本地回显来在键入字符时打印字符。)
如您所见,我们只是永远循环。如果存在字符,请将其添加到$line
. 如果按下回车,则处理$line
。同时,我们每五秒打勾,只是为了表明我们在等待输入时可以做其他事情。(这将消耗最大的 CPU;你必须发出 asleep()
来解决这个问题。)
这本身并不是一个实际的例子,但也许会让你朝着正确的方向思考。