Вызов неопределенной функции pcntl_fork() php-fpm nginx

Я пытаюсь использовать pcntl_fork() в php-fpm, но он недоступен, и я получаю:

Call to undefined function pcntl_fork()

Несмотря на то, что я перекомментировал disable_functions в php.ini. phpinfo() показывает автора, а php -m также указывает pcntl. Если я запускаю свой скрипт из cli, он работает. Есть ли какая-либо другая опция, которую мне нужно включить?

Как 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.


person white_gecko    schedule 26.01.2016    source источник


Ответы (1)


Расширение PCNTL предназначено для работы только в CLI; Вы не можете использовать его в других серверных средах (fpm, mod_php и т. д.).

Предполагается, что расширения, помеченные как «cli», предназначены только для статического связывания с двоичным файлом CLI или для загрузки общего доступа в CLI и исключены из общих сборок, ориентированных на другие SAPI (libphp7.so).

Файл autoconf (ext/pcntl/config.m4), который настраивает PCNTL для PHP, должен указать процессу сборки запретить загрузку PCNTL в других SAPIS, так получилось, что 1) это не очень хорошо и 2) это не было учитывалось, когда FPM был объединен с PHP: чтобы FPM игнорировал его и связывался с исходным кодом PCNTL в любом случае (если расширение включено во время компиляции), а другие SAPI позволяли вам загружать библиотеку, если она является общей, потому что DSO (общая библиотека) сама по себе не налагает ограничения SAPI. Ни одна из этих вещей (связывание FPM и загрузка других) не должна быть разрешена, и это ужасная идея заставить неподдерживаемый SAPI загружать PCNTL.

Когда вы разветвляете процесс, вы создаете клон процесса, который называется fork, с копированием при записи: внутри Apache или FPM это означает дублированные дескрипторы файлов (сокетов), которыми вы не можете изящно управлять в дочернем процессе (поскольку у вас нет доступ к ним из PHP).

Причина, по которой это должно быть ограничено CLI (и ранней CGI), заключается в том, что эти SAPI используют единую модель процесса. Хотя технически FPM является CGI-интерфейсом, он, безусловно, не является единым процессом, и поэтому никогда не будет подходящей средой для разветвления пользовательской земли.

person Joe Watkins    schedule 27.01.2016
comment
Спасибо за разъяснения. Действительно, расширение фактически не предотвращает загрузку в не-cli SAPI. - person Arnaud Le Blanc; 31.01.2017
comment
Это неправда, можно использовать его с php-fpm. - person LeonanCarvalho; 20.03.2018
comment
Прочитайте еще раз... Я сказал, что это возможно, и объяснил, почему это возможно, но также сказал, что это ужасная идея... - person Joe Watkins; 30.03.2018
comment
это не НЕВЕРОЯТНО распространено, но довольно полезно в пользовательских сценариях, когда вы хотите немедленно ответить на запрос ajax (или аналогичный), но оставить что-то - person Garet Claborn; 09.08.2018