Free Performance + Extra features for Laravel using Octane and Swoole
May 26, 2023
//3 min read
How Laravel Octane Boosts Performance?
As you know, in traditional Laravel applications, the PHP process will run the application from the ground up with each request, and the PHP process can only handle one request at a time.
But in Laravel Octane, the application will bootstrap once at the first request to the ram. After that, every request that hits the server will serve using the bootstrapped application in the ram instead of running the application from the ground up.
Another feature is that Laravel Octane can run multiple workers at once, so instead of handling one request at a time, it can take multiple requests at once.
How much faster is Octane?
A quick search in the internet you can find lots of benchmarks on the internet, but for a quick comparison, I tested my website using both Laravel Octane (swoole) and nginx + PHP-fpm with default settings and did a benchmark using this command:
ab -t 10 -c http://localhost
And here is the result:
nginx
octane
As you can see in the results above, it's about 25% faster than nginx-fpm.
Based on the configurations, it can perform much faster with fewer resources, but 25-30% boosts are a lot.
Boosting Performance is one of many things that Laravel Octane can do.
Laravel Octane under the hood uses some drivers to run the workers and bootstrap the application to the ram, including swoole, openswoole, and Roadrunner.
If you use swoole as the driver, you can access some cool extra features that can be useful depending on your application.
Concurrent Tasks
You can run operations concurrently using swoole task workers:
1[$users, $servers] = Octane::concurrently([2 fn () => User::all(),3 fn () => Server::all(),4]);
All the functions above will run in parallel using swoole task workers. Isn't that awesome?
The Octane Cache
Octane using Swoole Table provides a cache driver that can handle up to 2 million reads and write operations per second.
You can also interact directly with Swoole Table using these codes:
1Octane::table('example')->set('uuid', [2 'name' => 'Nuno Maduro',3 'votes' => 1000,4]);5 6return Octane::table('example')->get('uuid');
Ticks & Intervals
Using Octane with Swoole allows you to execute callables every specified second.
For example, the code below will run each 20 seconds after the application startup:
1Octane::tick('simple-ticker', fn () => ray('Ticking...'))2 ->seconds(20);
How can you use Laravel Octane?
There is a good installation tutorial in the Laravel doc itself here
You need to install the drivers on your server first. For example, for installing swoole, you can use pecl:
pecl install swoole
After that, you need to install the laravel Octane itself using the code below:
composer require laravel/octane
Then you need to run this command:
php artisan octane:install
And at the end, for serving your application, you can use this artisan command:
php artisan octane:start
But can I use Octane on all Laravel applications?
The quick answer is Yes and also No!
You can use Octane on all Laravel applications, but since it handles requests differently, you must check that your application is compatible with Octane.
For example, your application's service providers register
and boot
methods will only be executed once when the request worker initially boots.
Because of that, You should double-check the injections in your boot
and register
methods.
You can read about the Dependency Injection & Octane in the Laravel Doc.
If you use Larastan, there is a rule that you can use to check Octane Compatibility. You can enable this rule by setting this parameter in your phpstan.neon
file:
1parameters:2 checkOctaneCompatibility: true
But don't be afraid of compatibility problems and memory leaks. After using Octane for almost two years, I only encounter one memory leak in barryvdh/laravel-debugbar
.
Since You only use the debug bar in the development environment, it might not be a big deal. Still, I replaced it with itsgoingd/clockwork
, and I can tell you it's as good as the laravel debug bar, and it supports Octane without any memory leak or compatibility problem.