在工作中我们经常遇到一些比较耗时的任务,比如用户注册发送邮件,审核短信通知等功能,同步执行这些功能的话,响应时间就会变长,所以一般我们会用队列去管理这些功能,但是如果条件不允许怎么办,今天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));//面向过程方式调用
Last modification:January 28th, 2021 at 03:43 pm
如果觉得我的文章对你有用,请随意赞赏