【发布时间】:2016-01-10 21:51:38
【问题描述】:
我在使用/dev/tty 作为文件时遇到了PHP (cli) 问题。实际情况稍微复杂一些,为了让问题简单,这里就不提了。
要从 STDIN 运行 PHP 代码,我可以运行如下命令,
$ php
<?php
echo "hello world\n";
?>
<CTRL-D>
hello world
$
但是,当运行/dev/tty 时,会发生以下情况,
$ php /dev/tty
<?php
echo "hello world\n";
?>
<CTRL-D>
?php
echo "hello world\n";
?>
$
注意:第一个字符< 只是丢失了,php 将输入作为纯文本处理。我们可以将测试简化为以下,
工作
$ php
abcd
abcd
$
不工作
$ php /dev/tty
abcd
bcd
$
我已经运行strace来检查php是否正确读取了输入,看起来是这样,如下图,
$ strace -o /tmp/1 php /dev/tty ; grep "bcd" /tmp/1
abcd
<CTRL-D>
bcd
read(4, "abcd\n", 4096) = 5
write(1, "bcd\n", 4) = 4
$
这看起来很简单,我觉得我在这里遗漏了一些非常基本的东西。
有谁知道为什么 PHP (cli) 从 /dev/tty 读取时会有这种行为?
附加信息:-
- PHP 版本:5.3.3 (cli) 和 5.5.20 (cli)
- 操作系统:Linux(CentOS 6.4 和 Fedora 19)
【问题讨论】:
-
它可能相关也可能不相关,但你能告诉使用你正在使用的 PHP 版本,以及有关操作系统的详细信息。
-
我用 php 5.6.10 尝试了上述方法,它表现出相同的行为 -
<被“吃掉”了。