参考文档 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 = <<<EOF 请按照正确的语法输入参数 用法: php MonitorRedisQue.php <que_name>=<que_limiter> [<que_name2>=<que_limiter2> ...] 参数: 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; } }