I'm confused about pcntl_fork
in PHP.
I think it does multi-threading, but how does it work and how would I use it in a script?
PCNTL can not make threads. It only "forks" current PHP process. What does it mean? When you call pcntl_fork()
, current process is split into two processes. Whole namespace of parent process is copied into the child and both processes continue with execution in parallel with only one difference: pcntl_fork()
returns child's PID in parent and 0
in child.
Some hints:
MySQL server has gone away
from all forked processes when first of them closes the connection.Here's example from documentation:
<?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 }
But remember, PHP is just scripting language. It's not designed for parallel computing. You could do better job with simultaneously running CRONs, message queues or program in lower-level language, depending on your needs.
Forked PHP program is very hard to read, understand and debug. Maintaining that program will be a nightmare.
Don't make mistake and avoid forking. You don't need it. What you really need is asynchronous task runner. Good news, there is RabbitMQ and nice tutorial ;-) You can also try promising RabbitMQ library called Bunny
PS: Using message queues instead of forking gives you one more advantage. You can process the queue with multiple servers and scale horizontally as your traffic grows.
EDIT 2019-03-07
I have played a lot with asynchronous concurrency framework amphp
and I have to mention it here. If you really need to run async non-blocking tasks in single request, I consider amphp
to be the best solution today. It uses concept of php generators ($value = yield $promise
) to execute human-readable code without reactphp-like promise hell.
https://amphp.org/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With