在這裏簡述swoole兩種API編寫簡單HTTP服務器。
swoole_server
使用swoole_server API,構建HTTP服務器,4個步驟:
- 構建Server對象
- 設置運行時參數
- 註冊事件回調函數
- 啓動服務器
直接代碼體現,新建server.php:
<?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 )
運行 php server.php
,瀏覽器訪問http://127.0.0.1:9501/,當然我們常常使用Nginx作爲前端代理,設一個測試域名www.server.com,本地設置hosts映射,就能通過域名來訪問了。Nginx配置:這裏
注意:當響應報文格式不正確時,瀏覽器頁面會一直轉菊花,等待請求返回...
再後來,有了swoole_http_server,HTTP服務器代碼就變得更加簡單了!
swoole_http_server
<?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作爲代理