Wallogit.com
2017 © Pedro Peláez
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();