php如何使用swoole

php如何使用swoole

php如何使用swoole

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官方文檔。這里其中是用頭額外加長度的方式。

以上就是php如何使用

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享