PHP, Docker – Как включить PCNTL (расширения управления процессами)

Окружение
Версия 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: Опции – Руководство

Оцените статью
Procodings.ru
Добавить комментарий