Swoole协程上下文对象的使用

<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
ini_set('error_reporting', E_ALL);
ini_set('max_execution_time', 0);
ini_set('memory_limit', '-1');
PHP_SAPI !== 'cli' && exit('脚本只能在命令行执行');

Swoole\Coroutine::set(['hook_flags' => SWOOLE_HOOK_ALL]); // 一键协程化

Swoole\Coroutine\run(function () {
    $server = new Co\Http\Server('localhost', 9502, false);

    $server->handle('/', function (Swoole\Http\Request $request, Swoole\Http\Response $response): void {
        $uri = (string)($request->server['request_uri'] ?? '');

        // 处理“/favicon.ico”请求
        if ($uri === '/favicon.ico') {
            $response->setStatusCode(404);
            $response->end('404 Not Found');
            return;
        }

        $context = Swoole\Coroutine::getContext(); // 获取当前协程的上下文对象
        assert($context instanceof Swoole\Coroutine\Context); // 断言
        if (isset($context['counter-1'])) {
            $context['counter-1']++;
        } else {
            $context['counter-1'] = 1;
        }
        echo var_export($context, true) . PHP_EOL;

        go(static function () use ($request, $response): void {
            $context = Swoole\Coroutine::getContext(); // 获取当前协程的上下文对象
            assert($context instanceof Swoole\Coroutine\Context); // 断言
            if (isset($context['counter-2'])) {
                $context['counter-2']++;
            } else {
                $context['counter-2'] = 1;
            }
            echo var_export($context, true) . PHP_EOL;
            echo '--------------------------------------------------' . PHP_EOL;

            $uri = (string)($request->server['request_uri'] ?? '');
            $response->end($uri);
        });
    });

    $server->start(); // 启动HTTP服务器
});


//========== 总结 ==========//
// 1、Swoole\Coroutine::getContext()获取的是当前协程的上下文对象,对于多层嵌套协程,getContext()只能获取调用时所在层的协程的上下文对象,
//    并不能获取父协程或子协程的上下文对象,如果要获取指定协程的上下文对象则必须传递参数指定协程ID。
// 2、协程退出后会自动清理上下文对象,不需要手动清理。
// 3、Swoole\Coroutine\Context类继承了ArrayObject类,所以其对象可以当成数组一样使用。
// 4、上下文主要用来隔离不同协程之间的全局变量。

Copyright © 2024 码农人生. All Rights Reserved