一、Swoole简介
Swoole是一个由c语言编写的面向生产环境的 PHP 异步网络通信引擎,使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务,提供了PHP语言的异步多线程服务器。
二、安装准备:
a) 安装前必须保证系统已经安装了下列软件
b) php-7.0 或更高版本
c) gcc-4.8 或更高版本
d) make
e) autoconf
f) pcre (CentOS系统可以执行命令:yum install pcre-devel
三、PHP7源码安装
a) 官网下载PHP源码:php-7.2.32.tar.bz2
b) 解压:sudo tar -jxvf php-7.2.32.tar.bz2
c) 进入目录:cd php-7.2.32
d) 编译:./configure --prefix=/usr/local/php --with-mysqli=mysqlnd --enable-mysqlnd --with-iconv=/usr/local/opt/libiconv --enable-fpm --enable-sockets
e) 执行构建:sudo make
f) 安装:make install
四、swoole下载安装
备注:ubuntu没有 phpize可执行命令:sudo apt-get install php-dev 安装phpize
a) git clone swoole源码:wget https://github.com/swoole/swoole-src/archive/v4.5.2.tar.gz
b) 解压:tar -zxvf v4.5.2.tar.gz
c) 进入目录:cd swoole-src-4.5.2
d) 生成configure配置文件:sudo /usr/local/php/bin/phpize (根据个人情况不同)
e) 编译配置:./configure --with-php-config=/usr/local/php/bin/php-config
f) 执行构建安装:make && make install
g) php.ini配置: php.ini中加入一行 extension=swoole.so 来启用 Swoole 扩展
h) 查看PHP本进程扩展:/usr/local/php/sbin/php-fpm -m | grep swoole
i) 查看PHP swoole配置: php --ri swoole
五、 网络通信引擎
a) TCP服务:
i. 创建tcp服务:参考 https://wiki.swoole.com/#/start/start_tcp_server
ii. 启动tcp服务:php tcp.php (文件命名根据个人情况而定)
iii. 命令连接tcp: telnet 127.0.0.1 9501 (即可在tcp客户端输入数据)
iv. php脚本连接tcp:参考 https://wiki.swoole.com/wiki/page/p-client.html
b) HTTP服务:
i. 创建http服务:参考https://wiki.swoole.com/wiki/page/326.html
ii. 启动http服务:php http.php (文件命名根据个人情况而定)
iii. 请求http:curl http://127.0.0.1:9502 (端口号根据个人设定)
iv. 静态文件请求配置:
即可通过swoole http的方式直接访问指定静态文件,例如:
http://local.swoole.com:9501/live/login.html?adp=test
c) WebSocket服务:
i. 介绍:WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信--允许服务器主动发送消息给客户端。
ii. WebSocket特点:
1. 建立TCP协议之上
2. 性能开销小,通信高效
3. 客户端可以与任意服务器通信
4. 协议标识符ws wss
5. 持久化网络通信协议(长连接)
iii. 创建ws服务:参考https://wiki.swoole.com/wiki/page/397.html
iv. 配置静态访问:
v. 启动ws服务:php webSocket.php
vi. 创建ws客户端:
vii. 浏览器发送客户端请求: http://local.swoole.com:9502/ws_client.html
六、 异步非堵塞IO
a) 毫秒定时器Timer:
i. 定时执行:int Swoole\Timer::tick(int $msec, callable $callback, ...$params); 函数风格别名是swoole_timer_tick;
ii. 一次性定时器:Swoole\Timer::after(int $msec, callable $callback ...$params); 函数风格别名是swoole_timer_after
iii. 删除一个定时器:Swoole\Timer::clear(int $timer_id); 函数风格别名是swoole_timer_clear
iv. 清除当前工作进程内的所有定时器:Swoole\Timer::clearAll();
v. 查看定时器详情:Swoole\Timer::info($timer_id);
vi. 迭代获取所有定时器ID:Swoole\Timer::list();
vii. 设置定时器参数:Swoole\Timer::set([ 'enable_coroutine' => false ]);
b) 异步文件IO系统(异步文件系统仅限于4.3.0之前的版本,后续版本已经全面使用协程(coroutine)代替原有方案,具体参见:Coroutine模块)
c) 异步mysql(异步文件系统仅限于4.3.0之前的版本,后续版本已经全面使用协程(coroutine)代替原有方案,具体参见:Coroutine模块)
d) 异步redis(异步文件系统仅限于4.3.0之前的版本,后续版本已经全面使用协程(coroutine)代替原有方案,具体参见:Coroutine模块)
七、 进程/内存/协程
a) 单进程: 参考https://wiki.swoole.com/#/process
i. 获取进程ID:Swoole\Process->pid: int 或 getmypid()
ii. 文件描述符:Swoole\Process->pipe;
iii. 进程构成方法:Swoole\Process->__construct(callable $function, bool $redirect_stdin_stdout = false, int $pipe_type = SOCK_DGRAM, bool $enable_coroutine = false);
iv. 创建一个进程:Swoole\Process->start(): int|false
v. 引进协程socket进行进程间通信:Swoole\Process->exportSocket(): Swoole\Coroutine\Socket|false
vi. 设置进程名称(mac不支持):Swoole\Process->name(string $name): bool
vii. 执行一个外部程序:Swoole\Process->exec(string $execfile, array $args);
viii. 关闭进程socket:Swoole\Process->close(int $which): bool
ix. 退出子进程:Swoole\Process->exit(int $status = 0);
x. 向指定 pid 进程发送信号:Swoole\Process::kill(int $pid, int $signo = SIGTERM): bool
xi. 设置异步信号监听:Swoole\Process::signal(int $signo, callable $callback): bool
xii. 回收结束运行的子进程:Swoole\Process::wait(bool $blocking = true): array|false
xiii. 微秒级别定时器:Swoole\Process::alarm(int $time, int $type = ITIMER_REAL): bool
xiv. 向管道内写入数据:Process->write(string $data) int | bool;
xv. 向管道内读取数据:Process->read() string| bool;
b) 进程池:参考https://wiki.swoole.com/#/process_pool
c) 内存table:
i. 配置内存表:Swoole\Table->__construct(int $size, float $conflict_proportion = 0.2);
ii. 获取实际占用内存(字节):Swoole\Table->memorySize;
iii. 增加列:Swoole\Table->column(string $name, int $type, int $size = 0);
iv. 执行创建:Swoole\Table->create(): bool
v. 设置行数据:Swoole\Table->set(string $key, array $value): bool
vi. 获取行数据:Swoole\Table->get(string $key, string $field = null): array|false
vii. 自增:Swoole\Table->incr(string $key, string $column, mixed $incrby = 1): int
viii. 自减:Swoole\Table->decr(string $key, string $column, mixed $decrby = 1): int
ix. 是否存在某key:Swoole\Table->exist(string $key): bool
x. 统计table条目数:Swoole\Table->count(): int
xi. 删除行:Swoole\Table->del(string $key): boolS
d) 协程:参考https://wiki.swoole.com/#/coroutine_client/init
八、 系统监控与性能优化
a) 后台进程方式启动服务:
i. nohup php server/http_server.php >/dev/null 2>&1 &
ii. swoole server中set方法设置进程参数:
b) swoole服务平滑重启(获取主进程ID:pidof 进程名):
i. start事件回调中设置进程名称: swoole_set_process_name('test');
ii. 平滑重启服务(也可通过sh脚本方式执行命令):
c) nginx转发到swoole服务器(9501为swoole服务器端口):