docker搭建环境详见https://www.jianshu.com/p/a4c426469c97
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.tgz
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的扩展。代码如下:
on('Request', function ($request, $response) {
$response->header('Content-Type', 'text/html; charset=utf-8');
$response->end('Hello Swoole. #' . rand(1000, 9999) . '
');
});
$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 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引擎下实现。系统的运行效率会大大提高。
4 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 # 监听的ip
LARAVELS_LISTEN_PORT=5200 # 端口
LARAVELS_WORKER_NUM=4 # 工作进程数
更多配置项: https://github.com/hhxsv5/laravel-s/blob/master/Settings-CN.md
启动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 | 显示帮助信息 |