Swoole的defer功能用于在协程结束前延迟执行清理任务,其作用范围限于当前协程。通过Swoole\Coroutine::defer()注册的回调按后进先出顺序执行,适用于资源释放如数据库连接归还、上下文还原等场景,即使协程异常退出也能确保执行,提升代码健壮性。

Swoole 的 defer 功能用于在当前协程即将结束时,延迟执行一个回调函数。它的工作机制与 PHP 的 register_shutdown_function 类似,但作用范围更精确:只针对当前协程的生命周期末尾触发,而不是整个请求或脚本结束。
当你在协程中进行一些资源操作(如数据库连接、文件句柄、自定义上下文清理)时,可能希望在协程退出前自动执行清理逻辑。Swoole 提供了 Swoole\Coroutine::defer() 来注册这些清理任务。
<pre class="brush:php;toolbar:false;">go(function () {
    echo "协程开始\n";
    Swoole\Coroutine::defer(function () {
        echo "清理工作执行\n";
    });
    echo "协程运行中...\n";
    // 协程结束时,自动执行 defer 中的回调
});输出结果为:
协程开始
协程运行中...
清理工作执行
defer 回调会在当前协程结束前,按后进先出(LIFO)顺序执行。 也就是说,最后注册的 defer 回调最先执行。
执行时机包括:
exit 或 die 终止协程注意:即使协程中出现错误并退出,只要协程上下文存在,defer 依然会执行,适合做资源释放。
利用 defer 可以安全地管理协程级别的资源,比如:
<pre class="brush:php;toolbar:false;">go(function () {
    $redis = RedisPool::get();
    
    Swoole\Coroutine::defer(function () use ($redis) {
        RedisPool::put($redis); // 确保协程结束时归还连接
    });
    // 使用 $redis 执行操作
    $redis->set('key', 'value');
});defer 是协程级别的功能,必须在协程环境中调用,否则会抛出错误。
多个 defer 注册遵循栈结构:后注册的先执行,适合嵌套资源释放(如先打开的资源后释放)。
不能阻止协程退出,仅用于“善后”操作,不应在 defer 中执行耗时过长的任务。
基本上就这些。defer 是协程编程中实现自动清理的轻量手段,合理使用可提升代码健壮性。不复杂但容易忽略。
以上就是Swoole的defer功能是如何工作的的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号