关于webman使用fastcgi_finish_request函数的类似效果的方案

wgole

问题描述

有时候处理请求时需要快速响应用户,而把慢业务继续留在进程里执行,就像php-fpm使用fastcgi_finish_request函数就能达到这个效果。我知道webman是php进程处理请求,我想问用webman有没有这种类似的处理慢业务方案?

除了文档里提到的使用 队列、慢业务进程等方案,还有其他方案吗?

为此你搜索到了哪些方案及不适用的原因

文档里提到的使用 队列、慢业务独立进程等方案,这些会增加程序设计复杂度。

本来一个简简单单的需求增加了复杂度。我只想在当前控制器里处理对应的慢业务,同时也能快速响应用户的请求。传统的php-fpm使用fastcgi_finish_request()后,后面再写慢业务代码,这样就能完美解决问题。

案例1:
收到支付回调(如微信、支付宝等)时,验证成功并保存数据库支付表后就要马上把处理结果响应回去,而后续的其他操作再慢慢执行,例如,后续处理通知游戏发放元宝、记录日志等操作,这些常常因为第三方网络、服务器问题,或者IO问题导致处理速度比较慢。

在php-fpm项目中我基本都这样操作的:

register_shutdown_function(['Util', 'shutdown_function'], null, [], true);

//Util class...
public static function shutdown_function($func, $params = [], $end = false)
{
    static $stack = [];
    if ($func) {
        $stack[] = [
            'func' => $func,
            'params' => $params
        ];
    }

    if ($end) {
        function_exists('fastcgi_finish_request') && fastcgi_finish_request();

        foreach ($stack as $v) {
            call_user_func_array($v['func'], $v['params']);
        }
    }
}
132 4 0
4个回答

胡桃

Workerman现在没有FileAsync组件,后续的操作一样堵着,多开几个进程就行了

  • 暂无评论
tanhongbin

fastcgi_finish_request 如果返回用户信息成功了,但是 后续的业务处理失败了 怎么搞???队列是最保险的,而且你项目不用redis嘛? 如果用就是 一个命令安装包的事,你这种异步 太危险了 数据容易丢失

  • wgole 5天前

    需要异步的情况下,一般都不是很重要的东西,处理失败就失败了,况且丢失的概率很低,只有进程突然停掉才会丢失。

  • tanhongbin 5天前

    还是队列靠谱 而且fpm的异步 就是个笑话,生产都不会用的,数据量一上来 fpm就趴下了

nitron

我以前开皮卡,要多装货物就加一个拖挂就好,现在我开跑车了,请问多装货物怎么加拖挂

six

用定时器,效果和 fastcgi_finish_request 一样

use Workerman\Timer;
Timer::add(0.001, function(){}, [], false);

建议慢业务用队列,fastcgi_finish_request 这种机制都不适合运行太慢的业务,会影响正常业务请求。

  • wgole 5天前

    我倒没想到这个方法,确实能达到异步效果

×
🔝