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 实现系统错误报警功能的更多相关文章

  1. 利用Gearman实现并发查询(Multi-Query)

    这个样例是想从数据库查询出几个结果集,一般的做法是,一个接一个的发送查询,然后汇总结果进行输出. 以下我们利用Gearman的gearman_client_run_tasks实现并发的查询,gearm ...

  2. [转]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 ...

  3. 利用gearman同步mysql数据到redis

    一.Gearman 1.Gearman是一个分发任务的程序框架. 2.体系:a.client:发送一个jobb.server:找到合适的worker,把job交给该workerc.worker:处理j ...

  4. 在yii中使用gearman

    最近项目需要将利用gearman进行任务调度,目前所用框架为yii,在部署好gearman后,试图在yii中调用gearman,一直报错: 提示reverse函数没有定义,明明已经定义了啊!可能是当时 ...

  5. gearman安装及初次使用

    官网:  http://gearman.org/ 一篇文章: 利用Gearman实现异步任务处理 一.问题分析 问题:在性能测试过程中,发现用户管理平台在进行图片上传时,性能不佳. 分析:经过代码分析 ...

  6. 利用QT、QWebview、ffmpeg实现的屏幕录制方案

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  7. 跨多种环境部署 Gearman -改善应用程序性能和降低服务器负载

    您可能想要将工作扩散到一个大型机器群体中,或者想要在不同语言和环境之间共享功能,那么开放源码的 Gearman 服务可以让您轻松地将工作分布到网络中的其他机器.本文将介绍 Gearman 的一些典型应 ...

  8. Python基础篇【第3篇】: Python异常处理、反射、动态导入、利用反射的web框架

    异常处理 什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当P ...

  9. 通过Gearman实现MySQL到Redis的数据同步

    对于变化频率非常快的数据来说,如果还选择传统的静态缓存方式(Memocached.File System等)展示数据,可能在缓存的存取上会有很大的开销,并不能很好的满足需要,而Redis这样基于内存的 ...

随机推荐

  1. Cookie、Token与Session介绍(非原创)

    文章大纲 一.Cookie介绍二.Token介绍三.Session介绍四.Token.Cookie与Session比较五.参考文章   一.Cookie介绍 1. Cookie是什么 cookie机制 ...

  2. C#动态验证码

    验证码定义: 就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能 项目中,我们登录注册 ...

  3. Redis学习笔记(三)-数据类型之string类型

    string是redis最基本的类型,而且string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象.从内部实现来看其实string可以看作byte ...

  4. 用JSP实现动态交互

    一.什么是JSP? 1.在HTML中嵌入Java脚本代码 2.由应用服务器中的JSP引擎来编译和执行嵌入的Java脚本代码 3.然后将生成的整个页面信息返回给客户端   二.为什么需要基于B/S技术的 ...

  5. 【ng-zorro-antd】加入in-memory-web-api插件后icon不显示

    在ng-zorro-antd框架下,根据angular的技术文档demo,加入in-memory-web-api后icon不显示 解决方案: 在app.module.ts中的imports:[]加入 ...

  6. css 陌生属性

    记录一些我之前没见过属性 1.width:100vh  100vh 2.min-height:calc(100vh + 51px);cale 3.:nth-child nth-child   和 :n ...

  7. namespace、struct、enum、union、string(day01)

    一 C++概述 C++历史背景 )C++的江湖地位 jave C C++ C# python )C++之父:Bjarne Stroustrup(--) ,Cpre,为C语言增加类的机制 ,Bjarne ...

  8. python中字节与字符串的转换

    #bytes object    byte = b"byte example"     # str object    str = "str example" ...

  9. Qt5.11+opencv3.4的配置安装

    系统:Windows 10 64位 前期准备: 1.CMake下载安装 下载地址:https://cmake.org/download/ 选择msi安装文件,按照提示一步一步按照就好 可以参考:htt ...

  10. python中的二进制、八进制、十六进制

    python中通常显示和运算的是十进制数字. 一.python中的二进制 bin()函数,将十进制转换为二进制,0b是二进制的前缀.如: >>> bin(10) '0b1010' 二 ...