Swoole 中使用 HTTP 異步服務器、HTTP 協程服務器


HTTP 異步風格服務器

# http_server.php

$http = new Swoole\Http\Server("0.0.0.0", 9501);

// 設置服務器運行參數
$http->set(array(
    'daemonize'     => 1,  // 作為守護進程運行,需同時設置log_file
    'log_file'      => '/www/logs/swoole.log',  // 指定標准輸出和錯誤日志文件
    'worker_num'    => 4,  // 設置啟動的工作進程數,默認為CPU核數,全異步IO可以設置為 CPU 核數的 1-4 倍
));

// HTTP 服務器只需要監聽 onRequest 事件
$http->on('request', function ($request, $response) {
    // 響應 favicon.ico 請求
    if ($request->server['path_info'] == '/favicon.ico' || $request->server['request_uri'] == '/favicon.ico') {
        $response->end();
        return;
    }
    
    var_dump($request->get, $request->post);
    
    // URL路由器
    list($controller, $action) = explode('/', trim($request->server['request_uri'], '/'));
    if (empty($controller)) {
        $controller = 'IndexController';
    }
    if (empty($action)) {
        $action = 'index';
    }
    (new $controller)->$action($request, $response);
});

class IndexController {
    public function index($request, $response) {
        $rand = rand(1000, 9999);
        $response->header("Content-Type", "text/html; charset=utf-8");
        
        // 輸出一段 HTML 內容
        $response->end("<h1>Hello Swoole. #{$rand}</h1>");
    }
}

// 啟動 HTTP 服務器
$http->start();

運行並測試 HTTP 異步風格服務器

# 如果程序已經運行,先結束進程
kill -9 11591

# 在 cli 命令行環境運行服務端
php http_server.php

# 查看服務器監聽的端口
netstat -an | grep 9501

# 訪問 http://127.0.0.1:9501 查看程序的結果
curl http://127.0.0.1:9501

# 使用 Apache bench 工具進行壓力測試
ab -c 200 -n 200000 -k http://127.0.0.1:9501/

使用 Nginx 作為代理

server {
    root /wwwroot/swoole_demo/;
    server_name local.swoole.com;

    location / {
        proxy_http_version 1.1;
        proxy_set_header Connection "keep-alive";
        proxy_set_header X-Real-IP $remote_addr;
        if (!-e $request_filename) {
             proxy_pass http://127.0.0.1:9501;
        }
    }
}

HTTP 協程風格服務器

Co\run(function () {
    $server = new Co\Http\Server("127.0.0.1", 9501, false);

    // 設置服務器運行參數
    $server->set(array(
        'daemonize'     => 1,  // 作為守護進程運行,需同時設置log_file
        'log_file'      => '/www/logs/swoole.log',  // 指定標准輸出和錯誤日志文件
    ));

    $server->handle('/', function ($request, $response) use ($server) {
        // URL路由器
        list($controller, $action) = explode('/', trim($request->server['request_uri'], '/'));
        if (empty($controller)) {
            $controller = 'IndexController';
        }
        if (empty($action)) {
            $action = 'index';
        }
        (new $controller)->$action($request, $response);
    });
    $server->start();
});

HTTP 協程客戶端

官方建議使用 Saber


免責聲明!

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



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