Я запутался в 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 – это всего лишь скриптовый язык. Он не предназначен для параллельных вычислений. Вы могли бы лучше работать с одновременным запуском CRONs, очередей сообщений или программ на языке более низкого уровня, в зависимости от ваших потребностей.
Forked PHP-программа очень трудно читать, понимать и отлаживать. Поддержание этой программы будет кошмаром.
Не делайте ошибки и избегайте разветвления. Вам это не нужно. То, что вам действительно нужно, – это асинхронный бегун задачи. Хорошая новость, есть RabbitMQ и хороший учебник 😉 Вы также можете попробовать многообещающую библиотеку RabbitMQ под названием Bunny
PS: Использование очередей сообщений вместо forking дает вам еще одно преимущество. Вы можете обрабатывать очередь с несколькими серверами и масштабироваться горизонтально по мере роста трафика.