proc_open() 的输出问题
output problems with proc_open()
我有一个 PHP 编写的小 CLI 脚本,它作为来自 Linux 的基于 CLI 的 calc
的前端。该脚本从用户那里获取数学表达式并将它们传递给 calc
。然后,当用户想要退出时,他只需输入 stop
。在这种情况下,脚本将 exit
发送到 calc
。此脚本的问题在于它仅在用户发送 stop
时才在最后显示输出。但是我需要有每个用户的数学表达式的输出。脚本如下:
<?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
是创建新行的安全方法。
我有一个 PHP 编写的小 CLI 脚本,它作为来自 Linux 的基于 CLI 的 calc
的前端。该脚本从用户那里获取数学表达式并将它们传递给 calc
。然后,当用户想要退出时,他只需输入 stop
。在这种情况下,脚本将 exit
发送到 calc
。此脚本的问题在于它仅在用户发送 stop
时才在最后显示输出。但是我需要有每个用户的数学表达式的输出。脚本如下:
<?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
是创建新行的安全方法。