Intereting Posts
Как найти тег объекта с параметром и вставить тег внутри HTML с помощью простого html DOM php Создание изображений предварительного просмотра для файлов DOC, TXT и RTF Таблица с именем «like» в MySQL Google транслитерация не работает на веб-сайте доступа к SSL Какие существуют методы инициализации объектно-ориентированной инфраструктуры PHP? PHP – ссылка на локальный файл Тестирование фасадов Laravel с издевательством всегда проходит, даже если это не удается Как нажимать и значение и ключ в массив mysql_connect (): соединение не может быть выполнено, потому что целевая машина активно отказалась от него Layout.php не показывает часть header.php PHP: возвращает все даты между двумя датами в массиве Почему запросы отправки php5-fpm медленны, в то время как тот же php-cli-код / ​​консольный завиток работает очень быстро? Как изменить styleTable на PHPWord? SELECT и список дочерних и родительских Объявление переменных типов в PHP?

Как работает pcntl_fork в PHP?

Я запутался в pcntl_fork в PHP.

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

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

Некоторые подсказки:

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

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

Не делайте ошибки и избегайте разветвления. Вам это не нужно. То, что вам действительно нужно, – это асинхронный бегун задачи. Хорошая новость, есть RabbitMQ и хороший учебник 😉 Вы также можете попробовать многообещающую библиотеку RabbitMQ под названием Bunny

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