項目中使用的PHP,但由于長耗時的任務,前端提交以后,需要服務端異步響應。
服務器異步有多種方案,包括MQ,fsocket,swoole等。? ? ? ? ?(推薦學習: swoole視頻教程)
Swoole 使用純 C 語言編寫,提供了 PHP 語言的異步多線程服務器,異步 TCP/UDP 網絡客戶端,異步 MySQL,異步 Redis,數據庫連接池,AsyncTask,消息隊列,毫秒定時器,異步文件讀寫,異步DNS查詢。 Swoole內置了Http/WebSocket服務器端/客戶端、Http2.0服務器端。
最重要的是,完美支持PHP語言。于是使用Swoole搭建了一個異步服務器,提供異步響應,推送,定時任務等一系列工作。
立即學習“PHP免費學習筆記(深入)”;
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"; ????} }
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