Laravel 结合 Swoole 简易版
<?php
require __DIR__ . '/../vendor/autoload.php';
Swoole\Runtime::enableCoroutine(true,SWOOLE_HOOK_ALL|SWOOLE_HOOK_CURL);//一键协程化
$http = new Swoole\Http\Server("0.0.0.0", 3322, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);//创建http服务器
$http->set([
'document_root' => __DIR__, // v4.4.0以下版本, 此处必须为绝对路径
'enable_static_handler' => true,
"task_worker_num"=>2,
"task_enable_coroutine"=>true,
"task_use_object"=>true
]);
$app = require __DIR__ . '/../bootstrap/app.php';
$app->terminating(function (\Illuminate\Foundation\Application $application) {
/**
* 使用 Laravel 的 terminate机制来清除掉脏数据。
*
* 由于 AuthManager中的 $guards会保存每个创建过的 guards 对象,每个 guards 对象又和 user 关联,如果不清理掉会造成 user信息混乱
*/
$auth = $application['auth'];
$reflect_class = new ReflectionClass($auth);
$property_guards = $reflect_class->getProperty("guards");
$property_guards->setAccessible(true);
if ($property_guards->getValue($auth)){
$property_guards->setValue($auth, []);
}
});
$http->app = $app;//将 laravel 的 Application 对象绑定到 swoole的 Server上,这样就不用通过闭包的方式传递 Application对象。
$app->instance("swoole_http", $http);//将swoole的Server对象绑定到 laravel的Application对象上,以便能在业务代码中使用,例如 投递task任务
$http->on("request", function (swoole_http_request $swoole_request, swoole_http_response $swoole_response) use ($http) {
$app = $http->app;
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);//创建laravel的 Kernel对象
Illuminate\Http\Request::enableHttpMethodParameterOverride();
if (!isset($swoole_request->server["REQUEST_URI"])) {//swoole的 这个请求头是小写,cgi 是大写,兼容一下
$swoole_request->server["REQUEST_URI"] = $swoole_request->server["request_uri"];
}
/**
* 创建 laravel 的 Requests
*/
$symfony_request = new Symfony\Component\HttpFoundation\Request($swoole_request->get ?: [], $swoole_request->post ?: [], [], $swoole_request->cookie ?: [], $swoole_request->files ?: [], $swoole_request->server ?: []);
$laravel_request = Illuminate\Http\Request::createFromBase($symfony_request);
/**
* 处理请求,获得 Response 对象,并获得Response的内容。
*/
$laravel_response = $kernel->handle($laravel_request);
$content = $laravel_response->getContent();
/**
* 设置响应码和响应头
*/
$swoole_response->status($laravel_response->getStatusCode());
foreach ($laravel_response->headers->allPreserveCaseWithoutCookies() as $name => $values) {
foreach ($values as $value) {
$swoole_response->header($name, $value);
}
}
/**
* 设置cookie
*/
foreach ($laravel_response->headers->getCookies() as $cookie) {
list($cookie_key, $cookie_val) = explode("=", $cookie);
$swoole_response->cookie($cookie_key, $cookie_val);
}
/**
* 输出内容
*/
$swoole_response->end($content);
$kernel->terminate($laravel_request, $laravel_response);
});
$http->on("task",function ($serv, Swoole\Server\Task $task){});
$http->start();
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: