php swoole的基本使用
項目中使用的PHP,但由于長耗時的任務,前端提交以后,需要服務端異步響應。
服務器異步有多種方案,包括MQ,fsocket,Swoole等。
Swoole 使用純 C 語言編寫,提供了 PHP 語言的異步多線程服務器,異步 TCP/udp 網絡客戶端,異步 mysql,異步 redis,數據庫連接池,AsyncTask,消息隊列,毫秒定時器,異步文件讀寫,異步DNS查詢。 Swoole內置了http/websocket服務器端/客戶端、Http2.0服務器端。
立即學習“PHP免費學習筆記(深入)”;
最重要的是,完美支持PHP語言。于是使用Swoole搭建了一個異步服務器,提供異步響應,推送,定時任務等一系列工作。
安裝
Swoole是c語言編寫,采用編譯安裝的方式。
安裝依賴項有:
php-5.3.10 或更高版本
gcc-4.4 或更高版本
make autoconf
pcre (centos系統可以執行命令:yum install pcre-devel)
安裝方式:
phpize?#如果命令不存在?請在前面加上php的實際路徑 ./configure make? sudo?make?install
編譯完成以后,需要在php.ini中添加擴展
extension=swoole.so
使用
服務端
class?Server{ ????private?$serv; ????public?function?__construct()?{ ????????$this->serv?=?new?swoole_server("0.0.0.0",?9501); ????????$this->serv->set(array( ? ????????????//'worker_num'?=>?1,??//一般設置為服務器CPU數的1-4倍 ? ????????????'daemonize'?=>?1,??//以守護進程執行 ????????????'max_request'?=>?10000, ????????????'task_worker_num'?=>?1,??//task進程的數量 ? ????????????"task_ipc_mode?"?=>?3?,??//使用消息隊列通信,并設置為爭搶模式 ????????????'open_length_check'????=>?true, ????????????'dispatch_mode'????????=>?1, ? ????????????'package_length_type'??=>?'N',??//這個很關鍵,定位包頭的 ????????????'package_length_offset'?=>?0,??????//第N個字節是包長度的值 ????????????'package_body_offset'??=>?4,??????//第幾個字節開始計算長度 ? ????????????'package_max_length'????=>?2000000,??//協議最大長度 ????????????"log_file"?=>?"/tmp/swoole_test.log"??//日志 ? ????????)); ? ????????$this->serv->on('Receive',?array($this,?'onReceive')); ????????$this->serv->on('Task',?array($this,?'onTask')); ????????$this->serv->on('Finish',?array($this,?'onFinish')); ????????$this->serv->start(); ? ????} ? ????public?function?onReceive(?swoole_server?$serv,?$fd,?$from_id,?$data?)?{ ? ????????//放入任務隊列,開始執行 ????????$task_id?=?$serv->task(?$data?); ? ????} ? ????public?function?onTask($serv,$task_id,$from_id,?$data)?{ ??????//做一些事情 ? ????}
客戶端
class?Client{ ? ????private?$client,?$ip,?$port,?$params; ? ????public?function?__construct($ip,?$port,?$params) ????{ ? ????????$this->ip?=?$ip; ????????$this->port?=?$port; ????????$this->params?=?$params; ? ????????$this->client?=?new?swoole_client(SWOOLE_SOCK_TCP,?SWOOLE_SOCK_ASYNC); ????????$this->client->set(array( ????????????'open_length_check'????=>?true, ????????????'package_length_type'??=>?'N', ????????????'package_length_offset'?=>?0,??????//第N個字節是包長度的值 ????????????'package_body_offset'??=>?4,??????//第幾個字節開始計算長度 ????????????'package_max_length'????=>?2000000,??//協議最大長度 ? ????????)); ? ????????//設置事件回調函數 ? ????????$this->client->on('Connect',?array($this,?'onConnect')); ????????$this->client->on('Receive',?array($this,?'onReceive')); ????????$this->client->on('Close',?array($this,?'onClose')); ????????$this->client->on('Error',?array($this,?'onError')); ? ????????//發起網絡連接 ????????$this->client->connect($ip,?$port,?3); ????} ? ????public?function?onReceive(?$cli,?$data?)?{ ????????echo?"Received:?"?.?$data?.?"n"; ? ????} ? ????public?function?onConnect($cli)?{ ? ????????$data?=?pack('N',?strlen($data))?.?$data; ????????$cli->send($data); ????????$cli->close(); ? ????} ? ????public?function?onClose(?$cli) ????{ ????????echo?"Connection?closen"; ????} ? ????public?function?onError() ????{ ????????echo?"Connect?failedn"; ????} ? }
注意問題
'open_length_check'????=>?true, 'package_length_type'??=>?'N', 'package_length_offset'?=>?0,??????//第N個字節是包長度的值 'package_body_offset'??=>?4,??????//第幾個字節開始計算長度 'package_max_length'????=>?2000000,??//協長度
這幾個是定義幀定界的,因為Swoole的客戶端和服務器端通信是TCP連接的,因此得給幀定界符,有多種幀定界方式,具體參考Swoole官方文檔。這里其中是用頭額外加長度的方式。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