输出问题proc_open()
问题描述:
我有一个小的PHP编写的CLI脚本,它可以作为Linux的基于CLI的calc
的前端工作。脚本从用户获取数学表达式并将它们传递给calc
。然后,当用户想要退出时,他只需输入stop
。在这种情况下,脚本将exit
发送到calc
。这个脚本的问题是它只在用户发送stop
时才显示输出。但我需要输出每个用户的数学表达式。下面的脚本是:输出问题proc_open()
<?php
define('BUFSIZ', 1024);
define('EXIT_CMD', 'stop');
function printOutput(&$fd) {
while (!feof($fd)) {
echo fgets($fd, BUFSIZ);
}
}
function &getDescriptorSpec()
{
$spec = array(
0 => array("pty"), // stdin
1 => array("pty"), // stdout
2 => array("pty") // stderr
);
return $spec;
}
function readInputLine(&$fd)
{
echo "Enter your input\n";
$line = trim(fgets($fd));
return $line;
}
function sendCmd(&$fd, $cmd)
{
fwrite($fd, "${cmd}\n");
}
function main() {
$spec = getDescriptorSpec();
$process = proc_open("calc", $spec, $pipes);
if (is_resource($process)) {
$procstdin = &$pipes[0];
$procstdout = &$pipes[1];
$fp = fopen('php://stdin', 'r');
while (TRUE) {
$line = readInputLine($fp);
if (0 === strcmp($line, EXIT_CMD)) {
break;
}
sendCmd($procstdin, $line);
}
sendCmd($procstdin, "exit");
fclose($procstdin);
printOutput($procstdout);
fclose($procstdout);
$retval = proc_close($process);
echo "retval = $retval\n";
fclose($fp);
}
}
main();
答
当使用PHP的CLI版本,输出仍然是缓冲 - 这样一个页面发送给用户的正常时间是在脚本的结尾。
与任何版本的PHP一样 - 使用flush()
将强制将输出发送给用户。您也应该使用PHP_EOL
,它为您的任何平台(linux和Windows使用不同的字符 - \ r \ n或\ n)输出正确的新行。 PHP_EOL
是创建新行的安全方式。
尝试使用'flush()'作为输出最有可能被缓冲。 –
是的,'flush()'+一些代码修改做到了!你知道我在哪里可以发布修改后的代码,现在可以工作吗? –