Окружение
Версия Laravel : 8.16.1
Версия PHP : 7.4.7
Иногда PCNTL(Process Control Extensions) требуется для использования определенных функций в Laravel.
(PHP: PCNTL — Руководство)
https://www.php.net/manual/en/book.pcntl.php
Например, если вы хотите указать период таймаута выполнения задания в Laravel, эта функция должна быть включена.
Следующая конфигурация и исходный код показывают, что период тайм-аута установлен.
(Вы можете задать, чтобы задание завершалось как ошибка через X секунд).
Есть два способа.
Один — указать его из команды artisan при выполнении задания, а другой — записать в исходном коде.
При использовании команды artisan это выглядит следующим образом.
php artisan queue:listen --timeout=30
При записи в исходном коде это выглядит следующим образом.
namespace AppJobs;
class ProcessPodcast implements ShouldQueue
{
/**
* The number of second that the job can execute until timeout period.
*
* @var int
*/
public $timeout = 120;
}
В качестве дополнения, когда они используются оба, значение исходного кода имеет приоритет.
Это означает, что в случае приведенного выше примера, тайм-аут наступит через 120 секунд.
Но для использования этой функции необходимо включить PCNTL (Process Control Extensions), как описано выше, иначе период тайм-аута по умолчанию составит 60 секунд.
Для получения дополнительной информации, пожалуйста, обратитесь к ссылке.
https://laravel.com/docs/8.x/queues#timeout
Как мне включить эту функцию? Когда вы посмотрите на это, вы найдете «Please compile PHP».
Это оттолкнет вас.
https://www.php.net/manual/en/pcntl.installation.php
PHP Official
Поддержка Process Control в PHP не включена по умолчанию. Вам необходимо скомпилировать CGI или CLI версию PHP с опцией конфигурации —enable-pcntl при компиляции PHP, чтобы включить поддержку Process Control.
Переполнение стека
Как включить pcntl в php (при использовании фреймворка типа Symfony2)
Как включить PCNTL на сервере Ubuntu 16.04 — Stack Overflow
Это сложная задача для разработчиков Docker.
Однако можно включить PCNTL (функцию управления процессом) путем редактирования Dockerfile без перекомпиляции PHP.
Если быть точным, добавьте следующий синтаксис.
Образ Docker был разработан для использования официального дистрибутива php-fpm.
RUN docker-php-ext-configure pcntl --enable-pcntl
&& docker-php-ext-install
pcntl
Пример редактирования Dockerfile.
FROM php:7.4.11-fpm
# install composer
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get update
&& apt-get install -y
git
zip
unzip
vim
RUN apt-get update
&& apt-get install -y libpq-dev
&& docker-php-ext-install pdo_mysql pdo_pgsql
RUN docker-php-ext-configure pcntl --enable-pcntl
&& docker-php-ext-install
pcntl
WORKDIR /var/www/html
Если вы используете Docker-composer, перестройте его с помощью команды «docker-compose up -d —build».
Чтобы проверить, включен ли pcntl, выполните следующую команду после входа в контейнер.
php -i | grep pcntl
Если вы увидите следующее сообщение, pcntl включен.
pcntl support => enabled
Параметры команды php смотрите ниже.
PHP: Опции — Руководство