Polyfill Implementation of Threads in PHP. This class supports both FORK process and native Threads using ZTS compilation;
This class detects automatically if PHP was compiled:
and choose the most suitable handler for processing the threads. The thread interface is the same whatever is the Thread handler.
Assume for the examples below the class ‘Foo' and the method ‘bar':
require_once('vendor/autoload.php');
// Method to be executed in a thread
$threadClousure = function ($t)
{
echo "Starint thread #$t" . PHP_EOL;;
sleep(1 * rand(1, 5));
for ($i = 0; $i < 10; $i++)
{
echo "Hello from thread #$t, i=$i" . PHP_EOL;
sleep(1);
}
echo "Ending thread #$t" . PHP_EOL;
return $t;
};
// Create the Threads passing a callable
$thread1 = new ByJG\PHPThread\Thread( $threadClousure );
$thread2 = new ByJG\PHPThread\Thread( $threadClousure );
// Start the threads and passing parameters
$thread1->execute(1);
$thread2->execute(2);
// Wait the threads to finish
$thread1->waitFinish();
$thread2->waitFinish();
// Get the thread result
echo "Thread Result 1: " . $thread1->getResult();
echo "Thread Result 2: " . $thread2->getResult();
You can create a pool of threads. This is particulary interesting if you want to queue Workers after the pool is started.
// Create a instance of the ThreadPool
$threadPool = new \ByJG\PHPThread\ThreadPool();
// Create and queue the threads with call parameters
$threadPool->queueWorker( $threadClousure, [ 1 ]);
$threadPool->queueWorker( $threadClousure, [ 2 ]);
// Starts all the threads in the queue
$threadPool->startPool();
// Add more workers after the pool is started:
$threadPool->queueWorker( $threadClousure, [ 3 ]);
$threadPool->queueWorker( $threadClousure, [ 4 ]);
// Wait until there is no more active workers
$threadPool->waitWorkers();
// Get the return value from the thread.
foreach ($threadPool->getThreads() as $thid) {
echo 'Result: ' . $threadPool->getThreadResult($thid) . "\n";
}
echo "\n\nEnded!\n";
Important Note for the FORK implementation
In order to get working the ‘getResult' of the fork implementation is necessary pass the setup parameters to the Thread::setThreadHandlerArguments() method;
<?php
$thread = new \ByJG\PHPThread\Thread([$someinstance, $somemethod]);
$thread->setThreadHandlerArguments(
[
'max-size' => 0x100000,
'default-permission' => '0700'
]
);
Just type: composer require "byjg/phpthread=2.3.*"
How do I instantiate a method class?
$thr = new ByJG\PHPThread\Thread(array('classname', 'methodname'));
or
$instance = new myClass();
$thr = new ByJG\PHPThread\Thread(array($instance, 'methodname'));