引用Swoole官方定義:
PHP語言的非同步、並行、高效能網路通訊架構,使用純C語言編寫,提供了PHP語言的非同步多線程伺服器,非同步TCP/UDP網路用戶端,非同步MySQL,資料庫連接池,AsyncTask,訊息佇列,毫秒定時器,非同步檔案讀寫,非同步DNS查詢。Swoole可以廣泛應用於互連網、移動通訊、企業軟體、雲端運算、網路遊戲、物聯網、車連網、智能家居等領域。使用PHP+Swoole作為網路通訊架構,可以使企業IT研發團隊的效率大大提升,更加專註於開發創新產品。
在這裡簡述swoole兩種API編寫簡單HTTP伺服器。
swoole_server
使用swoole_server API,構建HTTP伺服器,4個步驟:
- 構建Server對象
- 設定運行時參數
- 註冊事件回呼函數
- 啟動伺服器
直接代碼體現,建立 server.php :
set(array( 'worker_num' => 8, 'daemonize' => 0, 'max_request' => 10000, 'dispatch_mode' => 2, 'debug_mode'=> 1,));//3.註冊事件回呼函數$serv->on('Receive', function($serv, $fd, $from_id, $data){ $respData='Hello Swoole.
'; response($serv,$fd,$respData);//封裝並發送HTTP響應報文});//4.啟動伺服器$serv->start();
如何封裝HTTP響應報文?首先你得知道HTTP響應報文的組成結構,如
知道了響應報文的組成結構,那我的響應報文應該是這樣的:
HTTP/1.1 200Server:SwooleServerContent-Type:text/html;charset=utf8Content-Length:13Hello Swoole.
代碼實現。
/*** 發送內容* @param \swoole_server $serv* @param int $fd* @param string $respData* @return void*/function response($serv,$fd,$respData){ //響應行 $response = array( 'HTTP/1.1 200', ); //回應標頭 $headers = array( 'Server'=>'SwooleServer', 'Content-Type'=>'text/html;charset=utf8', 'Content-Length'=>strlen($respData), ); foreach($headers as $key=>$val){ $response[] = $key.':'.$val; } //空行 $response[] = ''; //響應體 $response[] = $respData; $send_data = join("\r\n",$response); $serv->send($fd, $send_data);}
到此,一個簡單響應 Hello Swoole. 的HTTP伺服器就完成了。完整代碼: 這裡
(訪問不了gist?配置本地hosts檔案: 192.30.252.141 gist.github.com )
運行 php server.php ,瀏覽器訪問http://127.0.0.1:9501/,當然我們常常使用Nginx作為前端代理,設一個www.server.com,本地設定hosts映射,就能通過網域名稱來訪問了。Nginx配置: 這裡
注意:當響應報文格式不正確時,瀏覽器頁面會一直轉菊花,等待請求返回...
再後來,有了swoole_http_server,HTTP伺服器代碼就變得更加簡單了!
swoole_http_server
on('request', function ($request, $response) { $html = "Hello Swoole.
"; $response->end($html);});
沒錯,就這幾行代碼就實現了。不再需要封裝響應報文。swoole_http_server 繼承於 swoole_server,是swoole內建Http伺服器的支援,通過幾行代碼即可寫出一個非同步非阻塞多進程的Http伺服器。
Notice:swoole_http_server對Http協議的支援並不完整,建議僅作為應用伺服器。並且在前端增加Nginx作為代理
參考
- http://www.swoole.com/
- https://github.com/LinkedDestiny/swoole-doc