xmpp创建聊天室_使用XMPP,SMS,pureXML和PHP创建警报系统

xmpp创建聊天室

在你开始前

本教程针对希望开发由IBM DB2 pureXML数据库提供动力的数据库驱动的应用程序的Web应用程序开发人员。 读者应该熟悉基本PHP代码,并且能够使用Windows命令提示符来遵循本教程。 还需要具有数据库管理系统和SQL语言方面的经验。 在本教程结束时,您将学习如何创建利用pureXML数据库的面向对象PHP Web应用程序。

关于本教程

IBM DB2 Express-C包含pureXML,这是一种将XML数据本地存储在关系数据库表中的方法。 pureXML允许用户查询,索引和操作此XML数据。 您可以使用一系列功能以无缝的方式处理关系数据和基于XML的数据的混合。 这使得能够开发利用传统关系数据库表和XML数据两者优势的应用程序。

XML现在被广泛用作可移植的数据存储格式,并且您会经常发现公共数据和Web服务以XML格式提供对其数据的访问。 通过使用IBM DB2 Express-C,您可以开发将这些XML数据直接加载到数据库中的应用程序,并创建由该数据驱动的应用程序,而不必将其转换为关系列。 当然,有时获取这些数据并将其转换是有意义的,并且在本教程中,您将看到在DB2中使用XML的各种技术的混合。

在本教程中,您将学习如何创建一个警报系统,该系统每天都会从欧洲中央银行网站查询欧元的汇率。 如果找到了一组新的费率,则应用程序会将这些数据加载到DB2数据库中,并且还将通过两种方式发送警报:作为Google Talk(XMPP)即时消息,以及作为SMS短信到单元格电话。 您还将学习如何将大量XML数据导入DB2数据库,在这种情况下,您将载入欧元汇率的整个历史,其历史可以追溯到1999年首次引入欧元时。 在本教程的后面,您将开发一个PHP脚本,该脚本生成当年每个月的最大汇率图表。

先决条件

要遵循本教程中的步骤,您将需要安装以下软件:

  • IBM DB2 Express-C 9.5
  • PHP 5.2
  • XMPPHP库

请参阅相关主题的链接到下载站点,并引导您通过上述软件的安装和配置的文章。

项目文件夹

本教程假定您将所有源代码存储在文件夹C:\ currency中。 如果尚未这样做,请立即打开Windows®Explorer并导航到C:驱动器的根目录,以创建此文件夹。 在其中右键单击并选择“ 新建”>“文件夹” 。 命名文件夹货币。 或者, 下载本教程的源代码,然后将文件夹提取到C:驱动器。

配置PHP

您需要对PHP配置文件进行一些更改才能遵循本教程。 在php.ini中,找到读取诸如error_reporting = E_ALL类的行,并将其更改为: error_reporting = E_ERROR

接下来,找到类似于以下内容的行: display_errors = On并将其更改为: display_errors = Off 。 最后,向下滚动文件,直到找到PHP扩展部分。 默认情况下,其中许多扩展名将被禁用,在行的开头用分号注释掉此特定功能。 要启用功能,只需在行首删除分号即可。 现在,在清单1中找到这些行,并确保除去每行开头的分号(;)。

清单1.删除分号
extension = php_curl.dll
extension = php_gd2.dll
extension = php_mbstring.dll
extension = php_openssl.dll
extension = php_sockets.dll

设置碎片

在本部分中,您将下载XMPPHP库,并设置Google Talk和Clickatell SMS网关帐户。

XMPPHP库

要与Google Talk即时消息传递服务进行通信,您需要下载XMPPHP库,该库将允许您使用PHP代码向Google Talk用户发送消息。 该文件以.tar.gz归档文件的形式分发,因此您将需要一种支持该文件格式的归档实用程序,例如7-Zip。 将存档内容提取到桌面上,然后复制XMPPHP文件夹并将其粘贴到C:\ currency的项目文件夹中。 该库包含在本教程的源代码中(请参见下载 ),因此,如果您使用这些文件,则无需单独下载XMPPHP。

Google Talk帐户

要发送Google Talk消息,您将需要两个Google Talk帐户,一个用于发送消息的脚本,另一个用于接收消息的收件人。 如果您有Gmail帐户,则已经有一个Google Talk帐户。 如果不是,请参阅参考资料中的链接,以便您进行注册。

除了注册两个Google Talk帐户外,您还需要登录其中一个帐户,然后将另一个帐户添加为联系人。 您可以通过Gmail或使用Google Talk客户端来执行此操作。 然后,您需要注销该帐户,然后登录到另一个帐户,在该帐户中,您将被要求接受刚刚发送的聊天邀请。 接受它,两个帐户现在可以相互通信。

Clickatell SMS网关帐户

