1. 程式人生 > >使用Swoole 構建API接口服務

使用Swoole 構建API接口服務

需要 case server lob 架構 回調 _id 動手 ive

網上類似的文章已經很多了,我也是剛入門。從頭開始學習。所以如果重復寫文章闡釋,反而會浪費時間,於是就自己動手構建了一個demo,使用swoole 的TCP 服務器接受TCP客戶端的發來的http請求,然後將GET請求簡單分割,獲取需要的參數,然後將參數重新返回給TCP客戶端。這個例子,旨在說明TCP 是屬於傳輸層,而我們獲取HTTP請求後,怎樣解析發送過來的文本是屬於應用層,也就是平時apache 或者nginx幫我們做好的工作。

以下是全部代碼,因為是練習代碼,所以命名不太規範。本想要解析post請求和GET請求,但是實踐之後發現,POST請求比較難解析,而已swoole已經有了完善的swoole_http_server 這個工具,可以幫助我處理好一些繁瑣的準備工作,下面的代碼只是用來展示自己對swoole的一些流程和理解,歡迎各位好友共同探討。

<?php
/**
 * 用swoole 搭建一個API服務器
 */

$serv = new swoole_server('127.0.0.1', 9888, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);
$serv->set(array(
   'worker_num' => 4,
   'daemonize' => false,
   'backlog' => 128,
));

$serv->on('Connect', 'onConnect'
); $serv->on('Receive', 'onReceive'); $serv->on('Close', 'onClose'); $serv->start(); /** *Http建立連接回調函數 */ function onConnect($serv, $fd) { echo "Server is running on 127.0.0.1:9888".PHP_EOL; } /** * 開始接受客戶端信息回調函數 */ function onReceive($serv, $fd
, $from_id, $data) { formatRequest($serv, $fd, $data); } /** * 連接關閉後回調函數 */ function onClose($serv, $fd) { return false; } /** * 封裝response 的內容 */ function response($serv, $fd, $res_data='') { //響應行 $response = array( 'HTTP/1.1 200', ); //響應頭 $headers = array( 'Server'=>'SwooleServer', 'Content-Type'=>'text/html;charset=utf8', 'Content-Length'=>strlen($res_data), ); foreach($headers as $key=>$val){ $response[] = $key.':'.$val; } //空行 $response[] = ''; //響應體 $response[] = $res_data; $send_data = join("\r\n",$response); $serv->send($fd, $send_data); } function formatRequest($serv, $fd, $data) { $tmp_data = explode("\r\n", $data); if (!is_array($tmp_data) || empty($tmp_data)) return false; $request_info = explode(" ", $tmp_data[0]); if (!is_array($request_info) || empty($request_info)) return false; switch ($request_info[0]) { case 'GET': $tmp_str = urldecode($request_info[1]); $query_info = parse_url($tmp_str); $query = $query_info['query']; $path = $query_info['path']; global $_GET; parse_str($query, $_GET); response($serv, $fd, json_encode($_GET)); break; case 'POST': //needs some code break; default: return false; break; } } function urlRouter() { } /* * 註冊全局的變量POST參數 * 註冊全局的變量GET參數 */ function register_global_request_var($data, $type) { return false; }

本文參考:

  1. swoole使用
  2. 理解RESTful架構
  3. PHP實現基於Swoole簡單的HTTP服務器

使用Swoole 構建API接口服務