Меня смущает pcntl_fork
в PHP.
Я думаю, что это многопоточность, но как это работает и как я могу использовать это в сценарии?
Меня смущает pcntl_fork
в PHP.
Я думаю, что это многопоточность, но как это работает и как я могу использовать это в сценарии?
PCNTL не может создавать потоки. Он только «разветвляет» текущий PHP-процесс. Что это означает? Когда вы вызываете pcntl_fork()
, текущий процесс разделяется на два процесса. Все пространство имен родительского процесса копируется в дочерний, и оба процесса продолжают выполнение параллельно с одним отличием: pcntl_fork()
возвращает PID дочернего процесса в родительском и 0
в дочернем.
Некоторые подсказки:
MySQL server has gone away
от всех разветвленных процессов, когда первый из них закроет соединение.Вот пример из документации:
<?php
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
} else if ($pid) {
// we are the parent
pcntl_wait($status); //Protect against Zombie children
} else {
// we are the child
}
Но помните, PHP - это просто язык сценариев. Он не предназначен для параллельных вычислений. Вы могли бы лучше справиться с одновременным запуском CRON, очередей сообщений или программы на языке нижнего уровня, в зависимости от ваших потребностей.
Разветвленную программу PHP очень сложно читать, понимать и отлаживать. Поддерживать эту программу будет кошмаром.
Не делайте ошибок и избегайте разветвлений. Тебе это не нужно. Что вам действительно нужно, так это асинхронный исполнитель задач. Хорошие новости: есть RabbitMQ и хороший учебник ;-) Вы также можете попробовать многообещающую библиотеку RabbitMQ под названием Зайчик
PS: Использование очередей сообщений вместо разветвления дает вам еще одно преимущество. Вы можете обрабатывать очередь с несколькими серверами и масштабировать ее по горизонтали по мере роста вашего трафика.
РЕДАКТИРОВАТЬ 2019-03-07
Я много играл с фреймворком асинхронного параллелизма amphp
, и я должен упомянуть об этом здесь. Если вам действительно нужно запускать асинхронные неблокирующие задачи в одном запросе, я считаю amphp
лучшим решением на сегодняшний день. Он использует концепцию генераторов php ($value = yield $promise
) для выполнения кода, понятного человеку, без адского обещания, подобного responsephp.