0

質問1

以前はゲーム サーバーの PHP パーサー ファイルにその行を使用していましたが、もう機能しません。あることは知っていますが、それはfopen("php://stdin")1行ではなく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 パーサーに送信し続け、解析された出力がティー経由で別のコマンド ファイルに送信されます。

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を試してみてください。

Changlog for Fgetsを見てみましたが、4.2以降変更はありません。そのため、事前にハンドルを開かずにストリームを読み取る方法がわかりません。

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

とにかく、1行でストリームを読みたいようです。次のことを試してみてください。

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