要发送SMS短信警报,您需要具有Clickatell SMS网关服务的帐户。 在本节中,您将学习如何创建和配置Clickatell帐户,以便以后在开发警报脚本时可以将短信发送到手机。

转到Clickatell网站上的“立即购买”页面。 在这里,您需要创建一个新的Clickatell帐户。 在“新客户”部分,打开“选择产品”下拉列表,然后选择“ Clickatell Central(API)” 。 这将带您进入Clickatell注册表单, 如图1所示

图1. Clickatell注册表单
Clickatell注册表格的屏幕截图,用于选择产品,设置帐户和输入个人信息

在第1步(共4步)中,应该已经选择Clickatell Central产品。 在第2步(共4步)中,选择您想要的帐户承保范围。 如果不确定,请选择“ 国际”选项。 输入用户名和密码,然后输入安全密码,如图所示。 在第3步(共4步)下,输入所有标有星号(*)的字段。 选中仅个人使用将隐藏公司相关字段。 最后,选中我接受Clickatell的条款和条件框,然后按继续按钮。

最后一步是激活您的帐户并验证您的身份。 Clickatell将向您在上一页提供的地址发送电子邮件(请参见图1 ),并带有一个链接,该链接将激活您的帐户。 单击此链接以查看您的“我的帐户登录”页面,其中已预先填充了产品,用户名和客户ID, 如图2所示

图2. Clickatell我的帐户登录
Clickatell我的帐户登录的屏幕截图,其中包含您的产品,用户名和客户ID

输入密码,然后单击“ 登录”以登录到您的帐户。 现在,您应该会看到如图3所示的屏幕。

图3. Clickatell Central主页
Clickatell Central主页测试消息框和手机号码验证的屏幕截图

在“验证您的手机号码”框中,检查手机号码是否正确,然后单击“ 发送激活码”按钮,以将带有用于激活码的SMS短信发送到您的手机。 收到消息后,在框中输入代码,然后按立即验证 。 下一步是注册HTTP / S API。 单击顶部导航部分中的“ 管理我的产品”链接,然后从“我的连接”下拉列表中选择HTTP 。 现在,您应该会看到如图4所示的屏幕。

图4. Clickatell HTTP API表单
Clickatell HTTP API表单的屏幕截图

在“名称”字段中输入“ 货币警报” ,其余字段保持不变。 (在图4中 ,Dial Prefix(拨号前缀)字段中的值为爱尔兰(353),Callback Type(回调类型)字段中的值为HTTPGET。其他字段为空白。)现在按Submit(提交)设置API。 现在,您将看到一个确认屏幕,因此请在此处按“ 确定”返回到“管理我的产品”屏幕。 现在,您应该看到Currency Alerts连接,并在其旁边列出了API ID, 如图5所示。 (注意:在下面的屏幕截图的API ID字段中,我有意地清空了我的API ID值,因此您不会尝试使用它-提交请求时会看到您的API ID。)

图5. Clickatell HTTP API ID
Clickatell HTTP API ID的屏幕截图

现在,通过发送测试消息来测试API是否有效。 为此,您将需要以下详细信息:

  • 您的Clickatell用户名
  • 您的Clickatell密码
  • 您的Clickatell HTTP API ID
  • 您要以国际格式将邮件发送到的号码,不带+符号(例如353875555555)
  • 您要发送的文本(请注意,如果您使用的是免费测试学分,则您的消息将被Clickatell标准消息替换。使用付费学分发送的消息不会发生这种情况)

打开一个新的浏览器窗口,然后在地址栏中输入以下URL(用您自己的值替换值)。 出于格式化目的,URL多行显示。 要使用,URL是单个字符串。

http://api.clickatell.com/http/sendmsg?user=xxxx&password=xxxxx
&api_id=xxxxxx&to=xxxxxx&text=xxxxxx

为了使您在本教程中构建的示例应用程序中的SMS警报起作用,您需要在Clickatell网站上购买一些积分。 如果您不想这样做,则只需注释掉发送短信的行即可。 我将在本教程的那一点更详细地解释这一点。

安装并配置了应用程序的所有先决条件后,您现在即可创建数据库并为Alerts应用程序奠定基础。

建立基础

在本部分中,您将学习如何从欧洲中央银行(ECB)网站获取包含欧元的完整汇率历史记录的XML文件,并将其加载到IBM DB2数据库中。 然后,您将使用XMLTABLE函数将大型XML文档拆分为单独的文档,每个文档将存储在数据库中自己的行中,从而使查询变得更容易并提高了查询性能。 最后,您将创建一个数据库视图,该视图允许您使用普通SQL查询来检索数据,无论该数据是存储在关系列中还是作为XML文档中的属性存储。

从欧洲央行下载历史汇率

