0

问题 1

我曾经将该行用于我的游戏服务器的 PHP 解析器文件,但它不再工作了。我知道有这样的fopen("php://stdin")东西,但现在是 3 行代码而不是只有 1 行,为什么 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 发送到另一个命令文件。

4

2 回答 2

2

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

编辑:啊哈,这是在手册中,仅对 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

于 2010-07-22T21:50:07.133 回答
0

问题 2 由 Ehsan 回答,因此请尝试问题 1。

刚刚查看了 Fgets 的 Changlog,自 4.2 以来没有任何变化,所以我不确定您是如何在不事先打开句柄的情况下设法读取流的。

Version  Description
4.3.0      fgets() is now binary safe
4.2.0      The length parameter became optional

无论如何,您似乎想用一行阅读流,您是否尝试过以下操作。

file("php://stdin");
于 2010-07-22T21:57:04.413 回答