Вызов неопределенной функции 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.

 4
Author: Joe Watkins, 2016-01-27

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, это, безусловно, не единый процесс, и поэтому он никогда не будет подходящей средой для разветвления на территории пользователя.

 9
Author: Joe Watkins, 2017-01-30 12:56:25