尽管本教程的源代码包括具有历史汇率的XML文件,但在您阅读本文时,它已经过时了。 因此,可以直接从ECB站点下载最新文件(请参阅参考资料中的链接)。 您可以安全地覆盖源代码文件夹中的文件。

右键单击该链接,然后选择“ 目标另存为”或“ 另存为” ,将文件下载到您的计算机。 确保将其保存在C:\ currency的项目文件夹中。 在撰写本文时,文件大小约为3兆字节,尽管随着每个工作日添加更多费率,该文件大小会随着时间的推移而增长。

在将该XML文件导入DB2数据库之前,需要创建一个逗号分隔的.del文件,该文件告诉数据库如何导入数据。 打开您喜欢的文本编辑器,然后在新文件中输入以下行: 1,"<XDS FIL='eurofxref-hist.xml'/>"

将此文件另存为currency.del在您的项目文件夹中。 如果使用记事本作为文本编辑器,请确保在保存对话框中将文件名括在双引号中(作为“ currency.del”),以防止记事本自动将.txt扩展名附加到文件名中。

创建货币数据库

下一步是创建一个新的DB2数据库。 为此,请打开“ DB2命令编辑器”(“ 开始”>“程序”> IBM DB2> [DBNAME]>“命令行工具”>“命令编辑器” )并发出以下命令: create database currency using codeset UTF-8 territory US

接下来,连接到这个新创建的数据库: connect to currency

在将数据导入数据库之前,需要创建一个表来存储数据。应用程序将不会使用该表,它只是将XML文档加载到其中的中间表。 发出清单2中的以下命令来创建表。

清单2.创建一个表以将XML文件导入
create table temp_rates (
    id int primary key not null,
    data xml
)

将XML文件导入数据库

接下来,您将使用之前创建的currency.del文件将XML文档导入数据库。 清单3将读取该文件的内容,并将该值放在逗号(在本例中为1)之前的temp_rates表的id列中。 <XDS>标记告诉DB2从何处读取XML数据文件,并将其存储在data列中。

清单3.将XML导入DB2
import from "C:\currency\currency.del" of del
    xml from "C:\currency"
insert into temp_rates;

如果一切都按计划进行,您应该会看到类似以下的成功响应: SQL3149N "1" rows were processed from the input file. "1" rows were successfully inserted into the table. "0" rows were rejected SQL3149N "1" rows were processed from the input file. "1" rows were successfully inserted into the table. "0" rows were rejected SQL3149N "1" rows were processed from the input file. "1" rows were successfully inserted into the table. "0" rows were rejected

值得通过执行以下SQL语句来验证是否按预期插入了数据: select * from temp_rates 。 这将自动切换到“查询结果”选项卡,您将在其中看到ID为1的一行,并且数据列指示其中包含XML内容(请参见图6 )。

图6.查询结果
数据库的“查询结果”选项卡的屏幕截图

在数据列下,您将看到一个带有三个点(...)的按钮。 单击此按钮以打开XML Document Viewer窗口。 在此窗口中,您应该能够浏览刚刚导入的汇率数据的XML表示形式(请参见图7 )。

图7. XML文档查看器
XML Document Viewer中的Tree View选项卡和Attribute View的屏幕截图

验证XML数据已正确导入数据库后,现在您可以处理该数据并将其拆分,以便将其存储在多行中。 这将使在您的应用程序中查询此数据变得更加容易(并且更快)。

将数据拆分为单独的数据库行

将整个文档存储在一行中很难查询,并且每次添加数据时都会重写整个XML文档,这远非理想。 如果您在费率适用的每个日期都有单独的一行,那就更好了。 这使查询数据更加容易和快捷,并且还可以轻松地将新数据作为新行插入。

拆分此数据的第一步是创建一个新表,该表将保存应用程序的费率(请参见清单4 )。

清单4.创建一个表以将XML数据拆分为
create table rates (
    date date primary key not null,
    rates xml
)

现在,您需要在此费率表上将大型XML文档拆分为单独的行。 清单5中的命令使用XMLTABLE函数来做到这一点。

清单5.将数据拆分为单独的行
insert into rates(date, rates)
select x.date, x.rates
from temp_rates tr,
    xmltable('$d/*:Envelope/*:Cube/*:Cube'
    passing cast(tr.data as XML) as "d"
    columns
        date date path '@time',
        rates xml path 'document{.}'
    ) as x

该语句使用XMLTABLE函数将每个相关<Cube>标记的时间属性映射为所讨论的费率的日期,该元素及其子节点存储在rate XML字段中。 要验证此过程是否有效,请发出以下命令: select * from rates

这次的结果应该更具吸引力, 如图8所示 。 每个日期都有其自己的行和其自己的XML文档。

图8.结果分成许多行
“查询结果”选项卡的屏幕截图,结果分为多行

