程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(1)

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

发布于2021-03-14 06:05     阅读(795)     评论(0)     点赞(9)     收藏(5)


协程使用注意事项

  • 协程内部禁止使用全局变量,以免发生数据错乱;
  • 协程使用 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;
    }
});

原文链接:https://www.cnblogs.com/danhuang/p/13289285.html



所属网站分类: 技术文章 > 博客

作者:下班了快跑

链接:http://www.phpheidong.com/blog/article/3284/d532419bbd1e4a4003c8/

来源:php黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

9 0
收藏该文
已收藏

评论内容:(最多支持255个字符)