有時候處理請求時需要快速響應(yīng)用戶,而把慢業(yè)務(wù)繼續(xù)留在進程里執(zhí)行,就像php-fpm使用fastcgi_finish_request函數(shù)就能達到這個效果。我知道webman是php進程處理請求,我想問用webman有沒有這種類似的處理慢業(yè)務(wù)方案?
除了文檔里提到的使用 隊列、慢業(yè)務(wù)進程等方案,還有其他方案嗎?
文檔里提到的使用 隊列、慢業(yè)務(wù)獨立進程等方案,這些會增加程序設(shè)計復(fù)雜度。
本來一個簡簡單單的需求增加了復(fù)雜度。我只想在當(dāng)前控制器里處理對應(yīng)的慢業(yè)務(wù),同時也能快速響應(yīng)用戶的請求。傳統(tǒng)的php-fpm使用fastcgi_finish_request()后,后面再寫慢業(yè)務(wù)代碼,這樣就能完美解決問題。
案例1:
收到支付回調(diào)(如微信、支付寶等)時,驗證成功并保存數(shù)據(jù)庫支付表后就要馬上把處理結(jié)果響應(yīng)回去,而后續(xù)的其他操作再慢慢執(zhí)行,例如,后續(xù)處理通知游戲發(fā)放元寶、記錄日志等操作,這些常常因為第三方網(wǎng)絡(luò)、服務(wù)器問題,或者IO問題導(dǎo)致處理速度比較慢。
在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']);
}
}
}
fastcgi_finish_request 如果返回用戶信息成功了,但是 后續(xù)的業(yè)務(wù)處理失敗了 怎么搞???隊列是最保險的,而且你項目不用redis嘛? 如果用就是 一個命令安裝包的事,你這種異步 太危險了 數(shù)據(jù)容易丟失