引用Swoole官方定義:php
PHP語言的異步、並行、高性能網絡通訊框架,使用純C語言編寫,提供了PHP語言的異步多線程服務器,異步TCP/UDP網絡客戶端,異步MySQL,數據庫鏈接池,AsyncTask,消息隊列,毫秒定時器,異步文件讀寫,異步DNS查詢。Swoole能夠普遍應用於互聯網、移動通訊、企業軟件、雲計算、網絡遊戲、物聯網、車聯網、智能家居等領域。使用PHP+Swoole做爲網絡通訊框架,可使企業IT研發團隊的效率大大提高,更加專一於開發創新產品。html
在這裏簡述swoole兩種API編寫簡單HTTP服務器。前端
使用swoole_server API,構建HTTP服務器,4個步驟:git
直接代碼體現,新建server.php:github
<?php //1.構建Server對象 $serv = new swoole_server("0.0.0.0", 9501); //2.設置運行時參數 $serv->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='<h1>Hello Swoole.</h1>'; response($serv,$fd,$respData);//封裝併發送HTTP響應報文 }); //4.啓動服務器 $serv->start();
如何封裝HTTP響應報文?首先你得知道HTTP響應報文的組成結構,以下圖
數據庫
知道了響應報文的組成結構,那個人響應報文應該是這樣的:瀏覽器
HTTP/1.1 200 Server:SwooleServer Content-Type:text/html;charset=utf8 Content-Length:13 <h1>Hello Swoole.</h1>
代碼實現。服務器
/** * 發送內容 * @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 )swoole
運行 php server.php
,瀏覽器訪問http://127.0.0.1:9501/,固然咱們經常使用Nginx做爲前端代理,設一個測試域名www.server.com,本地設置hosts映射,就能經過域名來訪問了。Nginx配置:這裏
注意:當響應報文格式不正確時,瀏覽器頁面會一直轉菊花,等待請求返回...網絡
再後來,有了swoole_http_server,HTTP服務器代碼就變得更加簡單了!
<?php $http = new swoole_http_server("127.0.0.1", 9501); $http->on('request', function ($request, $response) { $html = "<h1>Hello Swoole.</h1>"; $response->end($html); });
沒錯,就這幾行代碼就實現了。再也不須要封裝響應報文。swoole_http_server 繼承於 swoole_server,是swoole內置Http服務器的支持,經過幾行代碼便可寫出一個異步非阻塞多進程的Http服務器。
Notice:swoole_http_server對Http協議的支持並不完整,建議僅做爲應用服務器。而且在前端增長Nginx做爲代理