Utilize Laravel Processes to run PHP code asynchronously.
Laravel Processes was first introduced in Laravel 10. This library wraps around Process::start()
to let you execute code in the background to achieve async, albeit with some caveats:
- You may only execute PHP code
- Restrictions from
laravel/serializable-closure
apply (see their README) - Hands-off execution: no built-in result-checking, check the results yourself (e.g. via database, file cache, etc)
This library is very helpful for these cases:
- You want a minimal-setup async for easy vertical scaling
- You want to start quick-and-dirty async tasks right now (e.g. prefetching resources, pinging remote, etc.)
- Best is if your task only has very few lines of code
- Laravel 11 Concurrency is too limiting; e.g.:
- You want to do something else while waiting for results
Of course, if you are considering extreme scaling (e.g. Redis queues in Laravel, multi-worker clusters, etc.) or guaranteed task execution, then this library is obviously not for you.
via Composer:
composer require vectorial1024/laravel-process-async
This library supports Unix and Windows; see the Testing section for more details.
Please see CHANGELOG.md
.
Tasks can be defined as PHP closures, or (recommended) as an instance of a class that implements AsyncTaskInterface
.
A very simple example task to write Hello World to a file:
// define the task...
$target = "document.txt";
$task = new AsyncTask(function () use ($target) {
$fp = fopen($target, "w");
fwrite($fp, "Hello World!!");
fflush($fp);
fclose($fp);
});
// if you are using interfaces, then it is just like this:
// $task = new AsyncTask(new WriteToFileTask($target, $message));
// then start it.
$task->start();
// the task is now run in another PHP process, and will not report back to this PHP process.
PHPUnit via Composer script:
composer run-script test
Latest cross-platform testing results:
Runtime | MacOS | Ubuntu | Windows |
---|---|---|---|
Laravel 10 (PHP 8.1) | skipped* | skipped* | skipped* |
Laravel 11 (PHP 8.2) | |||
Laravel 12 (PHP ???) | 🛠️ | 🛠️ | 🛠️ |
*Note: tests for these Laravel versions are skipped because they have old artisan
file contents:
- It is difficult to mock multi-version
artisan
files for different Laravel versions (see #6). - It is rare for the
artisan
file at Laravel to be updated - The actual behavior is expected to be the same.