根据本教程的演示目的,您将只需使用在这里创建的两个用户。但是,如果您希望在您的应用程序中支持复杂的每用户通知,那么您需要能够以编程方式从您的应用程序的 PHP 部分添加和移除用户。Openfire 的 User Service 插件通过一个用于 XMPP 用户管理的 REST 界面向您提供这个功能。要安装这个插件,从 Openfire 插件站点(参见 )下载它。插件本身是单个文件:userservice.jar。您必须将其放置到您的 Openfire 安装的 /plugins 目录中。
使用您建立的管理员凭证登录到管理屏幕。单击 Edit Properties(位于 Server ports 下方),记录列示的服务器名称。这个名称将形成您的 JIDs 的域部分。这个名称是不可互换的,比如,不能使用 localhost 替代 127.0.0.1,反之也不行。
单击顶部导航菜单中的 Users/Groups 并创建两个新用户。这些用户将您在开发过程中的测试用户。
单击 Server settings,然后单击 Offline messages。由于您将 XMPP 用于界面通知,因此应将 Offline Message Policy 设置为 Drop,如 图 4 所示。您不想保存用户没有登录时收到的消息,否则,当他们返回时,可能会被数千条通知所 “淹没”。
图 4. 丢弃离线消息在 Server settings 中,单击 Server to Server。对于本文,您不必连接到外部服务器,因为您不需要作为更大的 XMPP 网络的一个连接部分操作。因此,将 Service Enabled 设置为 Disabled,Allowed to Connect 设置为 White List。这些设置将阻止未授权的连接造成破坏。
配置 Apache 以通过 BOSH 转发 XMPPOpenfire 在 :7070/http-bind 维护了一个 HTTP 绑定 URL,以便通过 BOSH 访问。要在端口 80 上使用这个 URL,您必须配置 Apache HTTP Server 以将一个 URL 转发到这个位置。为此,您需要启动代理模块。
打开您的 http.conf Apache 配置文件并找到 mod_proxy.so 和 mod_proxy_http.so 的 LoadModule 条目,它们默认被注释掉。移除前导的井字符(#),取消注释。这个配置文件的 Dynamic Shared Object (DSO) Support 部分中的多个适当的行(不一定在一起)现在应该类似于 :
清单 8. 启用 Apache HTTP Server 中的代理支持LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_module modules/mod_proxy.so
在配置文件的末尾,添加 中的行(如果您没有将 locahost 作为您的测试服务器环境,则应将 127.0.0.1 替换为您的服务器 IP 地址):
清单 9. httpd.cof 中的 XMPP 代理规则# XMPP proxy rule ProxyRequests Off ProxyPass /xmpp-httpbind :7070/http-bind/ ProxyPassReverse /xmpp-httpbind :7070/http-bind/
注意,在 中,您在端口 80 上使用了一个稍微不同的 URL:/xmpp-httpbind。这个 URL 是 strophe.js(您稍后将用到的客户端 JavaScript 框架)分配给一个用于设置 BOSH 端点的变量的值。
重启服务器。现在,您可以开始编写使用 XMPP 的 web 应用程序了。
创建使用 XMPPHP 的服务器应用程序在前面的小节中,您设置了服务器和插件。在本小节中,您将创建您的实时应用程序的服务器端部分。
服务器端功能您的应用程序的 PHP 端将执行以下两个主要任务:
XMPPHP 是应用最广泛的针对 PHP 的 XMPP 库。与 ejabberd 和 Openfire 一样,它也是免费和开源的,因此它是首次使用 XMPP 开发人员的一个不错的起点。
下载 XMPPHP(参见 )。解包这个归档并将其插入您的新项目的 lib/xmpphp 子文件夹中。
最后,为节约您的 RSS 提要的解析时间,下载并安装 Last RSS PHP 解析器(参见 )。
存储服务器端设置您将使用此前创建的两个测试用户之一作为您的通知发送方。在您的 /pingstream 的根中创建一个名为 config.inc.php 的文件,并添加 中的内容:
清单 10. 服务器端配置设置<?php // Pingstream configuration file // Define global $CONFIG array - don't change this! global $CONFIG; $CONFIG = array(); $CONFIG['send'] = new stdClass(); // Set account details for sending party $CONFIG['send']->user = 'testuser'; // User portion of JID $CONFIG['send']->host = '127.0.0.1'; // Host portion of JID $CONFIG['send']->resc = 'pingstream';// Resource portion of JID $CONFIG['send']->pass = 'mypass'; // Password for user
config.inc.php 文件还必须包含关于您的接收方的细节,如 所示:
清单 11. 关于接收方的细节// Set the receiving account details $CONFIG['receive'] = 'receivinguser@127.0.0.1';
您还需将少量数据缓存在一个文件中,因此 config.inc.php 需要包含一个可写入的文件路径,如 所示:
清单 12. 设置存储临时文件的位置// Full path to your cache directory, with trailing slash $CONFIG['cachedir'] = '/tmp/';
如果您位于一台 Microsoft® Windows® 机器上,那么您可以将这个位置设置为一个空字符串。否则,确保您指定的目录包含一个完整路径和一个结束斜杠,并被设置为全局可写入(world-writeable)。
定义数据源您的 Pingstream 应用程序将检查 IBM developerWorks Web development 专区提要获取更新,因此,将 中的内容添加到 config.inc.php:
清单 13. 检查一个 developerWorks 提要获取更新// Set the RSS feed you're going to check $CONFIG['rss'] = 'http://www.ibm.com/developerworks/views/web/rss/libraryview.jsp';
现在,创建另一个新文件:/lib.inc.php。这将是您的库文件,包含在您的应用程序的主控制器页面和用户界面页面中。
lib.inc.php 的顶端必须引用 config.inc.php(主 XMPPHP 库)和 lastRSS,如 所示:
清单 14. 加载必要的库<?php // Load libraries require_once('XMPPHP/XMPP.php'); require_once('config.inc.php'); require_once('lastRSS.php');
接下来,您将创建一个函数来通过 XMPP 将一条消息发送到客户端。通过 XMPPHP 完成这个任务很简单,只需使用在您的配置文件中保存的凭证建立一个连接,发送消息,然后关闭连接。
在这个函数的第一部分中,您创建了一个新的 XMPPHP_XMPP 对象,如 所示:
清单 15. 创建一个新的 XMPP 连接对象// Load configuration global $CONFIG; $conn = new XMPPHP_XMPP( $CONFIG['connect']->host, 5222, $CONFIG['connect']->user, $CONFIG['connect']->pass, $CONFIG['connect']->resc);
注意,XMPPHP 通过 XMPP 通信的默认端口 5222 连接到您的 XMPP 服务器。尽管您的客户端通信需要使用 BOSH,但服务器端没有这个要求。
要连接到 XMPP 服务器,需要发送一个初始连接请求,一直等到接收到您的 XMPP 会话已经启动的通知,然后发送一个联机状态节来声明您处于在线状态(参见 ):
清单 16. 建立一个 XMPP 连接$conn->connect(); $conn->processUntil('session_start'); $conn->presence();
下一步是发送消息本身,该消息已被预先填充到一个名为 $message 的变量中(参见 ):
清单 17. 发送消息$conn->message($CONFIG['receive'], $message);
然后您使用 $conn->disconnect(); 断开连接。