1. 简介
在swoole中可以为我们提供http服务,http服务既可以用于我们日常的web开发中,同时它也可以对thinkphp、laravel等框架进行加速,但要使用swoole对常规框架加速,该框架必须是IOC类型的才可以,这是因为swoole是常驻内存的。
在日常的web开发中,Nginx等服务端程序通过调用php-fpm 处理服务端的业务逻辑,处理完成后销毁内存并返回结果。这时一个 web 请求就要加载一次 php 的全部文件,需要的系统资源开销很大,这是目前 php-fpm 的缺点之一;并且因为 php-fpm 在一次请求结束就释放内存,无法做连接池,也不合适 service 端的开发。
2. php-fpm优缺点
2.1. 优点
- 部署简单
- 调试方便
- 基于传统 php 的项目非常多,易于参考
2.2. 缺点
- 每次 http 请求都要加载全部的项目文件
- php-fpm 性能不佳,并发性能不好
- 核心不支持异步IO处理,IO密集型请求响应变长
- 对网络通信协议的支持不好,应用场景基本被限制在web领域
3. swoole的区别
swoole是完全的长驻内存的,长驻内存一个最大的好处就是可以性能加速。在swoole中可以在onworkerstart的时候提前一次性把一些必要的文件和配置加载好,不必每次receive重复加载一遍,这样能提升不小的性能。
4. swoole加速laravel框架
<?php
define('LARAVEL_START', microtime(true));
require __DIR__.'/../vendor/autoload.php';
// 初始化laravel的应用程序
$app = require_once __DIR__.'/../bootstrap/app.php';
// 创建laravel的http处理核心对象
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
// 高性能HTTP服务器
$http = new Swoole\Http\Server("0.0.0.0", 9501);
// http请求事件
$http->on("request", function ($request_swoole, $response_swoole) use ($kernel){
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
// 返回结果
$response_swoole->end($response->send());
// 停止中间件
$kernel->terminate($request, $response);
});
$http->start();
5. laravel使用swoole的组件
# 安装laravel
composer create-project --prefer-dist laravel/laravel blog
# 安装LaravelS扩展包
composer require hhxsv5/laravel-s
# 运行Artisan命令将相应脚本和配置文件发布到根目录下
# 该命令会发布配置文件laravels.php到config目录下,以及脚本文件到 bin 目录下
php artisan laravels publish
# 修改.env文件下的环境变量
LARAVELS_LISTEN_IP=0.0.0.0
LARAVELS_LISTEN_PORT=5200
LARAVELS_WORKER_NUM=4
# 启动
php bin/laravels start
5.1. laravelS常用命令
- php bin/laravels start 启动
- php bin/laravels stop 停止
- php bin/laravels info 显示组件的版本信息
- php bin/laravels help 显示帮助信息
- php bin/laravels restart 重启
- php bin/laravels reload 平滑重启
6. nginx反向代理laravels
# 查看容器内部ip
docker inspect nginx| grep "IP"
# 配置Nginx配置文件
upstream laravels {
# 172.17.0.4是容器内部ip
server 172.17.0.4:5200 weight=5 max_fails=3 fail_timeout=30s;
keepalive 16;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
root /docker/www/blog/public;
index index.php index.html;
location / {
try_files $uri @laravels;
}
location @laravels {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header Server-Protocol $server_protocol;
proxy_set_header Server-Name $server_name;
proxy_set_header Server-Addr $server_addr;
proxy_set_header Server-Port $server_port;
proxy_pass http://laravels;
}
}
# 重启docker容器
docker restart nginx