Почему fgets (STDIN, 1024) больше не работает? - PullRequest
0 голосов
/ 23 июля 2010

Вопрос 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 ]

2 голосов
/ 23 июля 2010

Вы используете двоичный файл * -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

0 голосов
/ 23 июля 2010

Эхсан ответил на вопрос 2, так что я не могу ответить на вопрос 1.

Только что взглянул на список изменений для Fgets и не было никаких изменений с 4.2, поэтому я не уверен, как вам удалось прочитать поток, не открывая дескриптор перед раздачей.

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

В любом случае кажется, что вы хотите прочитать поток одной строкой, попробуйте выполнить следующее.

file("php://stdin");
...