本篇文章给大家带来的内容是关于 swoole 运行模式加速 Laravel 应用的详细介绍, 有一定的参考价值, 有需要的朋友可以参考一下, 希望对你有所帮助.
一, Swoole
Swoole 号称重新定义了 PHP, 它是一个 PHP 扩展, 使得 PHP 可以使用异步的方式执行, 就像 node 一样, 而且还能使用 socket, 为 PHP 提供了一系列异步 IO, 事件驱动, 并行数据结构功能.
Swoole4 支持完整的协程编程模式, 可以使用完全同步的代码实现异步程序. PHP 代码无需额外增加任何关键词, 底层自动进行协程调度, 实现异步 IO .
Node.JS 能实现的 swoole 几乎都能实现, 而且性能比 Node.JS 更高, 毕竟 Node.JS 是单线程的无法充分发挥 CPU 性能, swoole 是多线程的可以充分发挥 CPU 的性能.
Swoole 高效跟传统的 web 开发有什么区别, 除了传统的 LAMP/LNMP 同步开发模式, swoole 的异步开发模式是怎样的, 如何保持高效?
二, 传统 Web 开发模式
PHP Web 开发采用的方式是 LAMP/LNMP 架构, 即 Linux,Nginx,MySQL 和 PHP. 这里以 nginx 来举例, 大致结构为:
当请求进入时, Web server 将请求转交给 PHP-FPM,PHP-FPM 是一个进程池架构的 FastCGI 服务, 内置 PHP 解释器. FPM 负责解释执行 PHP 文件生成响应, 最终返回给 Web server, 展现至前端. PHP 文件中实现了许多业务逻辑, 包括 MySQL 和 Nosql 的访问, 调用第三方应用等等.
这样的结构 PHP-fpm 和 nginx 的配合已经运行得足够好, 但是由于 PHP-fpm 本身是同步阻塞进程模型, 在请求结束后释放所有的资源 (包括框架初始化创建的一系列对象), 导致 PHP 进程 "空转"(创建<--> 销毁 <--> 创建)消耗大量的 CPU 资源, 从而导致单机的吞吐能力有限.
每次请求处理的过程都意味着一次 PHP 文件解析, 环境设置等不必要的耗时操作 PHP 进程处理完即销毁, 无法在 PHP 程序中使用连接池等技术实现性能优化.
三, Swoole 运行模式
针对传统架构的问题, swoole 从 PHP 扩展出发, 解决了上述问题, 对于 swoole 的进程模型, 我们已经了解过了.
相比于传统架构, Swoole 进程模型最大的特点在于其多线程 Reactor 模式处理网络请求, 使得其能轻松应对大量连接.
除此之外的优点还包括:
全异步非阻塞, 占用资源开销小, 程序执行效率高
程序运行只解析加载一次 PHP 文件, 避免每次请求的重复加载
进程常驻, 使得连接池和请求之间信息传递等的实现成为可能
四, 为什么要在 Swoole 上运行 Laravel?
Laravel 框架启动的时候需要加载很多文件, 再加上其出了名的生态环境好, 所以在开发过程中我们就会发现有非常多的已经造好的轮子, 这也就使得 Laravel 的一次启动的磁盘 IO 特别高(就是要加载很多文件嘛)
Laravel 生命周期需要在每次请求的时候都执行一遍. 因为单个请求创建的环境在请求执行结束后会立即销毁.
换句话说, 在传统的 PHP 生命周期中, 为了脚本执行而浪费了大量的时间去创建和销毁资源. 想象一下像 Laravel 这样的框架, 在每次请求中需要加载多少文件? 同时也浪费了大量的 I/O 操作.
因此如果我们利用 Swoole 内置一个应用级别的 Server, 并且所有脚本文件在加载一次之后便可以保存在内存中呢? 这就是为什么我们需要尝试在 Swoole 上运行 Laravel. Swoole 可以提供强大性能而 Laravel 则可以提供优雅代码结构使用. 这俩儿真是完美组合 !
五, 使用 Swoole 提升 Laravel 的性能
在现有的轮子中, 感觉下面这两个还是非常不错的, 可以自行选择
- swooletw/Laravel-swoole
- garveen/laravoole
本人选择了第一个来测试
使用 Composer 安装:
Composer require swooletw/Laravel-swoole
如果你使用的是 Laravel, 那么在 config/App.PHP 的 providers 数组中加上
SwooleTW\Http\LaravelServiceProvider::class,
如果你使用的是 Lumen, 那么在 Bootstrap/App.PHP 中加入如下代码
$App->register(SwooleTW\Http\LumenServiceProvider::class);
将配置文件导出到 config 目录下
PHP artisan vendor:publish --provider="SwooleTW\Http\HttpServiceProvider"
然后可以去 config/swoole_http.PHP 中配置信息
- 'server' => [
- 'host' => env('SWOOLE_HTTP_HOST', '0.0.0.0'),// 监听任意 ip
- 'port' => env('SWOOLE_HTTP_PORT', '1215'),
- 'options' => [
- 'pid_file' => env('SWOOLE_HTTP_PID_FILE', base_path('storage/logs/swoole_http.pid')),
- 'log_file' => env('SWOOLE_HTTP_LOG_FILE', base_path('storage/logs/swoole_http.log')),
- 'daemonize' => env('SWOOLE_HTTP_DAEMONIZE', 1),//1 - 程序将转入后台作为守护进程运行
- ],
- ],
swoole_http.PHP 里还提供配置 providers 数组,
- 'providers' => [
- // App\Providers\AuthServiceProvider::class,
- ]
因为使用 swoole 作为 http 后, 这些 providers 会被存到内存中, 所以这里配置的是每次请求都想要重新注册和重新启动的 providers.
现在, 你可以执行以下的命令来启动 Swoole HTTP 服务.
$ PHP artisan swoole:http start
然后你可以看到以下信息:
- Starting swoole http server...
- Swoole http server started: <http://0.0.0.0:1215>
现在可以通过访问 http://127.0.0.1:1215 来进入 Laravel 应用.
注意: 该拓展是不支持热启动的, 所以每次有代码更新都要重启服务 PHP artisan swoole:http restart
六, 性能测试
使用 Apache 的 ab 测试工具
ab -n 1000 -c 10 http://127.0.0.1:1215/
参数说明:-n 1000 个请求 -c 10 个并发数
图一是使用 swoole 作为应用服务器, 图二是 apache 服务器
测试环境在虚拟机中, 电脑配置也较差, 性能没有完全发挥出来, 可以看到 apache 只完成 197 次请求就扛不住压力了, swoole HTTP 服务 完成了压测, 性功完全碾压 apache 服务器.
七, 使用 Nginx 代理
swoole 在官网也提到过: swoole_http_server 对 Http 协议的支持并不完整, 建议仅作为应用服务器. 并且在前端增加 Nginx 作为代理.
那么, 我们就增加需要配置 nginx.conf 里的 server:
- server {
- listen 80;
- server_name your.domain.com;
- root /path/to/Laravel/public;
- index index.PHP;
- location = /index.PHP {
- # Ensure that there is no such file named "not_exists"
- # in your "public" directory.
- try_files /not_exists @swoole;
- }
- location / {
- try_files $uri $uri/ @swoole;
- }
- location @swoole {
- set $suffix "";
- if ($uri = /index.PHP) {
- set $suffix "/";
- }
- proxy_set_header Host $host;
- proxy_set_header SERVER_PORT $server_port;
- proxy_set_header REMOTE_ADDR $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- # IF https
- # proxy_set_header HTTPS "on";
- proxy_pass http://127.0.0.1:1215$suffix;
- }
- }
配置可参考 swoole 方文档官 Nginx/Apache 配置
至此, 大功告成, 你可以像平常一样访问你的网站了.
八, 使用 swoole 和传统 PHP 开发的缺点
本文主要介绍了使用 swoole 作为 Laravel 的应服务器, 最后说下使用 swoole 和传统 PHP 开发的缺点.
1, 更难上手. 这要求开发人员对于多进程的运行模式有更清晰的认识
2, 更容易内存泄露. 在处理全局变量, 静态变量的时候一定要小心, 这种不会被 GC 清理的变量会存在整个生命周期中, 如果没有正确的处理, 很容易消耗完所有的内存. 在 PHP-fpm 下, PHP 代码执行完内存就会被完全释放.
以上就是 swoole 运行模式加速 Laravel 应用的详细介绍的详细内容
来源: https://www.cnblogs.com/a609251438/p/12078354.html