Home  >  Article  >  PHP Framework  >  Using Swoole to improve Laravel performance (Shadowfax)

Using Swoole to improve Laravel performance (Shadowfax)

藏色散人
藏色散人forward
2021-05-25 14:45:442798browse

The following is the tutorial column of laravel to introduce Shadowfax: Let Laravel wear the sword of Swoole, I hope it will be helpful to friends in need!

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.

The above is the detailed content of Using Swoole to improve Laravel performance (Shadowfax). For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:segmentfault.com. If there is any infringement, please contact admin@php.cn delete