使用Swoole 構建API接口服務


網上類似的文章已經很多了,我也是剛入門。從頭開始學習。所以如果重復寫文章闡釋,反而會浪費時間,於是就自己動手構建了一個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服務器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM