Комментарии 11
Вопрос не совсем по теме. Но видел реализацию, когда в проде так же запускали пхп в докере в built-in сервере, и сверху докер с проксирующим nginx. Типо один сервис — один контейнер.
Из-за этого не страдает эффективность и скорость ответа (ощутимо) в отличии от метода, когда все обрабатывает nginx (или apache) через соответствующие библиотеки внутри себя?
nginx не имеет в себе встроенных модулей php. Для nginx используется обычно php-fpm. Конечно, если вы работаете через TCP сокеты оверхед будет (заметите вы его или нет, вопрос другой), если очень хочется никто вам не запрещает прокинуть unix-сокет, работать будет быстрее особенное если у вас HA, с другой стороны если у вас HA, и контейнеры, то скорее всего вы планируете горизонтально скалироваться, а тут кроме tcp вам пойти некуда, а все проблемы оверхеда решать еще одним сервером, куда проще чем заморачиватся с тонкой настройкой стека. (не зря же владелец амазона так быстро стремится к своему триллиону)
unit.nginx.org.
Но сути это не меняет, большинство действительно используют связку nginx + fpm. Что больше подходит для docker-like подхода «один контейнер — один процесс».
Допустим мы вызываем какую нибудь долгую операцию, типа такой:
<?php
sleep(100);
echo 'test' . PHP_EOL;
В следующие 100 секунд наш контейнер не будет обрабатывать другие запросы, даже если они моментальные.
Nginx и apache решают эту проблему с помощью воркеров. Даже если один воркер блокируется, то остальные продолжат отвечать на запросы.
По моему opcache.enable_cli=0
стоит по умолчанию не просто так
Зато в документации по opcache.enable написано: «Если запрещено, код не будет оптимизироваться и кешироваться.»
Но если код уже запущен (например в цикле сокет слушает, как это используется в php-cli например) то разницы нет. Т.е. вся выгода при всякого рода запуске множества тестов, а для продакшна приложений на всякого рода roadrunner разницы толком нет.
В реальных приложениях все обычно в IO упирается. Но в одном проекте есть парочка «толстых» скриптов, попробую потестить сколько enable_cli дает прибавки в скорости там.
enable_cli будет работать, если скрипт выполняется регулярно. В случае, если один раз запустили, и неделями работает, никакой пресловутой «оптимизации» не видно, как не выжимай. В документации тоже обнаружил момент с отмутсвием толкового описания оптимизации, но львиная доля опкеша работать не должна в таком режиме.
bench.php не запускал. При нескольких запусках прибавка само собой должна быть (кешируется же скомпилированный байткод).
Сейчас тестирую реальные приложения. Результаты получаются разные.
Команда из проекта на работе (время работы самого скрипта, время запуска не учитывается):
#Прогоны со стандартным конфигом:
4.059s,4.113s, 4.166s, 4.022s, 4.021s
#Прогоны с opcache.enable_cli=1:
4.089s, 3.978s, 3.947s, 3.86s, 3.838s, 3.736s
opensource проект, парсинг dom дерева (без учета получения данных по сети): github.com/xtrime-ru/ICA/blob/master/app/Parsers/HtmlParser.php#L19
#Прогоны со стандартным конфигом:
0.038s, 0.04s,
#Прогоны с opcache.enable_cli=1:
0.058s, 0.057s
То есть в одном проекте получили ускорение на 200 мс., а во втором случае замедление на эти же 200 мс…
В итоге, как и пишут в умных книжках, надо всегда тестить для конкретных приложений.
Запускаем php 8 с jit в docker за 5 минут