单击更多(...)按钮以仅显示该特定日期的XML费率数据(请参见图9 )。

图9.特定日期的XML数据
特定日期的“树视图”选项卡和XML数据的“属性视图”的屏幕截图

当您返回到“查询结果”选项卡时,您可能会注意到仅显示100行。 您是否导入的数据可以追溯到1999年? 如果是这样的话,肯定应该有超过2,000行吗? 不要惊慌 缺省情况下,DB2命令编辑器一次只获取100行。 要获取另外100行,请单击“ 获取更多行”按钮。 如果要检查表中有多少行,请使用以下命令: select count(*) from rates

当我运行此命令时,有2,783行。 对于在撰写本文至阅读本教程之间的每个工作日,应在表中增加一行。

创建XML数据的关系视图

最后的数据库配置步骤是创建XML数据的关系视图,这将使应用程序更容易查询货币数据。 通过创建此视图,您将能够使用典型SQL查询来使用聚合函数,WHERE子句,ORDER BY子句和GROUP BY子句对结果进行过滤,排序和分组(请参见清单6 )。

清单6.创建rates_viewSQL语句
create view rates_view(seq_no, date, currency, rate, doc)
as select x.seqno, r.date, x.currency, x.rate, x.doc
from rates r,
    xmltable('$d/*:Cube/*:Cube' passing r.rates as "d"
    columns
        seqno for ordinality,
        currency varchar(5) path '@currency',
        rate varchar(20) path '@rate',
        doc xml path 'document{.}'
    ) as x

让我们通过使用一些简单的查询来验证视图是否按预期工作来完成本节。 首先,查询特定日期的费率: select * from rates_view where date = '2009-11-13'

您应该在Query Results选项卡中看到33个结果, 如图10所示

图10.按日期过滤率的查询结果
2009-11-13按日期查询结果过滤率的屏幕截图

值得注意的是,周六和周日没有汇率波动,因此,如果按日期进行筛选时未得到任何结果,请确保所筛选的日期不是周六或周日!

接下来,仅查询USD(美元)汇率: select * from rates_view where currency = 'USD'

现在,您应该看到每个工作日的USD条目。 尽管“命令编辑器”一次只显示100行,但应该可以追溯到1999年1月。最后,让我们执行一个基于日期和货币进行过滤的查询: select * from rates_view where currency = 'USD' and date = '1999-12-30'

这次,您应该在结果集中看到一行。 如您所见,欧元和美元此时实际上彼此平价。

这样就完成了数据库配置。 在本教程的下一部分中,您将创建一个脚本,该脚本获取当前日期的费率,如果有关日期尚不存在,则在费率表中插入新行。 然后,将扩展此脚本以使用XMPP即时消息和SMS文本消息发送警报。

创建更新PHP脚本

在本教程的这一部分中,您将开发示例应用程序的核心。 这以将执行三个主要功能PHP脚本为中心:

  • 从ECB网站获取今天的汇率(请参阅参考资料 ),如果尚未添加,则将其插入货币数据库的汇率表中
  • 使用XMPP协议和XMPPHP库向Google Talk用户发送消息
  • 使用Clickatell SMS网关服务向手机发送消息

您可能对作为服务器端Web应用程序语言PHP编程很熟悉,但是在本教程中,您将通过Windows命令提示符而不是通过Web浏览器调用您创建PHP脚本。

要遵循此部分,您PHP安装文件夹将需要位于Path上。 请参阅相关信息中的链接以获取更多信息。

在创建update.php脚本之前,您需要创建几个辅助PHP类。

创建助手PHP类

您将创建的所有PHP脚本和类都应存储在C:\ currency文件夹中。 在本节中,您将创建两个PHP类: DBGTalk ,分别存储在文件db.php和gtalk.php中。 DB类包含用于连接到DB2数据库的所有逻辑,而GTalk类则用于与Google Talk XMPP服务器进行通信。

首先创建DB类,该类应另存为C:\ currency \ db.php(请参见清单7 )。

清单7. db.php
<?php
class DB {
    private $conn;

    function __construct() {
        $database = "currency";
        $hostname = "localhost";
        $port = 50000;
        $user = "USERNAME";
        $password = "PASSWORD";

        $db_connect_string = "DRIVER={IBM DB2 ODBC DRIVER};"
            . "DATABASE=$database;"
            . "HOSTNAME=$hostname;PORT=$port;PROTOCOL=TCPIP;"
            . "UID=$user;PWD=$password;";

        $this->conn = db2_connect($db_connect_string, '', '')

        if(!$this->conn) {
            die(db2_conn_errormsg($this->conn));
        }
    }

    function query($sql) {
        $result = db2_exec($this->conn, $sql);
        if(!$result) {
            die(db2_stmt_errormsg());
        } else {
            return $result;
        }
    }

