swoole加速laravel框架
- swoole是什么?如何安装?
- swoole初步体验
- php运行的运行模式
- swoole加速laravel的原理
- laravel使用swoole的组件
1. swoole是什么?如何安装?
1.1 swoole是什么
Swoole 是一个使用 C++ 语言编写的基于异步事件驱动和协程的并行网络通信引擎,为 PHP 提供协程、高性能网络编程支持。提供了多种通信协议的网络服务器和客户端模块,可以方便快速的实现 TCP/UDP服务、高性能Web、WebSocket服务、物联网、实时通讯、游戏、微服务等,使 PHP 不再局限于传统的 Web 领域。
swoole的优势
- 常驻内存,避免重复加载带来的性能损耗,提升海量性能
- 协程异步,提高对 I/O 密集型场景并发处理能力(如:微信开发、支付、登录等)
- 方便地开发 Http、WebSocket、TCP、UDP 等应用,可以与硬件通信
1.2 swoole的安装
1.获取swoole安装包,地址:https://pecl.php.net/package/swoole
2\. 解压swoole安装包
tar –zxvf swoole-4.6.6.tar
3. 将解压出来的安装包copy到php容器
docker cp /home/swoole php:/usr/src/php/ext/swoole
4. 安装swoole
docker-php-ext-install swoole
5. 完成安装后,查看swoole信息
php --ri swoole
2. swoole初步体验
安装好swoole之后,我们可以简单来进行一次体验,也是验证我们是否安装完好swoole以及swoole的扩展。代码如下:
<?php
$http = new swoole\Http\Server('0.0.0.0', 9501);
$http->on('Request', function ($request, $response) {
$response->header('Content-Type', 'text/html; charset=utf-8');
$response->end('<h1>Hello Swoole. #' . rand(1000, 9999) . '</h1>');
});
$http->start();
?>
代码解释:
实例化一个swoole的http服务类,并传递监听的端口以及host,HTTP 服务器只需要关注请求响应即可,所以只需要监听一个 onRequest 事件。当有新的 HTTP 请求进入就会触发此事件。事件回调函数有 2 个参数,一个是 $request 对象,包含了请求的相关信息,如 GET/POST 请求的数据。
另外一个是 response 对象,对 request 的响应可以通过操作 response 对象来完成。$response->end() 方法表示输出一段 HTML 内容,并结束此请求
0.0.0.0 表示监听所有 IP 地址,一台服务器可能同时有多个 IP,如 127.0.0.1 本地回环 IP、192.168.1.100 局域网 IP、210.127.20.2 外网 IP,这里也可以单独指定监听一个 IP
9501 监听的端口,如果被占用程序会抛出致命错误,中断执行。
测试如下:
启动之后在容器内部进行请求:
3. php运行的运行模式
3.1 cgi模式
CGI 是一个协议,所以,PHP 有自己对 CGI 的实现,那就是 PHP-CGI。可是呢,随着技术的发展,人们开始意识到,PHP-CGI 的性能不是那么尽如人意。PHP 在运行的时候,是依赖配置文件 php.ini的。所以,每当 PHP-CGI 开始工作的时候,它是完完全全的一个新进程,它需要重新加载配置文件并初始化,这就造成了很大的资源和时间的浪费。
那么怎么解决这个问题呢?
3.2 fastcgi模式
为什么不预先加载好配置,然后,每一个执行的任务只需要复制当前的进程,不就能避免上面的浪费了么。于是, FastCGI 便横空出世。
FastCGI,全称 Fast Common Gateway Interface,中文译作“快速公共网管接口”。没错,这又是个协议。当然,这个协议并不是因为 PHP 才有的。
Apache
对于 PHP 来说,httpd 是通过自身来实现一个 FastCGI 的模块的。它会预先加载好 php.ini 文件中的配置。待到有请求进入需要 PHP 处理时,PHP 就不需要再对 php.ini 重新加载了。这也就是每改动过 php.ini 后都要重启 httpd 服务的原因。
nginx
php-fpm 也是 FastCGI 的一种实现。通常我们是将 Nginx 的 PHP 处理部分代理到 php-fpm 的端口上,交给 php-fpm 来处理。而 php-fpm 同样是通过预先加载配置,然后给到子进程的方式的,它会对进程做一些管理。
4. swoole加速laravel的原理
http-Server服务,这是服务可以用于web项目开发中、也可以用于对laravel,thinkphp等框架进行加速; 如果想利用swoole加速框架、框架的条件必须是ioc类型因为swoole是常驻内存。
swoole解决的问题
我们用的 PHP 主要用于 web 开发,通过 nginx、apache 等服务端程序调用 php-fpm 处理服务端的业务逻辑,处理完后 php 撤消内存并返回结果。一个 web 请求就要加载一次 php 的全部文件,需要的系统资源开销很大,这是目前 php-fpm 的缺点之一;并且因为 php-fpm 在一次请求结束就释放内存,无法做连接池,也不合适 service 端的开发。
php-fpm 的优缺点:
优点:
- 部署简单
- 调试方便
- 基于传统 php 的项目非常多,易于参考
缺点:
- 每次 http 请求都要加载全部的项目文件
- php-fpm 性能不佳,并发性能不好
- 核心不支持异步IO处理,IO密集型请求响应变长
- 对网络通信协议的支持不好,应用场景基本被限制在web领域
swoole是如何解决php-fpm遇到的问题的?
swoole如何避免文件的反复加载:
swoole是完全的长驻内存的,长驻内存一个最大的好处就是可以性能加速。在fpm模式下,我们处理一个请求,通常会有一些空消耗,比如框架共用文件加载,配置文件加载,那么在swoole中,可以在onworkerstart的时候提前一次性把一些必要的文件和配置加载好,不必每次receive重复加载一遍,这样能提升不小的性能。
常驻内存 常驻内存。传统 PHP框架或者单文件,在处理每个请求之前,都要做一遍加载框架文件、配置的操作,请求完成之后会释放所有资源和内存,无须担心内存泄漏。但是如果请求数量上升,并发很高的时候,快速创建资源,又马上释放,会导致 PHP 程序运行效率急剧下降。而使用 Swoole 则没有这个问题:PHP的代码加载到内存后,拥有更长的生命周期,这样建立的数据库连接和其他大的对象,不被释放。每次请求只需要处理很少的代码,而这些代码只在第一次运行时,被 PHP 解析器编译,驻留内存。以后都是直接载入 OPCODE ,让 Zend 引擎直接运行。另外,之前PHP不能实现的,如数据库连接池,缓存连接池都可以在Swoole引擎下实现。系统的运行效率会大大提高。
5. laravel使用swoole的组件
在 Laravel 应用中使用 Swoole 之前,先通过 Composer 安装 LaravelS 扩展包:
composer require hhxsv5/laravel-s
该扩展包具备自动发现功能(Laravel 5.5 以上版本可用),无需手动在 config/app.php 配置文件中注册,安装完成后,运行如下 Artisan 命令相应脚本和配置文件发布到根目录下:
php artisan laravels publish
该命令会发布配置文件 laravels.php 到 config 目录下,以及脚本文件到 bin 目录下:
你可以在配置文件中对 Swoole 进行一些基本配置,而脚本文件主要用于管理 Swoole 服务的启动、重载、关闭等操作。
配置
也可以在.env 修改工作进程数并重启服务
LARAVELS_LISTEN_IP=0.0.0.0
LARAVELS_LISTEN_PORT=5200
LARAVELS_WORKER_NUM=4
更多配置项: github.com/hhxsv5/laravel-s/blob/m...
启动 LaravelS
完成上述操作后,就可以通过 [^php bin/laravels start] 命令启动 LaravelS 了:
这样,Swoole 服务就被启动起来,监听 5200 端口,如果有请求发送到这个端口,它就可以进行处理。
此外 php bin/laravels 还支持其它命令对 LaravelS 进行管理:
命令 说明 start 启动laravelS,展示已启动的进程列表 “ps -ef / grep laravelS” 支持选项 “-d /–daemonize” 以守护进程的方式运行,此选项将覆盖laravels.php中swoole.daemonize设置;支持选项 “-e /–env” 用来指定运行的环境,如 –env=testing将会优先使用配置.env.testing,这个特性要求laravel5.2+ stop 停止laravelS restart 停止laravelS,支持选项 “-d / –daemonize ”和 “-e / –env” reload 平滑重启索引Task/Worker,这些进程包含了你的业务代码,不会重启Master/Manger/Timer/Custom进程 info 显示组件的版本信息 help 显示帮助信息
通过 Supervisor 管理 LaravelS
如果是在生产环境使用,推荐使用 Supervisor 对 LaravelS 服务进行管理,从而提供服务的稳定性,相应的配置示例如下:
[program:laravel-s-test]
command=php /www/wwwroot/lms/blog/bin/laravels start -i
numprocs=1
autostart=true
autorestart=true
startretries=3
user=root
redirect_stderr=true
stdout_logfile=/www/wwwroot/lms/blog/storage/logs/supervisord-stdout.log
其中 /www/wwwroot/lms/blog 为 Web 项目的目录,你可以根据自己的项目路径进行修改。