12фактор — если приложение PHP записывает свой поток событий без буферизации в стандартный вывод, куда направляется фактический вывод?

Я говорю из PHP, но думаю, что это применимо к другим языкам веб-сервера. не stdout куда все, как указано, идет стандартный вывод? Кроме того, разве это не то, куда идет ответ HTTP? Я что-то пропустил?

1

Решение

Традиционно CGI-приложения использовали STDOUT для отправки HTTP-ответов. Приложение CGI — это просто исполняемый файл, который вызывается веб-сервером. Приложение CGI использует STDIN для чтения запросов и STDOUT для отправки ответов. Что хорошего в приложениях CGI, так это то, что им не нужно понимать сеть. Они прекрасно вписываются в модель UNIX.

PHP начинался как приложение CGI. Приложения CGI больше не популярны (они плохо масштабируются), но PHP по-прежнему следует этой базовой модели. Таким образом, вы не можете записывать события в STDOUT в PHP, потому что PHP не является веб-сервером. STDOUT в PHP является действительно ответ HTTP.

Все ваше PHP-приложение запускается, загружается и умирает в контексте каждого отдельного HTTP-запроса.

Это может сделать веб-приложение, которое запускает свой собственный демон TCP и имеет собственный HTTP-сервер. У него будет STDOUT, и у него будет TCP-соединение для каждого клиента для записи HTTP-ответов. Некоторыми примерами являются Go, Node.js, Java, но это относится к любому другому языку, который не следует модели CGI.

Так что это не совсем то, что имеет смысл для PHP. Это Можно имеет смысл, если вы используете PHP, чтобы открыть сокет TCP-сервера и реализовать протокол HTTP в PHP. Некоторые люди делают это (см. Responsephp, amphp), но вы, вероятно, не должны этого делать, если у вас нет действительно веских причин для этого. Возможность использовать STDOUT для регистрации не является одной из этих причин. Системный журнал в порядке.

5

Другие решения

Прочитав ответ Эверта, я думаю, что прояснил некоторые давние предположения, поэтому я провел эксперимент.

<?php
echo "Echo output\n";
fwrite(STDOUT, "stdout output\n");
?>
Post-closing tag output

Запуск этого в командной строке показывает это:

Echo output
stdout output
Post-closing tag output

Но просмотр этого файла через браузер показывает это:

Echo output
Post-closing tag output

Это означает, что в зависимости от контекста, в котором работает PHP, его вывод направляется в разные места. Если обслуживается через веб-сервер, echo и все, что находится за пределами тегов PHP, идет в ответ HTTP (по крайней мере, в Apache2 / PHP5). Этот HTTP-ответ отличается от stdout, Если побежал через CLI echo идет к stdout,

Этот вопрос также может быть актуален: PHP стандартный вывод на Apache

0