Вызов неопределенной функции pcntl fork() php-fpm nginx с помощью функции pcntl fork()
Я пытаюсь использовать pcntl_fork()
в php-fpm, но он недоступен, и я получаю:
Call to undefined function pcntl_fork()
Даже несмотря на то, что я переоценил disable_functions
в php.ini
. phpinfo()
показывает автора и php -m
также перечисляет pcntl
. Если я выполняю свой сценарий из командной строки, он работает. Есть ли еще какая-нибудь опция, которую мне нужно включить?
В качестве MWE я подготовил минимальную среду настройки в https://github.com/white-gecko/pcntl-mwe отв.
docker pull whitegecko/pcntl-mwe
Если вы запустите его с помощью docker run -it --rm --name pcntl -p 8080:80 pcntl
, у вас будет пример в http://localhost:8080/
и phpinfo в http://localhost:8080/phpinfo.php
. Это система debian jessie.
1 answers
Расширение PCNTL предназначено для работы только в командной строке; Вы не можете использовать его в других серверных средах (fpm, mod_php и т. Д.).
Предполагается, что расширения, помеченные только как "cli", должны быть статически связаны в двоичный интерфейс командной строки или разрешены для загрузки в общий интерфейс командной строки и исключены из общих сборок, предназначенных для других SAPI(libphp7.so).
Файл autoconf (ext/pcntl/config.m4), который настраивает PCNTL для PHP, должен указывать сборку процесс, чтобы запретить загрузку PCNTL в других SAPI, так получилось, что 1) это не очень хорошо и 2) это не было учтено при объединении FPM в PHP: так что FPM игнорирует его и все равно связывается с источником PCNTL (если расширение включено во время компиляции), и другие SAPI позволят вам загрузить библиотеку, если она является общей, потому что DSO (общая библиотека) сама по себе не применяет ограничение SAPI. Ни одна из этих вещей (связывание FPM и загрузка других) не должна быть разрешена, и это ужасная идея заставить неподдерживаемый SAPI загрузить PCNTL.
Когда вы разветвляете процесс, вы создаете клон процесса с копией при записи, который называется fork: Внутри Apache или FPM это означает дублированные дескрипторы файлов (сокетов), которыми вы не можете корректно управлять в дочернем процессе (поскольку у вас нет доступа к ним из PHP).
Причина, по которой это должно быть ограничено CLI (и ранним CGI), заключается в том, что эти SAPI используют единую модель процесса. В то время как FPM является технически интерфейс CGI, это, безусловно, не единый процесс, и поэтому он никогда не будет подходящей средой для разветвления на территории пользователя.