为什么fgets(STDIN,1024)不再起作用了?

时间:2010-07-22 21:22:11

标签: php stdin tail tee

问题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发送到另一个命令文件。

2 个答案:

答案 0 :(得分:2)

您正在使用命令行中的* -cgi二进制文件,我不建议这样做。如果可用,请使用CLI。查看/ usr / bin / php中符号链接的实际位置。

编辑:aha,这里是手册中的,仅对CLI有效:

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");