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
 - 系统监控+性能优化
 





























