在工作中我们经常遇到一些比较耗时的任务,比如用户注册发送邮件,审核短信通知等功能,同步执行这些功能的话,响应时间就会变长,所以一般我们会用队列去管理这些功能,但是如果条件不允许怎么办,今天get了一个新方式;

  1. <?php
  2. /**
  3. * 进程关闭hook执行
  4. */
  5. class AsyncHook {
  6. private static $hook_list = array();
  7. private static $hooked = false;
  8. /**
  9. * hook函数fastcgi_finish_request执行
  10. *
  11. * @param callback $callback
  12. * @param array $params
  13. */
  14. public static function hook($callback, $params) {
  15. self::$hook_list[] = array('callback' => $callback, 'params' => $params);
  16. if(self::$hooked == false) {
  17. self::$hooked = true;
  18. register_shutdown_function(array(__CLASS__, '__run'));
  19. }
  20. }
  21. /**
  22. * 由系统调用
  23. *
  24. * @return void
  25. */
  26. public static function __run() {
  27. fastcgi_finish_request();
  28. if(empty(self::$hook_list)) {
  29. return;
  30. }
  31. foreach(self::$hook_list as $hook) {
  32. $callback = $hook['callback'];
  33. $params = $hook['params'];
  34. call_user_func_array($callback, $params);
  35. }
  36. }
  37. }

调用方式

  1. AsyncHook::hook(array($this, 'sendEmail'), array());//面向对象调用
  2. AsyncHook::hook('SmsService::sendSMS', array(trim($phone), $noticeWords));//面向过程方式调用


相关评论(0)
您是不是忘了说点什么?

友情提示:垃圾评论一律封号...

还没有评论,快来抢沙发吧!