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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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