php swoole hyperf,【php】Hyperf为什么要关闭Swoole协程短名称

Hyperf框架要求关闭Swoole协程短名称,目的是为了拦截并处理go()等函数在创建协程时可能抛出的异常,避免致命错误。通过重定义这些函数,Hyperf可以捕获并记录异常,提供更健壮的错误处理机制。在代码中,即使使用了go(),实际上也已经被框架的自定义实现所接管,确保了异常的正确处理。
摘要由CSDN通过智能技术生成

在Hyperf官方文档的服务器要求中提到

并且,在文档的常见问题中也会看到Swoole 短名未关闭这一个tag。

我想问了,那为什么hyperf一定要关闭掉Swoole的协程短名称呢

首先,我们先看一下什么是Swoole的协程短名称

从上面的解释我们知道了,hyperf主要就是不想让我们使用以上这几个函数,但是为啥不让我们使用的呢?想到之前在代码中经常使用go()函数来解决代码中的阻塞问题,难道说我写的代码并没有协程化?在Hyperf经过测试之后发现,go()函数协程话确实是生效的,那究竟是什么让本来已经被禁用的go()函数又“复活”了呢?

在phpStrom只点击go()函数我们跳转到了vendor/hyperf/utils/src/Functions.php文件,该文件是在composer.json中指定的自动化加载文件

if (! function_exists('go')) {

/**

* @return bool|int

*/

function go(callable $callable)

{

$id = Coroutine::create($callable);

return $id > 0 ? $id : false;

}

}

如果框架里没定义go()函数的话,就会执行这里的逻辑去调用Coroutine::create($callable),注意这里的Coroutine类并不是Swoole\Coroutine,而是vendor/hyperf/utils/src/Coroutine.php

public static function create(callable $callable): int

{

$result = SwooleCoroutine::create(function () use ($callable) {

try {

call($callable);

} catch (Throwable $throwable) {

if (ApplicationContext::hasContainer()) {

$container = ApplicationContext::getContainer();

if ($container->has(StdoutLoggerInterface::class)) {

/* @var LoggerInterface $logger */

$logger = $container->get(StdoutLoggerInterface::class);

/* @var FormatterInterface $formatter */

if ($container->has(FormatterInterface::class)) {

$formatter = $container->get(FormatterInterface::class);

$logger->warning($formatter->format($throwable));

} else {

$logger->warning(sprintf('Uncaptured exception[%s] detected in %s::%d.', get_class($throwable), $throwable->getFile(), $throwable->getLine()));

}

}

}

}

});

return is_int($result) ? $result : -1;

}

可以看到,我们“劫持”了go()函数,给他做了一些改动,捕获了创建协程时抛出的异常,将异常打印到控制台上。(注:对于Coroutine::create方式创建的协程在callable中存在异常时会抛出Fatal error,这是我们不愿意看到的)。

所以,到这里我们似乎理解了为什么Hyperf要关闭Swoole的短名称,目的就是劫持go()、co()函数来捕获callable的异常避免进程抛出Fatal error

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值