Swoole 中协程的使用注意事项及协程中的异常捕获

2023-06-08,,

协程使用注意事项

协程内部禁止使用全局变量,以免发生数据错乱;
协程使用 use 关键字引入外部变量到当前作用域禁止使用引用,以免发生数据错乱;
不能使用类静态变量 Class::$array / 全局变量 $_array / 全局对象属性 $object->array / 其他超全局变量 $GLOBALS 等保存协程上下文内容,以免发生数据错乱;
协程之间通讯必须使用通道(Channel);
不能在多个协程间共用一个客户端连接,以免发生数据错乱;可以使用连接池实现;
在 Swoole\Server 中,客户端连接应当在 onWorkerStart 中创建;
在 Swoole\Process 中,客户端连接应当在 Swoole\Process->start 后,子进程的回调函数中创建;
必须在协程内捕获异常,不得跨协程捕获异常;
__get / __set 魔术方法中不能有协程切换。

协程中的异常捕获

示例一:协程中使用exit函数抛出 ExitException 异常

function route()
{
controller();
} function controller()
{
your_code();
} function your_code()
{
co::sleep(.001);
exit(1);
} go(function () {
try {
route();
} catch (\Swoole\ExitException $e) {
var_dump($e->getMessage());
var_dump($e->getStatus() === 1);
var_dump($e->getFlags());
}
});

示例二:协程中使用exit函数抛出 ExitException 异常

$exit_status = 0;
go(function () {
try {
exit(123);
} catch (\Swoole\ExitException $e) {
global $exit_status;
$exit_status = $e->getStatus();
}
});
swoole_event_wait();
var_dump($exit_status);

示例三:协程中直接抛出 RuntimeException 异常

function test() {
throw new \RuntimeException(__FILE__, __LINE__);
} Swoole\Coroutine::create(function () {
try {
test();
}
catch (\Throwable $e) {
echo $e;
}
});

Swoole 中协程的使用注意事项及协程中的异常捕获的相关教程结束。

《Swoole 中协程的使用注意事项及协程中的异常捕获.doc》

下载本文的Word格式文档,以方便收藏与打印。