Swoole 4.5v安裝使用


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

    

 

 

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM