【问题标题】:Why does fgets(STDIN, 1024) not work anymore?为什么 fgets(STDIN, 1024) 不再工作了?
【发布时间】:2010-07-22 21:22:10
【问题描述】:

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

【问题讨论】:

    标签: php stdin tail tee


    【解决方案1】:

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

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

    【讨论】:

    • 不是符号链接,是可执行文件。我在 /usr/local/bin/php 找到了另一个,我应该改用那个吗?
    • 如果 /usr/local/bin/php -v 说它是 CLI 而不是 CGI,是的,否则,请尝试使用您的发行版的包管理器找到类似 php-cliphp5-cli 的内容。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 2019-04-13
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多