【发布时间】:2013-08-10 20:51:52
【问题描述】:
设置和背景
我正在处理需要以/usr/bin/php-cgi 而不是/usr/local/bin/php 运行的脚本,但我无法检查stdin
如果我使用 /usr/local/bin/php 作为解释器,我可以做类似的事情
if defined('STDIN'){ ... }
这似乎不适用于 php-cgi - 看起来总是未定义。我检查了man page for 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)
【问题讨论】: