基于 Swoole 实现高性能 HTTP 服务器 | 快速入门 | Swoole 从入门到实战教程


本站和网页 https://laravelacademy.org/post/9801.html 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

基于 Swoole 实现高性能 HTTP 服务器 | 快速入门 | Swoole 从入门到实战教程
Laravel 学院
文档
Laravel 8.x 中文文档
Laravel 7.x 中文文档
Laravel 6.x 中文文档
Laravel 5.8 中文文档
Laravel 5.7 中文文档
Laravel 5.6 中文文档
Laravel 5.5 中文文档
Laravel 5.4 中文文档
Laravel 5.3 中文文档
Laravel 5.2 中文文档
Laravel 5.1 中文文档
Lumen 中文文档
全栈教程
PHP 全栈工程师指南
PHP 入门到实战
Laravel 入门到精通
Vue.js 入门到实战
玩转 PhpStorm 教程
Laravel 博客入门项目
Laravel 微信小程序项目
Laravel 前后端分离项目
Swoole 入门到实战
Eloquent 性能优化实战
Redis 高性能实战系列
Laravel 新版本特性
PHP 新特性与最佳实践
Golang
Go 入门教程
Go Web 编程
Gin 使用教程
微服务开发
内功修炼
数据结构与算法
网络协议
微服务从入门到实践
高性能 MySQL 实战
高性能 Redis 实战
Laravel 消息队列实战
Laravel 从学徒到工匠
PHP 设计模式系列
名企面试指南
资源库
Laravel 资源大全
Laravel 开源项目
Laravel 扩展包
Laravel 资源下载
更多
博客 & 新闻
问答 & 讨论
Leetcode 题解
学院君读书笔记系列
关于 Laravel 学院
Laravel 互助学习群
Golang 互助学习群
更多
Laravel 中文文档
Laravel 全栈教程
Laravel 学习路径
Go 入门教程
程序员内功修炼
博客
问答
搜索
注册
登录
Info
Content
章节导航
Swoole 从入门到实战教程
目录索引
快速入门
4篇文章
Swoole 扩展安装与使用入门
基于 Swoole 实现高性能 HTTP 服务器
基于 Swoole 实现简单的 WebSocket 服务器及客户端
在 Laravel 中集成 Swoole 实现 WebSocket 服务器
异步处理
3篇文章
基于 Swoole 定时器实现毫秒级任务调度
基于 Swoole 在 Laravel 中实现异步任务队列
基于 Swoole 在 Laravel 中实现异步事件监听及处理
并发编程之多进程篇
4篇文章
通过 Process 模块在 PHP 中实现多进程(一):简单的多进程 TCP 服务器实现
基于 Process 模块在 PHP 中实现多进程(二):进程间通信
基于 Process\Pool 通过进程池实现数据库和 Redis 的持久连接
通过 Swoole\Table 实现 Swoole 多进程数据共享
并发编程之协程篇
4篇文章
基于 Swoole 实现协程篇(一):基本概念和底层原理
基于 Swoole 实现协程篇(二):通过协程实现并发编程
基于 Swoole 实现协程篇(三):在 Laravel 框架中使用协程
基于 SMProxy 通过协程调度实现 MySQL 连接池
底层原理篇
2篇文章
Swoole 的底层架构及运行原理
Swoole 驱动的 Laravel 应用优化原理及注意事项
实战篇
19篇文章
基于 Swoole 实现支持高并发的实时弹幕功能(上)
基于 Swoole 实现支持高并发的实时弹幕功能(下)
基于 Swoole 开发实时在线聊天室(一):环境准备篇
基于 Swoole 开发实时在线聊天室(二):后台数据库准备和 API 认证功能实现
基于 Swoole 开发实时在线聊天室(三):后台 WebSocket 服务器实现
基于 Swoole 开发实时在线聊天室(四):前端资源初始化
基于 Swoole 开发实时在线聊天室(五):Homestead 开发环境初始化
基于 Swoole 开发实时在线聊天室(六):建立 socket.io 客户端与 Swoole Websocket 服务器的连接
基于 Swoole 开发实时在线聊天室(七):基于 Muse UI 3.0 的前端用户认证功能实现
基于 Swoole 开发实时在线聊天室(八):Websocket 服务端重构与用户认证
基于 Swoole 开发实时在线聊天室(九):实现客服机器人聊天功能
基于 Swoole 开发实时在线聊天室(十):用户登录后获取未读消息数
基于 Swoole 开发实时在线聊天室(十一):进入聊天室后获取历史聊天记录
基于 Swoole 开发实时在线聊天室(十二):加入和退出聊天室房间功能实现
基于 Swoole 开发实时在线聊天室(十三):发送文本/表情消息
基于 Swoole 开发实时在线聊天室(十四):发送图片消息
基于 Swoole 开发实时在线聊天室(十五):实现用户头像上传功能
基于 Swoole 开发实时在线聊天室(十六):轮询保持长连接优化
基于 Swoole 开发实时在线聊天室(十七):Websocket 通信用户认证逻辑优化
图书
Swoole 从入门到实战教程
快速入门
基于 Swoole 实现高性能 HTTP 服务器
基于 Swoole 实现高性能 HTTP 服务器
由 学院君 创建于3年前, 最后更新于 3年前
版本号 #2
48321 views
15 likes
0 collects
在上篇教程中,学院君给大家介绍了 Swoole 的基本概念和安装配置,从这篇教程开始,学院君将结合 Laravel 框架在应用中通过 Swoole 实现高性能 HTTP 服务器、WebSocket 服务器、协程、异步事件监听、异步任务队列、毫秒级任务调度、MySQL 线程池等高级特性,从而提高 Laravel 应用整体性能。
当然,这些特性都是 Swoole 底层所支持的,并且已经有第三方扩展包 LaravelS 将其整合到 Laravel 框架,我们可以通过这个扩展包轻松在 Laravel 应用中实现上述特性。接下来,我们就来演示如何通过这个扩展包在 Laravel 框架中基于 Swoole 的这些特性来实现高性能 Laravel 应用。
需要声明的是,基于 Swoole 特性提升应用性能只是提高应用整体性能的一种方式,不是唯一方式。LaravelS 也不是在 Laravel 框架中使用 Swoole 的唯一方式,只是我们基于这个扩展包可以快速入门,免去很多不必要的配置和整合操作,你可以将其看作套在 Swoole 之上的一层壳,或者一个代理,真正提供服务的还是底层的 Swoole。
安装配置 LaravelS
在 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 服务的启动、重载、关闭等操作。
启动 LaravelS
完成上述操作后,就可以通过 php bin/laravels start 命令启动 LaravelS 了:
这样,Swoole 服务就被启动起来,监听本地的 5200 端口,如果有请求发送到这个端口,它就可以进行处理。
此外 php bin/laravels 还支持其它命令对 LaravelS 进行管理:
通过 Supervisor 管理 LaravelS
如果是在生产环境使用,推荐使用 Supervisor 对 LaravelS 服务进行管理,从而提供服务的稳定性,相应的配置示例如下:
[program:laravel-s-test]
command=/user/local/bin/php /path/to/project/bin/laravels start -i
numprocs=1
autostart=true
autorestart=true
startretries=3
user=www-data
redirect_stderr=true
stdout_logfile=/path/to/project/storage/logs/supervisord-stdout.log
其中 /path/to/project 为 Web 项目的目录,你可以根据自己的项目路径进行修改。
基于 LaravelS 构建 HTTP 服务器
这里我们以 Laradock + Nginx 为例,进行示例演示,使用 Apache 作为 Web 服务器的话可以参考官方文档。
配置 Nginx
我们知道在使用 Nginx 作为 Web 服务器的时候,前端资源文件,比如 CSS、JS、图片等静态资源都是通过 Nginx 进行处理的,比较高效,而 PHP 脚本请求这种动态资源都是转发到后端 PHP-FPM 进程进行处理,如果要基于 Swoole 实现高性能 HTTP 服务器,则这个 HTTP 服务器替代的也是 PHP-FPM 的职能,也就是说,我们将原本转发到 PHP-FPM 进程的请求转发给 Swoole 进行处理。在本例中,就是转发给 LaravelS 服务。
为此,我们在 Nginx 中新增一个站点配置 blog-s.conf,编写示例配置如下:
upstream laravels {
# Connect IP:Port
server workspace:5200 weight=5 max_fails=3 fail_timeout=30s;
keepalive 16;
server {
listen 80;
server_name blog-s.test;
root /var/www/blog/public;
index index.php index.html index.htm;
# Nginx 处理静态资源,LaravelS 处理动态资源
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;
然后我们配置一个虚拟域名 blog-s.test。
配置 Laravel 应用
接下来,在 blog 项目根目录下打开 .env,新增下面两条配置:
LARAVELS_LISTEN_IP=workspace
LARAVELS_DAEMONIZE=true
LARAVELS_LISTEN_IP 用于设置 LaravelS 监听的 IP 地址,这里的地址和 Nginx 配置转发的 IP 地址保持一致,就是 workspace 容器名,LARAVELS_DAEMONIZE 用于设置后台启动 LaravelS 服务。
最后重新构建并重启 Laradock 相关服务:
docker-compose build workspace nginx
docker-compose down
docker-compose up -d nginx mysql redis memcached
然后进入 workspace 所在容器,到 blog 项目目录下运行 php bin/laravels start 启动 LaravelS 后端服务,此时,该服务会在后端运行:
访问基于 LaravelS 驱动的应用
在浏览器中访问 http://blog-s.test/,可以正常访问:
性能对比测试
本篇教程最高潮的部分来了。下面我们通过压力测试工具 ab 分别对基于 PHP-FPM 和 LaravelS(Swoole) 驱动的应用进行性能对比测试,两者共享同一份项目代码,都是基于 Laradock 环境,除了处理后端请求的服务不同之外,运行环境完全一致。
首先来看基于 PHP-FPM 的 blog.test,我们假设总请求数是 100,并发数是 10,运行结果如下:
返回的数据很多,核心关注的是每秒请求数(Requests per second),基于 PHP-FPM 驱动的博客应用首页每秒仅支持 2.28 个请求,下面再看看基于 Swoole 驱动的 blog-s.test,测试条件完全一样:
可以看到其每秒支持的请求数是 20.24,即每秒可处理20个请求,是前者的 10 倍!真是没有对比就没有伤害。。。
当然,这仅仅是在本地开发环境进行的简单测试,线上生产环境数据可能会有出入,但总体来说,基于 Swoole 的后端 HTTP 服务器性能更好是毋庸置疑的。
Laravel
教程
Swoole
HTTP
高性能
压力测试
ab
PHP-FPM
Nginx
TPS
扩展包
点赞
取消点赞
收藏
取消收藏
赞赏
分享到以下平台:
<< 上一篇:
Swoole 扩展安装与使用入门
>> 下一篇:
基于 Swoole 实现简单的 WebSocket 服务器及客户端
35 条评论
#31
zhangtao
评论于 2年前
&bull;
更新于 2年前 (zhangtao)
正在删除评论...
php bin/laravels start 这个命令启用的PHP是宿主机环境的PHP7.2,并不是docker 中的PHP 7.4;
php -v 也是启动的宿主机环境的PHP7.2;
怎么在宿主机 使用 docker中 PHP 的环境变量呢?(docker中nginx、mysql、PHP是单独安装的)
#32
弓长
评论于 2年前
回复 #31
正在删除评论...
要进入到 php 的容器里,并进入项目目录,然后执行 php bin/laravels start 命令
#33
LogicArtist
评论于 2年前
正在删除评论...
我这压测结果性能提升也就70%,不了解laravels的优化原理,是像laravel-swoole哪样吗?如果仅仅异步的话,当磁盘读写速度很快的时候,性能优化的效果越小,比如我的mbp16,实际提升效果一般般吧!
#34
学院君
评论于 2年前
回复 #33
正在删除评论...
看下这个:https://xueyuanjun.com/post/19832
#35
Alex
评论于 2年前
正在删除评论...
我这里用fpm的rps是10左右,用了swoole后有600多,提升了60倍左右。
&lsaquo;
&rsaquo;
登录后即可添加评论
升级为学院君订阅用户(新年优惠🎁)
内容导航
安装配置 LaravelS
启动 LaravelS
通过 Supervisor 管理 LaravelS
基于 LaravelS 构建 HTTP 服务器
配置 Nginx
配置 Laravel 应用
访问基于 LaravelS 驱动的应用
性能对比测试
相关推荐
LaravelS 站在巨人的肩膀上,通过Swoole加速Laravel/Lumen
Laravel 优质扩展包
性能优化
基于 Swoole 实现简单的 WebSocket 服务器及客户端
Swoole 从入门到实战教程
快速入门
在 Laravel 中集成 Swoole 实现 WebSocket 服务器
Swoole 从入门到实战教程
快速入门
基于 Swoole 在 Laravel 中实现异步任务队列
Swoole 从入门到实战教程
异步处理
目录索引
Swoole 从入门到实战教程
回到顶部
2022 基于 Laravel 6 构建
关于学院
订阅服务
友情链接
站点地图
本站 CDN 加速服务由又拍云赞助

Copyright ©uecom 京ICP备18064371号-3 IPV6
2024-03-29 06:22:27
zxsbr.com
10.0.12.16