swoole+thinkphp从零开始打造高性能直播赛事
一、swoole简介
1、简介
- PHP异步网络通信引擎
- 最终编译为so文件作为PHP扩展
2、应用
- C编写,消息队列,毫秒定时器,php的异步多线程服务器
- 支持长连接
- 移动api服务器、高性能服务器、等
3、目标
- 学习swoole 实战 系统优化
- 安装php7和swoole(源码安装)
- swoole基础:
- 网络通信引擎TCP UDP WEBSOCKET HTTP
- swoole进阶
- 异步mysql
- 异步redis
- 异步文件
- 异步task任务
- 毫秒定时器
- 进程、携程、内存
- 消息队列
- 实战
- 登录模块
- 赛事直播模块
- 聊天室模块
- 系统监控
- 系统调优
二、学习Swoole的准备工作
1、linux开发环境
2、php7 swoole2.1 redis
3、源码安装php7 源码安装swoole
4、如何学习swoole
- 查看文档
- 实现swoole特性的功能点
- 多看看其他现有的swoole的经典代码
三、linux环境下源码安装php
1、官网下载 )php源码包
2、上传到linux服务器
3、开始安装
解压
1
tar -xjvf php-7.3.11.tar.bz2
configure
安装一些扩展
gcc
1
yum install gcc
autoconf
1
yum install autoconf
libxml2-devel
1
yum install libxml2-devel
安装
1
./configure --prefix=/var/www/php
make
1
make
make install
1
make install
测试
1
[root@localhost php]# ./bin/php -m
到php的目录执行命令可以看到默认php安装的一些扩展
配置系统环境变量
1
vi ~/.bash_profile
1
alias php=/var/www/php/bin/php
1
source ~/.bash_profile
测试
1
php -v
4、安装完成后的一些坑
在源码包里,把php.ini-development复制到php的编译目录下并且改名
1
2cp php.ini-development /var/www/php/etc
mv php.ini-development php.ini如果修改php.ini后没有生效,
1
2[root@localhost etc]# php -i | grep php.ini
Configuration File (php.ini) Path => /var/www/php/lib看出默认路径是在lib目录下面,则需要吧php.ini移动到lib目录下面
1
mv ./etc/php.ini ./lib/
四、swoole源码安装
1、官网下载源码
- github下载zip或者git直接下载到soft目录
2、编译安装swoole
准备 安装gcc库
1
yum install gcc-c++
swoole目录下生成configure–利用php工具phpize
1
/var/www/php/bin/phpize
根据php配置文件编译安装
1
2
3./configure --with-php-config=/var/www/php/bin/php-config
make
make install在php相应目录生成swoole.so文件则编译安装成功
3、php 支持swoole
修改php.ini文件–添加如下代码
1
extension=swoole
测试——看是否有swoole扩展
1
php -m
查看swoole版本
1
php --ri swoole
五、swoole服务器介绍–tcp服务
1、tcp服务
1 |
|
2、client php链接tcp服务
1 |
|
3、判断tcp有几个进程
1 | ps aft | grep tcp.php |
六、swoole服务器–http
1、http服务
1 |
|
2、获取get参数
- 关键代码
1 | $array = $request->get; |
- 示例
1 |
|
3、保存cookie
- 关键代码
1 | $response->cookie('wwq','scccc',time()+1800); |
- 实例
1 |
|
4、开启swoole静态资源访问
- 关键代码
1 | $http->set([ |
- 实例
1 |
|
七、swoole服务–websocket
- WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。
- 为什么需要websocket
- 缺陷:http的通信只能由客户端发起
- websocket特点
- 建立在TCP协议之上
- 性能开销小通信高效
- 客户端可以与任意服务器通信
- 协议标识符ws wss
- 持久化网络通信协议
1、WebSocket服务
- 服务端——ws_server.php
1 |
|
- 用户——ws_client.html
1 |
|
- 结果
2、服务优化
- ws.php
1 |
|
- 结果
八、task任务
- 使用场景——执行耗时的操作(发送邮件,广播等)
1、修改wx.php——增加task任务
1 |
|
2、结果
九、swoole 定时器
- swoole_timer_tick——每间隔一段时间执行某个函数等
- swoole_timer_after——几秒/几分钟后执行某个函数等
1、增加定时功能
1 |
|
2、结果
十、linux 安装mysql
并且网络上的安装教程也非常多,但是对于新手来说,各种不同形式的安装教程,又给新手们带来了要选择哪种方式进行安装的难题,而且很多时候按照教程也没有能够安装成功,安装过程出现各种各样的错误。
下面记录了我在Linux环境下安装Mysql的完整过程,如有错误或遗漏,欢迎指正。
(一) 安装前准备
1、检查是否已经安装过mysql,执行命令
1 | [ ] |
从执行结果,可以看出我们已经安装了mysql-libs-5.1.73-5.el6_6.x86_64,执行删除命令
1 | [root@localhost /]# rpm -e --nodeps mysql-libs-5.1.73-5.el6_6.x86_64 |
再次执行查询命令,查看是否删除
1 | [ ] |
2、查询所有Mysql对应的文件夹
1 | [root@localhost /]# whereis mysql |
删除相关目录或文件
1 | [root@localhost /]# rm -rf /usr/bin/mysql /usr/include/mysql /data/mysql /data/mysql/mysql |
验证是否删除完毕
1 | [ ] |
3、检查mysql用户组和用户是否存在,如果没有,则创建
1 | [ ] |
4、从官网下载是用于Linux的Mysql安装包
下载命令:
1 | [root@localhost /] |
也可以直接到mysql官网选择其他版本进行下载。
(二)安装Mysql
1、在执行wget命令的目录下或你的上传目录下找到Mysql安装包:mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
执行解压命令:
1 | [root@localhost /]# tar -xzvf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz |
解压完成后,可以看到当前目录下多了一个解压文件,移动该文件到/usr/local/mysql
执行移动命令:
1 | [ ] |
2、在/usr/local/mysql目录下创建data目录
1 | [ ] |
3、更改mysql目录下所有的目录及文件夹所属的用户组和用户,以及权限
1 | [ ] |
4、编译安装并初始化mysql,务必记住初始化输出日志末尾的密码(数据库管理员临时密码)
1 | [ ] |
补充说明:\
此时可能会出现错误:
出现该问题首先检查该链接库文件有没有安装使用 命令进行核查
1 | [ ] |
运行命令后发现系统中无该链接库文件
1 | [ ] |
安装成功后,继续运行数据库的初始化命令,此时可能会出现如下错误:
执行如下命令后,再次运行数据库的初始化命令:
1 | [ ] |
5、运行初始化命令成功后,输出日志如下:
记录日志最末尾位置root@localhost:后的字符串,此字符串为mysql管理员临时登录密码。
6、编辑配置文件my.cnf,添加配置如下
1 | [root@localhost bin]# vi /etc/my.cnf |
7、启动mysql服务器
1 | [ ] |
显示如下结果,说明数据库安装成功
如果出现如下提示信息
1 | Starting MySQL... ERROR! The server quit without updating PID file |
查看是否存在mysql和mysqld的服务,如果存在,则结束进程,再重新执行启动命令
1 | #查询服务 |
8、添加软连接,并重启mysql服务
1 | [ ] |
9、登录mysql,修改密码(密码为步骤5生成的临时密码)
1 | [ ] |
10、开放远程连接
1 | mysql>use mysql; |
11、设置开机自动启动
1 | 1、将服务文件拷贝到init.d下,并重命名为mysql |
十一、异步redis——服务安装
- redis 服务
- hiredis库
- 编译swoole 需要加入——enable-async-redis
1、编译安装redis
1 | make |
- 测试——表示成功
1 | redis-server |
2、新版本的redis不再支持异步redis——推荐使用携程
4.2.6版本及以后不再需要手动安装和启用async-redis, 而是swoole自带
- 需要安装一个第三方的异步Redis库hiredis
1
2
3sudo make
sudo make install
sudo ldconfigv4.3.0以后不再需要添加编译参数, 内置了此依赖
- 需要在编译时增加
--enable-async-redis
来开启此功能 - 请勿同时使用异步回调和协程
Redis
1) 代码示例
1 | $redis = new Swoole\Coroutine\Redis(); |
2)defer特性
1 | const REDIS_SERVER_HOST = '127.0.0.1'; |
3、设定开机启动
1)创建存储redis文件目录
1 | mkdir -p /usr/local/redis |
2)进入src目录,复制redis-server redis-cli到新建立的文件夹
1 | cp ./redis-server /usr/local/redis/ |
3)复制redis的配置文件
1 | cd .. |
4)编辑配置文件
1 | cd /usr/local/redis/ |
改为yes 后台运行
5)添加开机启动服务
1 | vim /etc/systemd/system/redis-server.service |
1 | 1 [Unit] |
6)设置开机启动
1 | 1 systemctl daemon-reload |
7)检查是否安装成功
8)创建redis命令软连接
1 | ln -s /usr/local/redis/redis-cli /usr/bin/redis |
9)测试redis
完成安装!
10)如果不成功
1 | 1.编写配置脚本 [** vim /etc/init.d/redis** ] |
11)如果还是不行的话
1 | 1. 解压缩 |
1 | #设置开机启动 |
1 | source ~/.bash_profile |
1 | # 将 Redis 注册成为服务 |
12)关键
由于我之前安装过redis配置了开机启动。后来就一直不成功
1 | find / -name redis-server |
终于成功了!
十二、进程
- 进程就是正在运行的程序的一个实例
1、process.php
1 |
|
2、查看进程数
1 | yum install psmisc |
1 | php process.php |
1 | pstree -p 1753 |
1 | ps aft | grep http_server |
3、使用场景
- curl.php
1 |
|
- 结果
十三、swoole内存
- lock
- buffer
- table
- atomic
- mmap
- channel
- serialize
1、swoole table
- swoole_table是一个基于共享内存和锁实现的超高性能,并发数据结构
1)table.php
1 |
|
2)结果
3)一些基本操作
1 |
|
十四、swoole 携程
- swoole 携程只能在回调函数中使用。
1、coroutine redis.php
1 |
|
2、结果
十五、swoole 实战
1、知识点
- 框架——thinkphp5.1
- swoole特性使用
- 赛事直播平台
- nginx负载均衡
- redis
- 系统监控+性能优化