在工作中我們經常遇到一些比較耗時的任務,比如用戶注冊發送郵件,審核短信通知等功能,同步執行這些功能的話,響應時間就會變長,所以一般我們會用隊列去管理這些功能,但是如果條件不允許怎么辦,今天get了一個新方式;
<?php /** * 進程關閉hook執行 */ class AsyncHook { private static $hook_list = array(); private static $hooked = false; /** * hook函數fastcgi_finish_request執行 * * @param callback $callback * @param array $params */ public static function hook($callback, $params) { self::$hook_list[] = array('callback' => $callback, 'params' => $params); if(self::$hooked == false) { self::$hooked = true; register_shutdown_function(array(__CLASS__, '__run')); } } /** * 由系統調用 * * @return void */ public static function __run() { fastcgi_finish_request(); if(empty(self::$hook_list)) { return; } foreach(self::$hook_list as $hook) { $callback = $hook['callback']; $params = $hook['params']; call_user_func_array($callback, $params); } } }
/**調用方式 **/ AsyncHook::hook(array($this, 'sendEmail'), array());//面向對象調用 AsyncHook::hook('SmsService::sendSMS', array(trim($phone), $noticeWords));//面向過程方式調用