有时候处理请求时需要快速响应用户,而把慢业务继续留在进程里执行,就像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']);
}
}
}
Workerman现在没有FileAsync组件,后续的操作一样堵着,多开几个进程就行了
fastcgi_finish_request 如果返回用户信息成功了,但是 后续的业务处理失败了 怎么搞???队列是最保险的,而且你项目不用redis嘛? 如果用就是 一个命令安装包的事,你这种异步 太危险了 数据容易丢失
需要异步的情况下,一般都不是很重要的东西,处理失败就失败了,况且丢失的概率很低,只有进程突然停掉才会丢失。
还是队列靠谱 而且fpm的异步 就是个笑话,生产都不会用的,数据量一上来 fpm就趴下了
我以前开皮卡,要多装货物就加一个拖挂就好,现在我开跑车了,请问多装货物怎么加拖挂
形象,webman是跑车,fpm是皮卡
用定时器,效果和 fastcgi_finish_request 一样
建议慢业务用队列,fastcgi_finish_request 这种机制都不适合运行太慢的业务,会影响正常业务请求。
我倒没想到这个方法,确实能达到异步效果