Вопрос по php – Как pcntl_fork работает в PHP?

16

Я в замешательствеpcntl_fork в PHP.

Я думаю, что это многопоточность, но как это работает и как бы я использовал его в сценарии?

Ваш Ответ

1   ответ
38

с PHP. Что это означает? Когда вы звонитеpcntl_fork(), текущий процесс разделен на два процесса. Все пространство имен родительского процесса копируется в дочерний процесс, и оба процесса продолжают выполнение параллельно только с одним отличием:pcntl_fork() возвращает PID ребенка в родительском и0 у ребенка.

Некоторые намеки:

По умолчанию отключено. Если вам удастся включить его, сделайте это только для CLI. Никогда не используйте его с веб-сервером! Он будет вести себя недетерминированным образом. Это также может привести к поломке всей машины. Пожалуйста, оставьте его отключенным и читайте дальше. Связь между процессами возможна, но ужасна (через сериализованный объект в разделяемой памяти).ескрипторы @File (и соединения с базой данных) являются общими, это часто вызывает проблемы. Вы должны восстановить соединение с БД после разветвления. или вы получите ошибки, такие как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, очередей сообщений или программы на языке более низкого уровня, в зависимости от ваших потребностей.

рограмма @Forked PHP очень сложна для чтения, понимания и отладки. Поддержание этой программы будет кошмаром.

Не делай ошибок и избегай разветвлений. Тебе это не нужно. Что вам действительно нужно, так это асинхронный бегун задач. Хорошие новости, есть RabbitMQ а также хороший учебник ;-) Вы также можете попробовать многообещающую библиотеку RabbitMQ под названиемКроли

PS: использование очередей сообщений вместо разветвления дает вам еще одно преимущество. Вы можете обрабатывать очередь с несколькими серверами и масштабировать горизонтально по мере роста трафика.

EDIT 2019-03-07

Я много играл с асинхронной средой параллелизмаamphp и я должен упомянуть это здесь. Если вам действительно нужно запускать асинхронные неблокирующие задачи в одном запросе, я считаю, чтоamphp чтобы быть лучшим решением сегодня. Использует концепцию php-генераторов $value = yield $promise) выполнять понятный человеку код без чёртового обещания реагирования как у ph

https: //amphp.org

Спасибо, твой ответ помог мне Mehdi Maghrooni
Не могли бы вы порекомендовать создавать демонов с разветвлением? Raheel Khan

Похожие вопросы