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 协议》,转载必须注明作者和本文链接