Chinaunix首页 | 论坛 | 博客
  • 博客访问: 685517
  • 博文数量: 132
  • 博客积分: 10060
  • 博客等级: 上将
  • 技术积分: 1732
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-21 12:35
个人简介

迷惘的码农。

文章分类

全部博文(132)

文章存档

2013年(1)

2011年(2)

2010年(9)

2009年(41)

2008年(79)

我的朋友

分类:

2009-08-05 13:10:48

PHP的错误缺省是存在日志文件中的,很不方便,不能即时通知,多人协作开发得过滤自己关注的功能上的bug,而且可用的信息只有bug回溯;

联想到以前的工作中自定义错误处理方式,给开发这发邮件,其中有各种bug相关的信息,比如bug回溯、发生bug时的局部变量状态,对于快速找到出错原因是很有用的,当然,最即时的还是在页面上直接显示错误报告;但这也不是任何情况下都可用的,比如我们前端是flash,或者,别人使用过程中触发的bug,另外,那时候用的是gmail的邮箱,有个好处是gtalk可以即时提醒新邮件,但我们现在用公司内部的邮箱服务器,因此只是发邮件是不能即时通知的,outlook最快只能设置1分钟刷新一次;

ejabberd、xmpp的好处就不多说了,这次试验还发现服务器上可以存储离线消息,也是我们需要的功能;本来存在php的xmpp库的,不过php做得web都是瞬时的,不能维持bug机器人的长时间登陆状态,每次发消息都要先登录可不行,而ejabberd的插件(模块)机制允许做一个机器人驻留其中,另外内置的web服务也方便直接向它发消息;客户端不知道什么比较好,就装了个psi,其实我们只用到了接收错误报告的功能,不知到有没这种小巧的软件,而psi一次收到大量消息响应很慢,所以现在改成了只发送简单的通知,错误详情还是得看邮件;

那就开始吧:

在服务器上安装Ejabberd;内置erlang解释器,无需另外安装;我们用的Linux,就下载了其bin可执行安装文件,这个还不错,可以选择安装过程中的提示语言,然后设置几个常规选项、域名和管理账号就好了,比如域名为test(有需要就改hosts配置吧),帐号为admin@test,密码为admin;

装好之后就能直接启动了,桌面上有启动和停止的快捷方式,安装目录中有一些启动/停止的脚本,不过那个start运行后就进入了web界面(奇怪吧,因为装有w3m程序,可以在终端访问web,不过这个东东没用过,也没想去学习),都不知道怎么退出,Ctrl+C都不行,stop脚本也都不好用,所以还是用ejabberdctl start启动吧,终止就是ejabberdctl stop咯;然后在浏览器中访问(缺省端口)进入管理界面,详情自己看吧,有一点不错,可以直接注册用户,比较方便,当然自己通过客户端注册也一样,各随喜好;

基本环境具备了,然后是加入一个模块,功能是接收web消息,然后发送给指定的账号;加入这个模块名为mod_bugbot,源代码如下:


-module(mod_bugbot).
-author('huangshiqiang@test').
-vsn('1.0').

%-define(EJABBERD_DEBUG, true).
-define(MYHOST, "test").
-define(BUGBOT, "bugbot").
-define(DEFAULTUSER, "master").

-behaviour(gen_mod).

-export([start/2, stop/1, process/2]).

-include("ejabberd.hrl").
-include("jlib.hrl").
-include("ejabberd_http.hrl").

start(_Host, _Opts) ->
    ok.

stop(_Host) ->
    ok.

process(_Path, R) ->
    From = #jid{user = ?BUGBOT, server = ?MYHOST, resource = [],
        luser = ?BUGBOT, lserver = ?MYHOST, lresource = []},
    To = #jid{user = ?DEFAULTUSER, server = ?MYHOST, resource = ?MYHOST,
     luser = ?DEFAULTUSER, lserver = ?MYHOST, lresource = ?MYHOST},
    case R#request.q of
        [{"user", User}, {"report", Report}] ->
            To2 = To#jid{user = User, luser = User},
            echo(From, To2, Report);
        Other ->
            Other
    end,
    "OK".

%% HELPER FUNCTIONS

%strip_bom([239,187,191|C]) -> C;
%strip_bom(C) -> C.

echo(From, To, Body) ->
    send_message(From, To, "chat", Body).

send_message(From, To, TypeStr, BodyStr) ->
    XmlBody = {xmlelement,
     "message",
     [{"type", TypeStr},
        {"from", jlib:jid_to_string(From)},
        {"to", jlib:jid_to_string(To)}],
     [{xmlelement, "body", [], [{xmlcdata, BodyStr}]}]},
    ejabberd_router:route(From, To, XmlBody).



这里面的test就是我们的域名咯,bugbot是发消息的账号(所以要先注册这个账号咯),master是缺省的接收者,就是在你根据一定的规则但是找不到接收者时用的,不过这一块儿没处理,因为接收者是错误进程发过来的;请求的信息也很简单,就是两个参数,user(不带@和域名后缀)和错误消息,GET或POST都可以;这只是一个基本的处理流程,并不包括复杂的处理逻辑;

使用这个模块的最简单的方式是:把它命名为mod_bugbot.erl并放在ejabberd安装目录中的lib/ejabberd-2.0.5/ebin下,然后编译../../../bin/erlc -I ../../../includes/ejabberd/include/ -pa . mod_bugbot.erl,生成的文件就在这个缺省的目录下,然后配置下conf/ejabberd.cfg,加入这个模块({mod_bugbot,   []})并让它处理某个web请求({request_handlers, [{["bugbot"], mod_bugbot}]},加在ejabberd_http那里,对应的url是),配置好就重启ejabberd服务器;

差不多了,测试一下,俺用php的curl扩展:

$url = "";
// $url = "";

$report = "&&错误";
$data_array = array(
    "user" => "hshqcn",
    "report" => $report,
);
$data = array();
foreach($data_array as $k => $v)
{
    $data[] = $k . "=" . urlencode($v);
}
$data = implode('&', $data);

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_exec($ch);
curl_close($ch);


如果是本地,test域名可能不能用,那就试试localhost;这段代码是给hshqcn@test发送“&&错误”这个消息,post方式,如果是get方式,就是:?user=hshqcn&report=&&错误
阅读(2081) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-11-23 15:05:41

我们基于ActiveMQ 和 M3 实现了这个想法, 目前在测试机上测试中.

chinaunix网友2009-08-05 14:11:53

想法很好!