Simple wrapper for PHP pcntl fork functions
This small library makes it simple to use the pcntl
extension;
Also, I strongly encourage you to take a look at the PThreads
library (http://pthreads.org) which is more powerful than this tiny wrapper; I wrote it just because using PThreads was not an option in my use-case., (*1)
PHP >= 5.3 pcntl extension installed
Just add the following line to your "require":
section:, (*2)
"azielinski/simple-process": "dev-master"
Then just clone the repo :) You will also have to manually include
all four files., (*3)
Basic usage looks like this:, (*4)
declare(ticks=1); // This part is critical, be sure to include it $manager = new SimpleProcess\ProcessManager(); $manager->fork(new SimpleProcess\Process(function() { sleep(5); }, "My super cool process")); do { foreach($manager->getChildren() as $process) { $iid = $process->getInternalId(); if($process->isAlive()) { echo sprintf('Process %s is running', $iid); } else if($process->isFinished()) { echo sprintf('Process %s is finished', $iid); } echo "\n"; } sleep(1); } while($manager->countAliveChildren());
And that's it! Child processes will execute only the provided callable, so there is no need to worry about "Am I in the right process in this line?"; Parent process continues execution normally after the ->fork()
was called; ProcessManager
class also takes care of reaping children processes, so you may focus on your application's logic instead of dark corners of pcntl_*
functions usage., (*5)
ProcessManager may allocate some shared memory for each child process - then you may access it from the parent process:, (*6)
declare(ticks=1); // This part is critical, be sure to include it $manager = new SimpleProcess\ProcessManager(); $manager->allocateSHMPerChildren(1000); // allocate 1000 bytes for each forked process for($i=0;$i<4;$i++) { $manager->fork(new SimpleProcess\Process(function(SimpleProcess\Process $currentProcess) { $currentProcess->getShmSegment()->save('status', 'Processing data...'); sleep(5); $currentProcess->getShmSegment()->save('status', 'Connecting to the satellite...'); sleep(5); }, $i)); } $manager->cleanupOnShutdown(); // Register shutdown function that will release allocated shared memory; // It is important to call this after all fork() calls, as we don't want // to release it when child process exits do { foreach($manager->getChildren() as $process) { $iid = $process->getInternalId(); if($process->isAlive()) { echo sprintf('Process %s is running with status "%s"', $iid, $process->getShmSegment()->fetch('status')); } else if($process->isFinished()) { echo sprintf('Process %s finished execution', $iid); } echo "\n"; } sleep(1); } while($manager->countAliveChildren()); $manager->cleanup(); // You can also call cleanup() manually if you want to
This library comes also with the Semaphore
class in case you'd need to use semaphores somewhere in your code; Use it like this:, (*7)
$s = SimpleProcess\Semaphore::create('critical_section'); $s->acquire(); $s->release();