PHP實現基于Swoole簡單的HTTP服務器

jopen 8年前發布 | 28K 次閱讀 Swoole Web服務器 HTTP PHP開發

引用Swoole官方定義:

PHP語言的異步、并行、高性能網絡通信框架,使用純C語言編寫,提供了PHP語言的異步多線程服務器,異步TCP/UDP網絡客戶端,異步MySQL,數據庫連接池,AsyncTask,消息隊列,毫秒定時器,異步文件讀寫,異步DNS查詢。Swoole可以廣泛應用于互聯網、移動通信、企業軟件、云計算、網絡游戲、物聯網、車聯網、智能家居等領域。使用PHP+Swoole作為網絡通信框架,可以使企業IT研發團隊的效率大大提升,更加專注于開發創新產品。

在這里簡述swoole兩種API編寫簡單HTTP服務器。

swoole_server

使用swoole_server API,構建HTTP服務器,4個步驟:

  1. 構建Server對象
  2. 設置運行時參數
  3. 注冊事件回調函數
  4. 啟動服務器

直接代碼體現,新建 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作為代理

參考

來自: http://www.cnblogs.com/xrong/p/5108990.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!