一、Swoole简介

  Swoole是一个c语言编写的面向生产环境的 PHP 异步网络通信引擎,使 PHP 开发人员可以编写高性能的异步并发 TCPUDPUnix SocketHTTPWebSocket 服务,提供了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. 命令连接tcptelnet 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. 请求httpcurl 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. 迭代获取所有定时器IDSwoole\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. 获取进程IDSwoole\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. 关闭进程socketSwoole\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. 是否存在某keySwoole\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 serverset方法设置进程参数:

    

 

 

 

  b) swoole服务平滑重启(获取进程IDpidof 进程名):

    i. start事件回调中设置进程名称: swoole_set_process_name('test');

    ii. 平滑重启服务(也可通过sh脚本方式执行命令):

    

 

 

 

  c) nginx转发到swoole服务器(9501swoole服务器端口):

    

 

 

 

    

 

posted on 2020-08-19 18:49  鸥海  阅读(918)  评论(0编辑  收藏  举报