fopen возвращает пустой контент для php://stdin

Я не могу заставить fopen читать поток контента в PHP. Ошибки не возникает, содержимое всегда пустая строка.

Вот мой код:

$contents='';
$handle = fopen("php://stdin", "r") or error_log('got some error');

while (!feof($handle)) {
    $contents .= fread($handle, 8192);
}
fclose($handle);
error_log($contents);

Затем от почтальона я отправляю запрос POST по URL-адресу моего сервера, например

POST http://myserverurl/index.php

Я отправляю почтовые данные по указанному выше запросу, я также пробовал закодированные формы, двоичные и необработанные данные.

Но error_log записывает пустую строку в файл журнала, что означает, что fopen действительно работал, но получил пустое содержимое.

Я также проверил настройки php.ini, и настройка allow_url_fopen также верна.

Я тестирую это на nginx с PHP7.1-fpm. Недавно я перешел с Apache и PHP 5.6 на nginx и php7.1-fpm, и он перестал работать.

Он полностью работал с Apache и PHP5.6.

Что здесь не так? Любая помощь будет высоко оценена.


person Hammad    schedule 20.09.2019    source источник


Ответы (1)


Вероятно, есть некоторое недопонимание в потоках PHP по умолчанию.

  • Если вы запускаете скрипт PHP как команду, интерфейс командной строки выдаст вам php://stdin.

  • Если вы запускаете PHP-скрипт в среде веб-сервера/cgi/php-fpm, php://stdin вообще не существует. Вы получите php://input stream (для тела POST).

Ссылка: Поддерживаемый протокол и оболочка

person Koala Yeung    schedule 20.09.2019
comment
Да, на самом деле я запускаю это как команду CLI. По сути, я настроил крючок на постфиксе, чтобы передать входящее электронное письмо в php-скрипт, чтобы всякий раз, когда я получаю электронное письмо, выполнялся php-скрипт. В сценарии CLI, когда я использовал php://stdin, содержимое было пустым. Спасибо за пояснение выше об этом. Но не могли бы вы сказать, когда php://stdin имеет пустой контент, когда скрипт CLI пытается получить доступ к потоку контента с помощью php://stdin? Тот же код работал с apache, но перестал работать после обновления ОС сервера - person Hammad; 20.09.2019
comment
Какую ОС вы используете? Возможно ли быть проблемой обновления ОС/Postfix? - person Koala Yeung; 20.09.2019
comment
Текущая установка ОС — Ubuntu 16.04 с Nginx и PHP7.1-FPM… Ранее установка была Ubuntu 14.04 с Apache2 и PHP 5.6… Я только что сделал «do-release-upgrade» в ОС, что означает, что я не устанавливал postfix снова и старая конфигурация работала для моего постфикса, просто эта штука с электронной почтой не работает - person Hammad; 20.09.2019
comment
Что возвращает echo "hello world" | php your-script.php? - person Koala Yeung; 20.09.2019
comment
Привет, мир | php your-script.php, и он регистрирует содержимое в файле журнала, что подтверждает, что это проблема с постфиксом. Большое спасибо за твою помощь. У вас есть идеи, что может быть не так с постфиксом, который не отправляет контент в скрипт? Я могу опубликовать свою конфигурацию main.cf, если вы скажете. - person Hammad; 20.09.2019
comment
Извини. Не знаком с Postfix :-P - person Koala Yeung; 20.09.2019
comment
Без проблем. Спасибо за вашу помощь. По крайней мере, вы помогли мне указать правильное направление для решения проблемы. Я могу прочитать о том, что может быть не так с постфиксом. - person Hammad; 20.09.2019