问题1
我以前在游戏服务器的PHP解析器文件中使用该行,但它不再起作用了。我知道有fopen("php://stdin")
的东西,但现在有3行代码而不是一行代码,为什么PHP会这样做呢?
问题2
此外,当我使用该方法时,我不断收到此输出,导致我的脚本无法读取解析器输出的命令,我该如何阻止它?
X-Powered-By: PHP/5.2.12
Content-type: text/html
我尝试将Content-Type设置为text / plain,但它没有做任何事情......
这是基本代码:
#!/usr/bin/php
<?php
while (1):
$line = rtrim(fgets(STDIN, 1024));
$line = explode(" ", $line);
switch ($line[0]):
// NEW_ROUND <date> <time>
// PLAYER_ENTERED <nice_name> <ip> <real_name>
case "PLAYER_ENTERED":
print "PLAYER_MESSAGE {$line[1]} WELCOME TO TRONNERS!\n";
break;
// PLAYER_LEFT <nice_name> <ip>
// RACE_DONE
case "RACE_DONE":
print "CONSOLE_MESSAGE RACING TIMEKEEPER COMING SOON!\n";
break;
// ROUND_COMMENCING <round> <max_rounds>
case "ROUND_COMMENCING":
print "CENTER_MESSAGE What's the name of this map?\n";
break;
endswitch;
endwhile;
?>
我正在使用尾部将行发布到文件进入PHP解析器,然后解析的输出通过tee发送到另一个命令文件。
答案 0 :(得分:2)
您正在使用命令行中的* -cgi二进制文件,我不建议这样做。如果可用,请使用CLI。查看/ usr / bin / php中符号链接的实际位置。
http://www.php.net/manual/en/features.commandline.io-streams.php
$ echo '<?php echo fread(STDIN,123); ?>' > r.php
$ echo 'bla' | php5-cgi -q -d html_errors=off r.php
Warning: fread() expects parameter 1 to be resource, string given in /tmp/r.php on line 1
Call Stack:
0.0002 330080 1. {main}() /tmp/r.php:0
0.0002 330260 2. fread() /tmp/r.php:1
$ echo 'bla' | php r.php
bla
在debian下,它可能由以下内容修复(不知道其他* nix风味):
update-alternatives --config php
从源代码构建本手册解释了会发生什么:http://nl.php.net/manual/en/features.commandline.introduction.php
答案 1 :(得分:0)
问题2由Ehsan回答,所以生病了,问题1。
刚看了一下Changlog for Fgets,自4.2以来没有变化,所以我不确定你是怎么设法在没有手动打开手柄的情况下读取流的。
Version Description
4.3.0 fgets() is now binary safe
4.2.0 The length parameter became optional
无论如何,您似乎想要用一行读取流,请尝试以下内容。
file("php://stdin");