    function get_row($result) {
        return db2_fetch_array($result)
    }
}
?>

确保更改$user$password变量的值以匹配您自己的设置。 此类定义了一个构造函数,该构造函数连接到DB2货币数据库。 用于执行SQL查询的query函数和用于从DB2结果集中检索结果行的get_row函数。

接下来,创建GTalk类,并将其另存为C:\ currency \ gtalk.php。 此类的代码在清单8中

清单8. gtalk.php
<?php
require_once("XMPPHP/XMPP.php");
class GTalk {
    private $conn;

    function __construct() {
        $this->conn = new XMPPHP_XMPP('talk.google.com', 5222,
            'USERNAME', 'PASSWORD', 'xmpphp', 'gmail.com', 
            $printLog=false, $loglevel=0);
    }

    function connect() {
        try {
            $this->conn->connect();
            $this->conn->processUntil('session_start');
        } catch(XMPPHP_Exception $e) {
            die($e->getMessage());
        }
    }

    function disconnect() {
        try {
            $this->conn->disconnect();
        } catch(XMPPHP_Exception $e) {
            die($e->getMessage());
        }
    }

    function send_message($to, $msg) {
        $this->connect();
        try {
            $this->conn->message($to, $msg);
        } catch(XMPPHP_Exception $e) {
            die($e->getMessage());
        }
        $this->disconnect();
    }
}
?>

同样,您用自己的帐户设置替换USERNAMEPASSWORD值。 创建PHP帮助程序类后,您现在可以创建一个脚本,该脚本将从ECB网站中提取当前汇率,并将其作为一行插入到价格表中。

用今天的汇率更新汇率表

现在,您将创建一个使用curl扩展名的脚本,以从ECB网站获取欧元汇率的每日XML提要。 您将使用PHP的SimpleXML功能过滤掉插入费率表的日期和费率列所需的XML文件部分。 在将比率实际插入数据库之前,脚本将检查是否尚未插入比率,以防止存储重复的条目。

创建一个名为update.php的新文件,并将其保存在C:\ currency文件夹中。 此文件的内容在清单9中

清单9. update.php
<?php
require_once("db.php");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.ecb.europa.eu/stats
   /eurofxref/eurofxref-daily.xml");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$xml = curl_exec($ch);
curl_close($ch);

$doc = new SimpleXmlElement($xml, LIBXML_NOCDATA);
$today = $doc->Cube->Cube;
$todayAttr = $today->attributes();
$todayDate = $todayAttr['time'];
$rates = str_replace(array("\n", "\r", "\t"), '', $today->asXML());

$db = new DB;
$sql = "SELECT count(*) from rates "
    ."WHERE date = DATE('".$todayDate."')";
$result = $db->query($sql);
$row = $db->get_row($result);

if($row[0] == 0) {
    $insert_sql = "INSERT INTO rates(date, rates) "
        ."VALUES('".$todayDate."', '".$rates."')";
    $insert_result = $db->query($insert_sql);

    if(!$insert_result) {
        echo "An error occurred while adding rates to the "
            ."database.\n".db2_stmt_errormsg();
    }
} else {
    echo "There are already rates stored for today (or it is the "
        ."weekend!)";
}
?>

该脚本首先从ECB网站检索XML文档,以了解当今的欧元汇率。 然后,它使用SimpleXML函数将此文档解析为XML,选择time属性以查找文档适用的日期,并删除不必要的XML节点以保留要插入到费率表中的XML。

接下来,该脚本通过创建DB类的实例并发出查询来连接到数据库,该查询检查表中是否存在从今天的XML文件提取的日期的行。 如果脚本未找到任何行,它将继续在表中插入新行,否则它将显示一条错误消息,说明要么今天已导入费率,要么当前日期是周末,因为没有新的费率。

要执行脚本,请打开Windows命令提示符(“ 开始”>“程序”>“附件”>“命令提示符” )。 发出清单10中的命令以切换到C:\ currency目录(如果您已经在C:驱动器上,则只需要第二个命令)。

清单10.更改目录
c:
cd \currency

要执行更新脚本,请输入以下命令: php update.php

假设PHP安装文件夹位于系统的Path上,则此脚本应运行。 如果您的路径有问题,您可能会看到一条消息,说php不是可识别的命令。 如果发生这种情况,则需要在路径上放置PHP文件夹( 有关详细信息,请参阅参考资料 )。

如果在本教程开始时将历史数据加载到数据库中时从ECB网站下载了费率,则可能会看到如图11所示的消息。

图11.该日期的错误率
在命令提示符窗口中已经存储了某个日期(或周末)的费率的错误消息

这基本上意味着今天的货币数据已经被加载到数据库中,因此无需插入新行。 我确定您想测试该脚本是否正常运行,因此,请回到DB2 Command Editor中,输入以下语句从数据库中delete from rates where date = (select max(date) from rates)最新条目: delete from rates where date = (select max(date) from rates)

