1. Go to this page and download the library: Download hds-solutions/parallel-sdk library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
hds-solutions / parallel-sdk example snippets
// check if extension is loaded to allow deploying even in environments where parallel isn't installed
if (extension_loaded('parallel')) {
// set the path to composer's autoloader
parallel\bootstrap(__DIR__.'/vendor/autoload.php');
}
otstrap the Console Kernel
(nsole\Kernel::class)
->bootstrap();
use HDSSolutions\Console\Parallel\Scheduler;
Scheduler::using(static function(int $number): int {
// here you do some work with the received data
// this portion of code will run on a separated thread
// example process
$microseconds = random_int(100, 500);
echo sprintf("AnonymousWorker >> Hello from task #%u, I'll wait %sms\n", $number, $microseconds);
usleep($microseconds * 1000);
// end example process
// the data returned will be available later
return $number;
});
use HDSSolutions\Console\Parallel\ParallelWorker;
final class ExampleWorker extends ParallelWorker {
protected function process(int $number = 0): int {
// example process
$microseconds = random_int(100, 500);
echo sprintf("ExampleWorker >> Hello from task #%u, I'll wait %sms\n", $number, $microseconds);
usleep($microseconds * 1000);
// end example process
return $number;
}
}
use HDSSolutions\Console\Parallel\Scheduler;
Scheduler::using(ExampleWorker::class);
use HDSSolutions\Console\Parallel\ParallelWorker;
final class ExampleWorker extends ParallelWorker {
public function __construct(
private array $multipliers,
) {}
}
use HDSSolutions\Console\Parallel\Scheduler;
Scheduler::using(ExampleWorker::class, [ 2, 4, 8 ]);
use HDSSolutions\Console\Parallel\Scheduler;
foreach (range(1, 100) as $task_data) {
try {
// tasks will start as soon as a thread is available
Scheduler::runTask($task_data);
} catch (Throwable) {
// if no Worker was defined, a RuntimeException will be thrown
// also, Workers have some limitations, see Reference #3 for more info
}
}
use HDSSolutions\Console\Parallel\Scheduler;
use HDSSolutions\Console\Parallel\Task;
do {
$all_processed = true;
foreach (Scheduler::getTasks() as $task) {
switch (true) {
case $task->isPending():
$all_processed = false;
break;
case $task->isBeingProcessed():
$all_processed = false;
break;
case $task->wasProcessed():
$result = $task->getOutput();
break;
}
}
} while ($all_processed == false);
use HDSSolutions\Console\Parallel\Scheduler;
// This will pause execution until all tasks are processed
Scheduler::awaitTasksCompletion();
use HDSSolutions\Console\Parallel\Scheduler;
// Pause until all tasks are processed or until 15 minutes pass
Scheduler::awaitTasksCompletion(wait_until: new DateInterval('PT15M'));
use HDSSolutions\Console\Parallel\Scheduler;
use HDSSolutions\Console\Parallel\Task;
foreach (Scheduler::getTasks() as $task) {
// you have access to the Worker class that was used to process the task
$worker = $task->getWorkerClass();
// and the result of the task processed
$result = $task->getOutput();
}
use HDSSolutions\Console\Parallel\Scheduler;
use HDSSolutions\Console\Parallel\Task;
// this will remove tasks from the pending queue
Scheduler::removePendingTasks();
// after cleaning the queue, you should wait for tasks that are currently being processed to finish
Scheduler::awaitTasksCompletion();
$results = [];
$unprocessed_tasks = [];
foreach (Scheduler::getTasks() as $task) {
if ($task->wasProcessed()) {
$results[] = $task->getOutput();
} else {
// tasks that were not processed, will remain in the Pending state
$unprocessed_tasks[] = $task;
}
}
use HDSSolutions\Console\Parallel\Scheduler;
use HDSSolutions\Console\Parallel\Task;
foreach (Scheduler::getTasks() as $task) {
// if for some reason you want to remove a task, or just want to free memory when a task finishes
if (someValidation($task) || $task->wasProcessed()) {
// this will remove the task from the processing queue
// IMPORTANT: if the task is already running, it will be stopped
Scheduler::removeTask($task);
}
}
use HDSSolutions\Console\Parallel\Scheduler;
use HDSSolutions\Console\Parallel\Task;
// this will stop processing tasks immediately
Scheduler::stop();
// in this state, Tasks should have 3 of the following states
foreach (Scheduler::getTasks() as $task) {
switch (true) {
case $task->isPending():
// Task was never processed
break;
case $task->wasProcessed():
// Task was processed by the Worker
break;
case $task->wasCancelled():
// Task was cancelled while was being processed
break;
}
}
use HDSSolutions\Console\Parallel\Scheduler;
Scheduler::setMaxCpuCountUsage(2); // Use at max two CPU cores
Scheduler::setMaxCpuPercentageUsage(0.5); // Use at max 50% of the total of CPU cores
use HDSSolutions\Console\Parallel\Scheduler;
$tasks = range(1, 10);
Scheduler::using(ExampleWorker::class)
->withProgress(steps: count($tasks));
use HDSSolutions\Console\Parallel\ParallelWorker;
final class ExampleWorker extends ParallelWorker {
protected function process(int $number = 0): int {
// example process
$microseconds = random_int(100, 500);
$this->setMessage(sprintf("ExampleWorker >> Hello from task #%u, I'll wait %sms", $number, $microseconds));
usleep($microseconds * 1000);
$this->advance();
// end example process
return $number;
}
}
diff
#!/usr/bin/env php
+ // check if parallel extension is loaded
+ if (extension_loaded('parallel')) {
+ // and register the bootstrap file for the threads
+ parallel\bootstrap(__DIR__.'/bootstrap/parallel.php');
+ }
define('LARAVEL_START', microtime(true));
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.