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