如果愿意,请检查表中的最新日期,以确保删除了今天的条目。 现在,回到Windows命令提示符窗口,然后重新输入先前的命令: php update.php

这次,您的脚本应该运行并且没有消息出现。 返回DB2 Command Editor,使用以下语句来验证是否成功插入了新的速率集: select * from rates where date = (select max(date) from rates)

您应该看到一行替换了刚才删除的行。 单击rate列中的更多(...)按钮,以验证是否已成功从ECB数据文件导入XML, 如图12所示

图12.从ECB文件导入的最新汇率
“树视图”选项卡和“属性视图”的屏幕截图,显示了从ECB文件导入的最新速率

提示:有一种快速的方法可以确定您要查看的数据是从历史ECB文件还是从每日文件导入的。 使用DB2导入时,所有与名称空间相关的属性都标记在父<Cube>节点上,例如xmlnsxmlns:gesmes 。 使用PHP脚本添加行时,这些命名空间不存在。

接下来,您将展开脚本,以使用XMPP协议将更新发送到Google Talk帐户。

通过XMPP协议向Google Talk用户发送消息

以目前的形式,该示例应用程序除了存储一堆货币汇率数据外,实际上并没有做太多事情。 通过扩展更新脚本,通过即时消息将最新的欧元对美元汇率发送到Google Talk帐户,为它添加一些简洁的功能。

Google Talk是XMPP应用程序的示例。 XMPP是一组用于实时通信的开放XML技术。 Google Talk是典型的即时通讯平台,就像MSN Messenger,AIM,Yahoo Messenger或ICQ一样。 多亏了开源的XMPPHP库,使用PHP与XMPP服务进行通信非常容易。

在本节中,您将需要修改update.php脚本。 第一个变化是您需要导入GTalk类。 在require_once("db.php");行下面require_once("db.php"); 添加以下行: require_once("gtalk.php");

您需要做的下一个更改是在if块中添加else子句,以检查$insert_result变量是否为false。 现在,该块应类似于清单11

清单11.更新了update.php中的if块
if(!$insert_result) {
    echo "An error occurred while adding rates to the "
        ."database.\n".db2_stmt_errormsg();
} else {
    $usd_sql = "SELECT rate FROM rates_view "
        ."WHERE date = '".$todayDate."' and currency = 'USD'";
    $usd_result = $db->query($usd_sql);
    $usd_row = $db->get_row($usd_result);
    $message = "[$todayDate] 1 Euro = ".$usd_row[0]." USD";

    $gtalk = new GTalk;
    $gtalk->send_message('user@gmail.com', $message);
}

确保将收件人(上面的user@gmail.com)更改为您要将邮件发送到的Google Talk帐户。 如果尝试在命令提示符下再次运行update.php脚本,则可能会再次收到该日期已经存在费率的错误。 返回DB2 Command Editor,再次使用以下语句删除最新条目: delete from rates where date = (select max(date) from rates)

确保您已登录到Google Talk或Gmail(如果尚未登录,它将向您发送一封电子邮件,内含该消息)。 现在回到“命令提示符”窗口并再次输入以下命令: php update.php

这次您应该不会出现任何错误,而是会打开一个Google Talk聊天会话, 如图13所示

图13.更新发送到Google Talk
更新发送到Google Talk时打开的聊天会话的屏幕截图

很整洁吧? 接下来,您将使这一概念更进一步,并实际上通过SMS短信向手机发送警报。

使用Clickatell SMS网关发送SMS消息

之前,您学习了如何使用Clickatell SMS网关设置帐户,该服务可让您从应用程序向手机发送SMS短信。 Clickatell HTTP / S API使发送文本消息变得非常简单,因此请直接跳入并修改脚本!

同样,您需要编辑update.php文件。 这次,将代码直接添加到清单11else块中发送Google Talk消息的代码下面。 清单12显示了您需要添加的代码。

清单12.在update.php中发送文本消息
$sms_user = "USERNAME";
$sms_pass = "PASSWORD";    
$sms_api_id = "0000000";
$sms_to = "353875555555";
$sms_msg = urlencode($message);

$ch_sms = curl_init();
curl_setopt($ch_sms, CURLOPT_URL,
    "http://api.clickatell.com/http/sendmsg"
    ."?user=$sms_user&password=$sms_pass&api_id=$sms_api_id"
    ."&to=$sms_to&text=$sms_msg");
curl_exec($ch_sms);
curl_close($ch_sms);

信不信由你,这就是使用PHP和curl扩展发送文本消息所需的全部代码! 同样,请确保将占位符变量值替换为实际设置。 您可以在Clickatell帐户设置中找到API ID。 在测试脚本之前,请再次继续并在DB2 Command Editor中删除最新的速率: delete from rates where date = (select max(date) from rates)

