<?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