在工作中我們經常遇到一些比較耗時的任務,比如用戶注冊發送郵件,審核短信通知等功能,同步執行這些功能的話,響應時間就會變長,所以一般我們會用隊列去管理這些功能,但是如果條件不允許怎么辦,今天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));//面向過程方式調用