返回Windows命令提示符,重新运行更新脚本: php update.php

这次,您将看到Clickatell API的响应,其中包含已发送消息的ID, 如图14所示

图14. update.php脚本的响应
命令提示符窗口的屏幕截图,其中包含来自update.php脚本的响应和消息ID

但是,更重要的是,您还应该在手机上收到一条SMS文本消息,例如图15中的消息。

图15.在手机上查看的SMS更新
在手机上查看的SMS更新的屏幕截图,其中包含日期,汇率和发送电话

这仅真正触及了使用Clickatell API的功能。 一定要检查Clickatell网站的“帮助”部分,以找到更多可以使用其网关进行的出色操作(请参阅参考资料中的链接)。 接下来,您将安排脚本每天运行一次,这将使外汇汇率随着时间的推移自动更新,并在每个工作日向您发送消息,其中包含当天的欧元对美元汇率。

安排脚本每天自动运行

货币更新脚本的最后一个难题是安排它每天运行。 schtasks命令是Windows中鲜为人知的命令之一。 此功能相对强大的工具使您可以按指定的时间间隔安排批处理脚本和应用程序的执行。

将脚本放到调度程序上的第一步是创建将执行该脚本的批处理脚本。 在您喜欢的文本编辑器中创建一个新文件,并在其中添加以下行: php update.php

将此文件另存为update.bat在C:\ currency文件夹中。 现在,在命令提示符处输入以下命令以将此批处理文件添加到调度程序,要求它每天在上午8点运行(请注意,此命令全部在一行上): schtasks /create /tn "Currency Update" /tr c:\currency\update.bat /sc daily /st 08:00:00

可能会提示您输入Windows密码以确认任务。 创建任务后,您应该会看到一条类似于图16中的消息。

图16.计划任务成功创建
对成功创建的计划任务的命令提示符响应的屏幕截图

您可以使用以下命令检查当前计划了哪些任务: schtasks

如果要实际进行并让计划的任务进行测试运行,可以使用以下命令: schtasks /run /tn "Currency Update"

就是这样,脚本现在应该每天早上8点运行。 不必担心周六和周日(当ECB文件未更新时)。 该脚本将仅检测到没有可用的新费率,并且不会更新或发送警报。 当然,值得一提的是,您的计算机需要在创建计划任务的帐户下打开并登录才能执行。 为了确保每天执行一次更新,比每天一次更频繁地运行脚本可能更有意义。 您可以在本教程的“ 相关主题”中找到一些指向schtasks上有用资源的链接。

鉴于其代码行数量很少,因此在本节中创建的脚本相对强大。 它轮询每日ECB汇率XML文件以获取新汇率,如果找到新汇率,则首先向货币DB2数据库添加新行。 接下来,它以今天的欧元对美元汇率向Google Talk用户发送一条消息。 Finally, it sends the same message to a cell phone through a SMS text message. All of this is done automatically each day thanks to the schtasks Windows command. In the next section of this tutorial, you will see how to use the GD2 image PHP library to generate a graph plotting some of the historic data in the currency database.

Graphically representing the currency data

Earlier in this tutorial, you loaded a large amount of historic currency data into the currency DB2 database. In this section, you'll see how to graphically represent this information by plotting it on a graph using the PHP GD2 image library. You will create a PHP script that can be run on the command line that retrieves the maximum Euro to US dollar exchange rate for each month of the current year and plots it on a graph. The graph is created as a PNG image and saved as graph.png in the project folder (C:\currency).

Creating the graph script

Let's get started with the graph script. In your text editor, create a new file and save it as graph.php in the C:\currency folder. The first thing that this script needs to do is connect to DB2 and pull down the data that is to be plotted on the graph. Add the code from Listing 13 to the script to do just that.

Listing 13. Retrieving max rates, grouped by month for current year
<?php
require_once("db.php");

$db = new DB;

$sql = "select MAX(rate), month(date), monthname(date), year(date) "     
."from rates_view where currency = 'USD' "
    ."and year(date) = year(current timestamp) "
    ."group by year(date),month(date),monthname(date),year(date) "
    ."order by month(date)";

$result = $db->query($sql);

$months = array();
$year = 0;
while($row = $db->get_row($result)) {
    $key = substr($row[2],0,3);
    $value = $row[0];
    $months[$key] = $value;
    $year = $row[3];
}
?>

This code retrieves the grouped monthly data from the currency DB2 database and adds it to a PHP array named $months . Now, modify it to plot this data on a graph. Add the code in Listing 14 just before the ?> in Listing 13 .

Listing 14. Generating a bar chart in PHP
$width = 500;
$height = 400;
$hmargin = 30;
$vmargin = 30;

