在工作中我们经常遇到一些比较耗时的任务,比如用户注册发送邮件,审核短信通知等功能,同步执行这些功能的话,响应时间就会变长,所以一般我们会用队列去管理这些功能,但是如果条件不允许怎么办,今天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));//面向过程方式调用
