设置和背景
我正在编写一个脚本,需要以/usr/bin/php-cgi
而不是/usr/local/bin/php
运行,并且我遇到了检查stdin
的问题。
如果我使用/usr/local/bin/php
作为解释器,我可以进行以下操作:
if defined('STDIN'){ ... }
使用php-cgi似乎不起作用 - 似乎始终为未定义。我查看了php-cgi的手册页面,但没有发现有用的信息。此外,如果我理解正确,STDIN
常量是php://stdin
的文件句柄。我在某个地方读到过这个常量在php-cgi
中不应该被使用。
要求
- 必须使用shebang
#!/usr/bin/php-cgi -q
- 脚本有时会接收参数
- 脚本有时会通过
STDIN
接收输入
当前脚本
#!/usr/bin/php-cgi -q
<?php
$stdin = '';
$fh = fopen('php://stdin', 'r');
if($fh)
{
while ($line = fgets( $fh )) {
$stdin .= $line;
}
fclose($fh);
}
echo $stdin;
问题行为
这个工作还不错:
$ echo hello | ./myscript.php
hello
这个东西就是卡住了:
./myscript.php
这些方法对我不起作用:
- 检查
defined('STDIN')
// 总是返回false - 查看是否定义了
CONTENT_LENGTH
- 检查变量和常量
我已经将此内容添加到脚本中并以两种方式运行:
print_r(get_defined_constants());
print_r($GLOBALS);
print_r($_COOKIE);
print_r($_ENV);
print_r($_FILES);
print_r($_GET);
print_r($_POST);
print_r($_REQUEST);
print_r($_SERVER);
echo shell_exec('printenv');
我比较了输出结果,结果相同。
我不知道其他检查并通过 php-cgi
获取 stdin
的方法,而不会在不存在时锁定脚本。
/usr/bin/php-cgi -v
输出:PHP 5.4.17 (cgi-fcgi)