Swoole can be said to be a sharp sword for PHP. It expands the boundaries of PHP and allows many PHPers have seen the dawn of high concurrency. Using Swoole to improve the performance of Laravel is a very worthwhile investment. In this way, you can not only obtain the high performance of Swoole, but also take into account the high efficiency of Laravel, getting the best of both worlds. Shadowfax is such an expansion package. It is simple and easy to use and can help developers quickly migrate Laravel applications to run on Swoole.
First let's take a look at the performance of Laravel applications running using Shadowfax:
I use wrk
as the benchmark tool this time, based on the latest version of Laravel 7, But the session-related middleware has been removed. Because Laravel enables sessions by default, and the session driver is file, if you run a test in this case, a session file will be created for each request, so the results will be meaningless. (Applications that pursue performance should not use file as the session driver)
Environment 1:
- Hardware: 1 CPU, 4 Cores, 16GB Memory
- MacOS 10.15.3
- PHP 7.3.12 (opcache enabled)
- Swoole 4.4.13
- Shadowfax 2 (20 worker processes)
This environment is my personal Macbook Pro, which has better performance. I used wrk to start 4 threads and conducted a stress test with 200 concurrency:
wrk -t4 -c200 http://127.0.0.1:1215/
The result was 12430 rps:
Running 10s test @ http://127.0.0.1:1215/ 4 threads and 200 connections Thread Stats Avg Stdev Max +/- Stdev Latency 26.44ms 31.44ms 212.73ms 84.28% Req/Sec 3.13k 839.99 6.07k 65.75% 124418 requests in 10.01s, 312.06MB read Socket errors: connect 0, read 54, write 0, timeout 0 Requests/sec: 12430.20 Transfer/sec: 31.18MB
Environment 2:
- Hardware: 2 CPUs, 2 Cores, 4GB Memory
- CentOS 7.5.1804
- PHP 7.3.16 (opcache enabled)
- Swoole 4.4. 17
- Shadowfax 2 (10 worker processes)
This environment is a virtual cloud server instance of a certain cloud, with general configuration. I used wrk to start 2 threads and conducted a stress test with 100 concurrency:
wrk -c100 http://127.0.0.1:1215/
The result is 4001 rps:
Running 10s test @ http://127.0.0.1:1215/ 2 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 25.06ms 12.11ms 85.92ms 60.94% Req/Sec 4.02k 41.46 4.08k 79.79% 40321 requests in 10.08s, 101.13MB read Requests/sec: 4001.76 Transfer/sec: 10.04MB
Is the performance pretty good? Compared with the traditional PHP-FPM, it has been greatly improved.
Installation and use
The installation of Shadowfax is very simple and only requires two steps:
The first step is to use Composer to install Shadowfax into your Laravel project Go to:
composer require huang-yi/shadowfax
The second step is to use Laravel’s Artisan command shadowfax:publish
to publish the configuration file:
php artisan shadowfax:publish
After execution, in your project root directory A configuration file named shadowfax.yml
will be created, which you need to adjust according to the environment. Of course, this file will be automatically added to .gitignore
, just like the .env
file. The configuration may be different in different environments.
Now you can start your service through the Shadowfax command:
php shadowfax start
If it is the default configuration, you can access it through http://127.0.0.1:1215
your application. Of course, this is just for simple use. More information can be found on the Shadowfax project homepage.
Why choose Shadowfax
Of course, some friends will ask, there are already similar open source projects on Github, why do we need to reinvent the wheel again. In fact, this is not the case. I started trying to integrate Swoole and Laravel as early as 2016, and have open sourced two related projects. Currently, the swooletw/laravel-swoole with the highest number of stars in this regard is the fork of huang-yi/ that I released earlier. laravel-swoole-http. But I didn’t promote my project because I knew very well that previous projects had more or less problems and could not support coroutines well, and coroutines happen to be Swoole’s strongest weapon, so All gave up.
Now, Shadowfax can support coroutines very well, you can safely enable Swoole's coroutine features. Moreover, Shadowfax also solves the problem of database connection in the coroutine environment. When you enable Swoole's one-click coroutine, Shadowfax will automatically create a connection pool for your database connection. The most important thing is that all this is insensible at the level of your application code. You can still write business code as usual without any mental burden, because Shadowfax does not require you to make any changes in the way you write code.
Finally, what I want to explain is that Shadowfax did not deliberately give Laravel the ability to use Swoole. Its main purpose is: To improve Laravel at the minimum cost without destroying the Laravel development experience. Application performance. I also don’t recommend developers to use any interface of Swoole in Laravel, because Laravel itself is a framework that runs in the traditional PHP mode and is not friendly to Swoole. If you are not an experienced Swoole developer, it is easy to use it during use. Something went wrong. If your Laravel application does not use any Swoole interface, it means that your program can also run in PHP-FPM mode. Once there is a problem with the program running on Swoole, we can immediately switch back to PHP-FPM mode. , which can ensure the availability of the program.