代码之家  ›  专栏  ›  技术社区  ›  animuson

为什么fgets(stdin,1024)不再工作?

  •  0
  • animuson  · 技术社区  · 15 年前

    问题1

    我曾经在游戏服务器的PHP解析器文件中使用过这一行,但它已经不起作用了。我知道有 fopen("php://stdin") 但现在这是3行代码而不是一行,为什么PHP要这样做?

    问题2

    另外,当我使用这个方法时,我一直得到这个输出,这导致我的脚本无法读取解析器输出的命令,我如何停止它?

    X-Powered-By: PHP/5.2.12
    Content-type: text/html
    

    我尝试将内容类型设置为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;
    
    ?>
    

    我使用tail将行发送到一个进入PHP解析器的文件中,然后通过tee将解析后的输出发送到另一个命令文件。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Wrikken    15 年前

    您使用的是命令行中的*-cgi二进制文件,我不建议这样做。如果可用,请使用cli one。查看/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

        2
  •  0
  •   RobertPitt    15 年前

    问题2是由ehsan回答的,所以我想试试问题1。

    刚刚看了一下changlog中的fgets,从4.2开始就没有任何变化,所以我不确定您是如何在不手动打开句柄的情况下读取流的。

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

    不管怎样,您似乎想用一行来阅读流,请尝试以下操作。

    file("php://stdin");