$chart_width = $width - ($hmargin * 2);
$chart_height = $height - ($vmargin * 2); 

$image = imagecreate($width, $height);

$month_width = 30;
$total_months = count($months);
$diff = ($chart_width - ($total_months * $month_width)) / 
    ($total_months +1);

$month_color = imagecolorallocate($image, 51, 102, 51);
$bg_color = imagecolorallocate($image, 235, 245, 235);
$text_color = imagecolorallocate($image, 0, 0, 0);
$out_bg_color = imagecolorallocate($image, 188, 222, 188);
$line_color = imagecolorallocate($image, 186, 220, 186);

imagefilledrectangle($image, 1, 1, $width - 2, $height - 2, 
    $out_bg_color);
imagefilledrectangle($image, $hmargin, $vmargin, $width - 1 - 
    $hmargin, $height - 1 - $vmargin, $bg_color);

$top = max($months)+(max($months)/10);
$gap = $chart_height / $top;

$hlines = 20;
$hgap = $chart_height / $hlines;

for($i=0;$i<=$hlines;$i++){
    $y = $height - $hmargin - $hgap * $i ;
    imageline($image, $hmargin, $y, $width - $hmargin, $y, 
        $line_color);
    $v = round(floatval($hgap * $i / $gap), 2);
    imagestring($image, 0, 5, $y-5, number_format($v, 2, '.', ','), 
        $text_color);
}

for($i=0;$i< $total_months; $i++){ 
    list($key,$value)=each($months); 
    $x1 = $vmargin + $diff + $i * ($diff+$month_width);
    $x2 = $x1 + $month_width; 
    $y1 = $vmargin + $chart_height - intval($value * $gap);
    $y2 = $height - $vmargin;
    imagestring($image, 0, 170, 10, "Max Monthly Values for Year "
        .$year, $text_color);
    imagestring($image, 0, $x1, $y1-10, $value, $text_color);
    imagestring($image, 0, $x1+7, $height-25, $key, $text_color);   
 imagefilledrectangle($image, $x1, $y1, $x2, $y2, $month_color);
}

imagepng($image, "graph.png");

This code uses the GD2 image library to generate a new image, 500 pixels wide and 400 pixels in height. In this image, it plots a series of bars, one for each month of the present year, with the y-axis showing the maximum Euro-to-dollar rate for the month in question.

Running the script and viewing the chart

In the Command Prompt window, execute the graph.php script with the following command: php graph.php .

This will create a new file in the C:\currency folder named graph.png. If you open this image file, it should look something like the image in Figure 17 .

Figure 17. Result of the graph script
Screen capture of  the result of the graph script: A bar graph of maximum rates per month in 2009

In this section, you learned how to plot historic data on a bar graph using the GD2 image library. You can create a wide range of graphs and images using this library. Of course, if you're looking for a more flexible option, you might look at some more powerful Flash or JavaScript charting libraries that allow you to create interactive and animated charts and graphs. But the GD2 library allows you to create visually impressive images without downloading external libraries or class files.

Suggested improvements

Although the sample application in this tutorial does quite a lot, you can easily expand it to perform a wide range of quite useful functions, such as:

  • Allow users to register for alerts (send messages to multiple users)
  • Allow users to select which currencies to receive alerts for
  • Allow users to define when to receive alerts
  • Create a Google Talk bot that allows users to request the current exchange rate for a particular currency by sending a message to the bot
  • Implement two-way SMS features that allow users to send a text message to a specified number, and they will receive an SMS in return with the exchange rate for the specified currency
  • Use a premium exchange rate data service to include foreign exchange data for currencies other than the Euro
  • Allow the user to select the currency for which they want to plot the exchange rate data on a graph
  • Create more graphs (pie charts, line graphs plotting historic currency data)
  • Create a search engine that allows users to find out what the exchange rates were on a particular date, or what date was a rate at its highest or lowest and so on
  • Create RSS feeds with the currency updates

摘要

In this tutorial you learned how to create an IBM DB2 database that stores Euro foreign exchange currency data in native XML format. You learned how to import a large XML document into the database using DB2's IMPORT command. You then split this data into separate rows using SQL/XML. Next, you created a script that polls the ECB daily rate XML file for new rates, before adding these rates in a new row in the database. Next, you expanded this script to send messages to a Google Talk user, and then to a cell phone through an SMS text message. Finally, you learned how to use the PHP GD2 image library to create a script that generates a bar chart of historic currency data.

This tutorial highlights the power of pureXML and how storing XML data natively in the database makes it easier to develop applications that rely on external XML data sources. With the sample application you built, you should have a strong base from which to develop a full-featured and highly useful alerts application.


翻译自: https://www.ibm.com/developerworks/xml/tutorials/x-alertxmpptut/index.html

xmpp创建聊天室

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值