利用 Gearman 实现系统错误报警功能
Gearman 是什么?
Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。
Gearman 工作原理
Client(客户端):创建一个Job。
Server(服务):找到合适的Worker,把 Job 交给 Worker。
Worker(工人):执行Job。

Web 中常用的场景。
裁剪图片,生成缩略图。
文件分发(针对用户上传的文件,进行多台服务器分发)。
视频转码(对上传的视频,进行转码存储)。
系统报警(当系统出现问题的时候,第一时间通知相关人)。
这篇文章主要讲解 系统报警 场景
在开发系统的过程中,往往程序会出现这样,那样的问题。
我们要第一时间获取错误问题,通知短信,邮件通知给相关人员。
因为,短信、邮件的发送比较耗时,并发量大的情况下,会出现延时现象。
所以,使用 Gearman 实现短信,邮件的异步发送。
Gearman 安装的两种方式
方式一:官网推荐安装方法
官网地址:http://gearman.org/getting-st...
yum install gearmand
方式二:自定义安装
安装libevent:
wget get https://github.com/libevent/libevent/releases/download/release-2.0.22-stable/libevent-2.0.22-stable.tar.gz tar zxvf libevent-2.0.22-stable.tar.gz ./configure --prefix=/usr make && make install安装Gearman server and library:
wget get https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz tar zxvf gearmand-1.1.12.tar.gz cd gearmand-1.1.12 ./configure 如果报错:configure: error: could not find boost yum install -y boost boost-devel 如果报错:configure: error: could not find gperf yum install gperf 如果报错:configure: error: Unable to find libuuid yum install libuuid-devel make && make install 安装成功后,执行 gearmand -V 查询版本号。 gearmand -d 开启服务。 温馨提示:
仅供参考,遇到不可预测的问题,请进行Google。
安装Gearman PHP extension:
wget get http://pecl.php.net/get/gearman-1.1.2.tgz tar zxvf gearman-1.1.2.tgz cd gearman-1.1.2 /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config --with-gearman 如果报错:configure: error: Please install libgearman yum install -y libgearman-devel.x86_64
案例(系统报警)
开启服务
gearmand -d
执行Worker
php worker.php
client.php
<?php
//设置错误处理器
set_error_handler('errorHandler');
//在脚本结束时运行的函数
register_shutdown_function('fatalErrorHandler');
//这里发生一个警告错误,被errorHandler 捕获
$a = $b;
//发生致命错误,脚本停止运行触发 fatalErrorHandler
$c = new Test();
/**
* 错误处理
* @param int $err_no 错误代码
* @param string $err_msg 错误信息
* @param string $err_file 错误文件
* @param int $err_line 错误行号
* @param int $is_fatal_error 是否为致命错误
* @return string
*/
function errorHandler($err_no = 0, $err_msg = '', $err_file = '', $err_line = 0, $is_fatal_error = 0)
{
$strEmailInfo = ($is_fatal_error == 1) ? "【致命错误】\n" : "【警告错误】\n";
$strEmailInfo .= "时间:".date('Y-m-d H:i:s')."\n";
$strEmailInfo .= "错误代码:{$err_no}\n";
$strEmailInfo .= "错误信息:{$err_msg}\n";
$strEmailInfo .= "错误文件:{$err_file}\n";
$strEmailInfo .= "错误行号:{$err_line}\n";
$strSmsInfo = "[致命错误]错误代码:{$err_no},错误信息:{$err_msg},错误文件:{$err_file}";
$client= new GearmanClient();
$client->addServer("127.0.0.1", 4730);
$client->doNormal("send_mail", $strEmailInfo);
if ($is_fatal_error == 1) {
$client->doNormal("send_sms", $strSmsInfo);
}
}
/**
* 捕捉致命错误
* @return string
*/
function fatalErrorHandler() {
$e = error_get_last();
switch ($e['type']) {
case 1:
errorHandler($e['type'], $e['message'], $e['file'], $e['line'], 1);
break;
}
}
worker.php
<?php
$worker = new GearmanWorker();
$worker->addServer("127.0.0.1", 4730);
$worker->addFunction("send_mail", "doSendMail");
$worker->addFunction("send_sms", "doSendSms");
while ($worker->work());
/**
* 执行发送邮件的Job
* @param $job
* @return string
*/
function doSendMail($job)
{
$strEmailInfo = $job->workload();
/**
* 在这个方法里完善发送邮件的操作
* ......
* Demo是把信息写入到文件中
*/
return file_put_contents("gearman.txt", $strEmailInfo."\n", FILE_APPEND);
}
/**
* 执行发送短信的Job
* @param $job
* @return string
*/
function doSendSms($job)
{
$strSmsInfo = $job->workload();
/**
* 在这个方法里完善发送短信的操作
* ......
* Demo是把信息写入到文件中
*/
return file_put_contents("gearman.txt", $strSmsInfo."\n", FILE_APPEND);
}
gearman.txt
【警告错误】
时间:2016-09-22 23:15:10
错误代码:8
错误信息:Undefined variable: b
错误文件:/home/www/mi/gearman/client.php
错误行号:9
【致命错误】
时间:2016-09-22 23:15:10
错误代码:1
错误信息:Class 'Test' not found
错误文件:/home/www/mi/gearman/client.php
错误行号:12
[致命错误]错误代码:1,错误信息:Class 'Test' not found,错误文件:/home/www/mi/gearman/client.php
温馨提示
也可以用 Redis Queue 来实现上面的需求。
也可以用 Swoole 来实现上面的需求。
也可以了解下 Gearman 与 Swoole 的区别。
利用 Gearman 实现系统错误报警功能的更多相关文章
- 利用Gearman实现并发查询(Multi-Query)
这个样例是想从数据库查询出几个结果集,一般的做法是,一个接一个的发送查询,然后汇总结果进行输出. 以下我们利用Gearman的gearman_client_run_tasks实现并发的查询,gearm ...
- [转]PHP利用Gearman来处理并行多进程问题
From : http://www.yuansir-web.com/2013/11/25/php%E5%88%A9%E7%94%A8gearman%E6%9D%A5%E5%A4%84%E7%90%86 ...
- 利用gearman同步mysql数据到redis
一.Gearman 1.Gearman是一个分发任务的程序框架. 2.体系:a.client:发送一个jobb.server:找到合适的worker,把job交给该workerc.worker:处理j ...
- 在yii中使用gearman
最近项目需要将利用gearman进行任务调度,目前所用框架为yii,在部署好gearman后,试图在yii中调用gearman,一直报错: 提示reverse函数没有定义,明明已经定义了啊!可能是当时 ...
- gearman安装及初次使用
官网: http://gearman.org/ 一篇文章: 利用Gearman实现异步任务处理 一.问题分析 问题:在性能测试过程中,发现用户管理平台在进行图片上传时,性能不佳. 分析:经过代码分析 ...
- 利用QT、QWebview、ffmpeg实现的屏幕录制方案
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- 跨多种环境部署 Gearman -改善应用程序性能和降低服务器负载
您可能想要将工作扩散到一个大型机器群体中,或者想要在不同语言和环境之间共享功能,那么开放源码的 Gearman 服务可以让您轻松地将工作分布到网络中的其他机器.本文将介绍 Gearman 的一些典型应 ...
- Python基础篇【第3篇】: Python异常处理、反射、动态导入、利用反射的web框架
异常处理 什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当P ...
- 通过Gearman实现MySQL到Redis的数据同步
对于变化频率非常快的数据来说,如果还选择传统的静态缓存方式(Memocached.File System等)展示数据,可能在缓存的存取上会有很大的开销,并不能很好的满足需要,而Redis这样基于内存的 ...
随机推荐
- python请求服务器图片并下载到本地磁盘
>>> import os >>> os.getcwd() 'C:\\Python33' >>> os.chdir('E:\\python\\mm ...
- css下拉菜单写法
网页导航栏的下拉效果,通过div框的显示和隐藏实现. <html> <head> <meta charset="UTF-8"> <titl ...
- 【python】random
1.random 和其他语言一样,返回大于等于0.小于1的浮点数 2.uniform(a,b) 返回大于等于a.小于等于b的浮点数 3.randint(a,b) 这个很好理解,返回一个介于a和b之间的 ...
- 黑客常用dos命令
http://blog.csdn.net/CSDN___LYY/article/details/77802438
- 构造函数+原型的js混合模式
function Parent(){ this.name = "李小龙"; this.age = "30"; };Parent.prototype.lev=fu ...
- javaee utf-8文件的转换
package Zy; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.Fil ...
- eas之单据转换规则
/** * BOTP单据转换 * @param botpNum 转换规则编号 * @param BillInfo 原单据 */ public static void BOTP(String b ...
- 原生js封装ajax,深入理解$.ajax()
直接上代码 //封装的ajax函数 // 传一个对象,所有要用的参数都在对象中 因为不写对象 实参列表个数太多,所以像jq一样,调用ajax也是把对象当实际参数传进去 // type 请求方式 默认g ...
- Idea里面的postfix
感谢慕课网IntelliJ IDEA神器使用技巧 闪电侠讲师,感觉有些工具真的是听听别人讲的比自己琢磨快很多 https://www.imooc.com/learn/924 也可以这样找到postfi ...
- Linux思维导图之rpm、yum、编译
yum安装失败: 1.yum client 路径指向不正确:2.yum server 缓存未清理(yum clean all;yum makecache):3.网络不连通