一、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服務器端口):

