Можно ли использовать предварительный загрузчик для скрипта cli, а не для php-fpm?

Я понимаю, что мы могли бы скомпилировать наш PHP-код в OpCache, используя прелоадер в 7.4. Насколько я понимаю, он предназначен только для CGI/FastCGI (PHP-FPM). Можно ли сделать то же самое только для сценария CLI, который не предназначен для выполнения по HTTP-запросу, а для запуска в консоли?

Здесь я создал небольшой пример репозитория.


person 112Legion    schedule 09.05.2021    source источник


Ответы (2)


Технически предварительная загрузка работает для CLI.

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

  1. Вы должны запустить свой контейнер без полномочий root (или настроить пользователя для предварительной загрузки), см. https://www.php.net/manual/de/opcache.preloading.php (Запуск предварительной загрузки с правами root не разрешен.)

    Вы можете добавить user: <someUserId>:<someUsergroupId> к своему сервису. В зависимости от того, как переключение пользователей реализовано в PHP, может потребоваться запись в /etc/passwd.

  2. Кэш кода операции для CLI не является обязательным, см. https://www.php.net/manual/en/opcache.configuration.php#ini.opcache.enable-cli

person Jonas Eberle    schedule 09.05.2021
comment
Я гуглил об opcache.enable-cli stackoverflow.com/a/25047263/7921383 Кажется, он ничего не делает, потому что OpCache хранится в памяти. Ну, я нашел, что мы можем настроить, чтобы использовать файл вместо памяти. Но мне интересно, когда будет OpChaching? При первом запуске скрипта? - person 112Legion; 09.05.2021

Существует страница о предварительной загрузке в руководстве, в которой явно упоминается этот сценарий. :

Кроме того, предварительная загрузка полезна только тогда, когда существует постоянный процесс от одного запроса к другому. Это означает, что, хотя он может работать в сценарии CLI, если включен opcache, в целом это бессмысленно.

Чтобы включить его, вы должны установить что-то вроде этого в вашем php.ini:

opcache.enable_cli=1
opcache.file_cache=/some/dir/somewhere
opcache.file_cache_only=1
opcache.preload=/path/to/preload.php

Если вы настроите это и запустите сценарий CLI, будет выполнен сценарий предварительной загрузки в /path/to/preload.php, и любое использование include, include_once, require, require_once или opcache_compile_file() вызовет сохранение скомпилированных кодов операций в /some/dir/somewhere.

Когда вы запустите второй скрипт CLI, он сможет использовать эти скомпилированные коды операций, но он не будет знать, что предварительная загрузка уже выполнена. Таким образом, все, что вы поместите в preload.php, в любом случае будет выполняться при каждой загрузке скрипта. Вам нужно будет справиться с этим вручную, например. вызвав opcache_is_script_cached.

Сложность использования всего этого, вероятно, превышает выгоду для большинства вариантов использования.

person IMSoP    schedule 09.05.2021