php 监控redis队列的长度,在队列堆积的时候实现微信报警

参考文档   http://php.net/manual/zh/function.set-error-handler.php

明显的三步走的需求(b步骤是不需要的  但是喜欢):

a.  监测输入队列的长度,并且在达到警界点的时间后 发出信号

b. 捕获报警信号  ,出发微信报警事件

c. 实现微信报警

a.

$current_length = $redis->lLen($que_name);

trigger_error($msg_error, E_USER_WARNING);

b.

定制错误捕捉函数

set_error_handler([$obj, 'triggerWechat']);

  public function triggerWechat($err_no, $err_str, $err_file)
    {
        // wei xin report
        if (($err_no == E_USER_WARNING) && (basename($err_file) === 'MonitorRedisQue.php')) {
            if (!DEBUG) {
                $wechat = new WechatNotify;
                $wechat->send_text_msg($err_str);
            }


            return true;
        }


        /* Don't execute PHP internal error handler */
        return false;
    }


完整源码:

$obj = new MonitorRedisQue($argc, $argv);
set_error_handler([$obj, 'triggerWechat']);
$obj->handle();

class MonitorRedisQue
{
    /**
     *  store redis que name and que length limiter
     *  @var array
     * */
    protected $items;

    public function __construct($argc, $argv)
    {
        if ($argc == 1) {
            $this->introduce();
        }

        unset($argv[0]);

        // check params format and set items
        array_map(function($element_check){
            if (strpos($element_check, '=') === false) {
                $this->introduce();
            }

            $element_check_arr = explode('=', $element_check);
            list($que_name, $que_limiter) = $element_check_arr;

            // check format
            if (!is_string($que_name) || !is_numeric($que_limiter)) {
                $this->introduce();
            }
            $this->items[] = [$que_name, $que_limiter];
        },$argv);
    }

    public function handle()
    {
        while (1) {
            if (!$this->items) {
                $end_msg = '监控队列全部超出限定长度,监控任务完成';
                debug($end_msg, true);
                exit($end_msg);
            }

            // tidy que
            $this->checkLimiter();
            sleep(1);
        }

    }

    /**
     * check redis que length
     */
    protected function checkLimiter()
    {
        $redis = getRedis();
        foreach ($this->items as $key => $item) {
            list($que_name, $que_limiter) = $item;

            // current length
            $current_limiter = $redis->lLen($que_name);

            $msg_current = '当前队列是: ' . $que_name . '限定长度是: ' . $que_limiter . ' 当前长度是:' . $current_limiter;
            debug($msg_current);

            // wei xin report
            if ($current_limiter > $que_limiter) {
                unset($this->items[$key]);
                $msg_error = ' Redis que name is ' . $que_name . ' que limiter is ' . $que_limiter . ' But current que length is ' . $current_limiter;
                debug($msg_error, true);
                trigger_error($msg_error, E_USER_WARNING);

            }
        }


    }

    protected function introduce()
    {
        $intro = <<请按照正确的语法输入参数
用法:
  php MonitorRedisQue.php  = [= ...]

参数:
  que_name                       redis队列名称
  que_limiter                    redis队列的限制长度

作用:
  监控队列堆积的长度是不是超过限制
  

EOF;
        exit($intro);

    }

    public function triggerWechat($err_no, $err_str, $err_file)
    {
        // wei xin report
        if (($err_no == E_USER_WARNING) && (basename($err_file) === 'MonitorRedisQue.php')) {
            if (!DEBUG) {
                $wechat = new WechatNotify;
                $wechat->send_text_msg($err_str);
            }

            return true;
        }

        /* Don't execute PHP internal error handler */
        return false;
    }

}

你可能感兴趣的:(php)