lumen + swoole 实现http 服务器

<?php

class Service {
public $app;
public $server;

public function __construct($host, $port) {
    $this->server = new \swoole_http_server($host, $port);
}

public function start()
{
    // $this->server->on('start', array($this, 'onStart'));
    // $this->server->on('shutdown', array($this, 'onShutdown'));
    // $this->server->on('workerStop', array($this, 'onWorkerStop'));
    $this->server->on('workerStart', array($this, 'onWorkerStart'));
    $this->server->on('request', array($this, 'onRequest'));
    $this->server->start();
}

public function onWorkerStart($serv, $worker_id) {
    // 应用初始化
    $this->app =  require __DIR__.'/../bootstrap/app.php';;
}



protected function parseRequest(\swoole_http_request $request)
{
    $get     = isset($request->get) ? $request->get : array();
    $post    = isset($request->post) ? $request->post : array();
    $cookie  = isset($request->cookie) ? $request->cookie : array();
    $server  = isset($request->server) ? $request->server : array();
    $header  = isset($request->header) ? $request->header : array();
    $files   = isset($request->files) ? $request->files : array();
    $fastcgi = array();

    $new_server = array();
    foreach ($server as $key => $value) {
        $new_server[strtoupper($key)] = $value;
    }
    foreach ($header as $key => $value) {
        $new_server['HTTP_' . strtoupper($key)] = $value;
    }

    $content = $request->rawContent() ?: null;

    $http_request = new \Illuminate\Http\Request($get, $post, $fastcgi, $cookie, $files, $new_server, $content);

    return $http_request;
}


public function onRequest(\swoole_http_request $request,\swoole_http_response $response) {
    // 检查是否存在 HTTP_USER_AGENT 索引
    $userAgent = $request->header['user-agent']??null;
    $app = $this->app;
    // 处理用户请求
    $http_request = $this->parseRequest($request);
    $http_response = $app->dispatch($http_request);
    // 响应用户请求
    $this->makeResponse($response, $http_response);
}

protected function makeResponse(\swoole_http_response $response, \Symfony\Component\HttpFoundation\Response $http_response)
{
    var_dump($http_response);
    // status
    $response->status($http_response->getStatusCode());
    // headers
    foreach ($http_response->headers->allPreserveCase() as $name => $values) {
        foreach ($values as $value) {
            $response->header($name, $value);
        }
    }
    // cookies
    foreach ($http_response->headers->getCookies() as $cookie) {
        $response->rawcookie(
            $cookie->getName(),
            $cookie->getValue(),
            $cookie->getExpiresTime(),
            $cookie->getPath(),
            $cookie->getDomain(),
            $cookie->isSecure(),
            $cookie->isHttpOnly()
        );
    }
    // content
    $content = $http_response->getContent();
    // send content
    $response->end($content);
}

}

$s = new Service(“127.0.0.1”, 9080);
$s->start();

将这段代码写到server.php 然后执行 php server.php 就可以了 简单版本参考了一些参考网上的文章

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!