Zend Framework zendhomepage by maugrim | 0 comments | Monday, November 20, 2006 概述 实话实说,创建一个聊天的程序不是一个很艰">
  首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>php>php基础>正文

用AJAX实现聊天功能(part 1)

http://www.oklinux.cn  2006-11-30  来源: PHPchina sandoz     会员收藏  游客收藏  【 】 

如何用AJAX实现聊天功能

AJAX   planetphp   Tutorials   javascript:;" onClick="javascript:tagshow(event, 'Zend');" target="_self">Zend Framework   zendhomepage  

by maugrim | 0 comments | Monday, November 20, 2006

 

概述

实话实说,创建一个聊天的程序不是一个很艰难的程序!

写这篇文章的目的是教你一步一步地用XML作为传输载体来创建一个轻量级的聊天程序。这是一个很有趣的应用,而我写这篇文章的动机也是来自于我平时很喜欢PHP。同时,通过业余时间的钻研,我发现通过Web提供了一个稳定的论坛以后,人们往往希望通过Web能够时间即时的聊天室。这是因为虽然IRC和其它的一些即时的聊天工具已经很普及了,但是许多的用户仍然喜欢基于Web的聊天方式。原因有许多,比如这些基于Web的聊天工具可以通过一些合作的代理与那些即时聊天工具联系起来,或者Web的聊天工具使用很方便。

本文讨论的聊天程序的源代码你可以通过这两个链接进行下载:chat.tar.gz / chat.zip。源代码在本文中基本上都讨论到了(除了一些随后附加的补丁)。

为了创建这个聊天程序,我决定采用标准的第三方的库。因为我觉得既然这些第三方的库已经很好地解决了问题,我就没有必要自己来重新编写。可能有些人会认为使用这些库我们的程序就不是原创的,但是我们不必去理会这种没有意义的争论。

在服务器端,我决定采用Zend Framework 0.20 (发布于20061031)。客户端那边,通过采用原型的库,我们可以简化AJAXJavascript的处理。其它的资源我决定使用Scriptaculous。当然,你可以使用其它的如jQuery Dojo or 或者其它类似的库来实现。

这次我们编写的聊天工具主要基于Zend Framework (PHP5)Javascript和协议库实现,目的是创建一个简单的便捷的聊天程序。另外,我们提供的源代码使用的是新的BSD的许可证,读者可以根据自己的需要自由地修改它。其它的细节我们就不讨论了,我们开始吧!

Zend Framework 介绍

Zend Framework(Zend的开发框架) 虽然出现的时间不长,但是很快就成为我最喜欢的PHP库之一了。从个人的角度来说,我不是很喜欢一些大型的框架,因为它们往往构建大型的架构,然后强迫你去使用没有必要的功能。但是,Zend Framework 却是众多库文件的一个包,包里面的每一个类都是单独运行而且易于使用,同时又能够很方便地与我自己的代码结合起来。

你可以从http://framework.zend.com 去下载Zend的代码。另外,使用文档也写得很丰富,同时我从邮件列表了解到Zend的开发框架一直在丰富中。除了官方的文档,我还推荐http://www.akrabat.com/zend-framework-tutorial/ 它是一个不错的使用手册,而且易于阅读。这里我们感谢Rob Allen为此所作的贡献。

文件夹分布

首先,下载Zend Framework 0.20版本,可以从http://framework.zend.com/download 下载。在你的Web的发布目录下创建一个新的文件夹叫 "chat-tutorial"。在这个新的文件夹里面,我们将创建新的资文件夹以便放置这个聊天程序需要的各种脚本。我们推荐使用的文件夹分布如下:

chat-tutorial/

    /application

            /controllers

            /views

    /library

        /incubator

    /public

            /javascript

            /styles

    /javascript

    /data

 

从网上下载的Zend开发框架的“ ./library/Zend”文件夹里面的文件需要拷贝到我们的“library”文件夹里面。所以现在“chat-tutorial/library”文件夹里面包含了一个Zend文件夹,里面包含了核心的库文件和Zend.php。你还可以单独下载"incubator"文件夹。"incubator"文件夹里面包含了Zend Framework里面的新的组件。这些组件很多是未定版、未注释的,但是最起码它们都是公开发布的版本。在0.20版本中,"incubator"包含了新的MVC组件,而且在本次的聊天室程序中我们会用到它。

把“./incubator/library” 文件夹复制到我们的“./library/incubator”文件夹当中。

 

我们将把“./application”文件夹作为我们存放程序的主要的一个文件夹。例如,我们要用它存放controllers models。所谓的controllers (控制器)就是一个包含了应用主逻辑的类。它包含了最高运行级别的代码,并引入许多功能库文件、处理模型、建立视图和对用户数据进行过滤/认证有效性。这些应用主逻辑被分开放置在具体的类的方法中,我们通过访问具有特殊意义的URL(脚本文件名)来引入这些控制器和方法。

如果刚才的讲述中,让你有些不明白,不用担心。我们很快用具体的例子来阐述。

Library的文件夹当中,我们将存放所有的库文件,例如Zend Framewrok(包括了核心文件和扩展功能文件)。这里我们暂时不需要其它的PHP库文件,但是请注意,如果你在其它别的项目中同时使用到Zend Framework和别的PHP库的时候,你可以把那些PHP库文件也放入Library文件夹当中。

在“public”的文件夹当中,我们放置所有需要的脚本文件。这些脚本文件都可以通过URLWeb中访问到。它们包括图片文件、css文件和javascript脚本文档。另外,为了便于管理和使用,我增加了一个javascript脚本文件的根目录,并把我们自己创建的javascript脚本文件放置进去。从本质上说,你需要了解“public”和“javascript”两个目录是用户唯一能够访问的目录。其它所有的脚本文件必须放置在用户无法访问的目录当中(我们不希望用户能访问到)。所以我们将对其它的目录设置访问权限这是出于最低的安全级别考虑的。我们可以通过配置Apache.htaccess文件来实现这个权限控制。

最后,因为我们将采用XML来作为数据的存储载体来传递聊天信息。所以我们使用“./data”文件夹来存储XML文件。所以为了保证Apache(PHP的运行脚本程序)能够在这个目录中写文件,你需要注意Apache在这个目录的权限设置。这里我们建议只允许PHP来写XML文件。当然,如果你不是很了解Linux,你也可以简单地把目录的权限设置为777Windows平台的开发工程师就无需要注意这点了。

Zend Framework使用开始我们的聊天程序

Zend Framework运行的概念是通过调用的url包含的字符串去找到一个相对应的类,即控制器。我想你能猜到了,包含控制器的类的脚本文件都被放置./application/controllers目录当中。一个控制器类包含了运行动作的许多方法,也是因为这个原因我们刚才叫它们动作。例如,这样的一个urlhttp://www.example.com/chat/refresh可能会指向RefreshAction()方法。而这个方法所在的类是在"application/controllers"目录下的ChatController.php文件中声明的。值得注意的是通过url的格式Zend Framework是怎么找到控制器并找到方法的呢。这个技术上的映射过程,我们在这里就不详细讨论了(你可以从官方的技术文档或者手册看到详细的说明)。

 

这个映射过程是由Zend_Controller类来处理的,它用来解析所有的url地址。为了让Zend_Controller类来解析所有的url,所有的请求都必须通过一个统一的index.php文件(映射文件)来实现。这个映射文件所做的事情就是启动这个Framework并且把其它的初始化需要的代码加入进来,例如我们通过url寓意的。在这里我们同样需要.htaccess文件来保证所有的访问都指向index.php文件。这种把所有的请求转向到一个固定的入口的想法来源于前段控制器设计模式。如果你并不是很了解这个思想,你可以通过google了解下它具体的信息,而且如果你是一个好奇心强的人的话,你会喜欢上它的。

首先,关于.htaccess文件。我们需要在根目录“chat-tutorial”创建一个.htaccess文件。文件的内容是:

RewriteEngine on

RewriteCond %{REQUEST_URI} !/public.*

RewriteCond %{REQUEST_URI} !/javascript.*

RewriteRule .* index.php

 

php_flag magic_quotes_gpc off

php_flag register_globals off

 

以上的设置告诉Apache使用mod_rewrite模块来进行转向处理。当一个请求访问本目录或者本目录下任何一个子目录的时候,Aapche将自动进行转向。配置中的RewriteRule配置告诉Apache转向的地址是index.php(也就是我们实现固定转向的地方)。最后两个php_flag的条目的配置比较简单,它们只是确保“magic_quotes” 和 “register_globals”这两个PHP的配置关闭的。这样的配置是用来降低潜在的安全风险,但是我们这样做的目的是无论是有意还是无意,我们不用依靠系统自己的配置是否关闭。当然,在PHP6发布以后,这两个功能将被彻底关闭。我想Web安全专家听到这个消息后,会放心地去参加聚会了

另外,我们在.htaccess中还有两个条件规则。它告诉mod_rewrite模块,当请求./public或者./javascript的时候,不需要进行转向处理。所以放置在这两个目录下面的文件是可以被直接访问的,而且这两个目录下面的文件对项目本身不能有什么安全的风险。

在这里,index.php这个映射文件基本上就是在做初始化、加载类或者是对我们调用Zend Framework的类进行初始化。

让我们来看看index.php脚本的代码:

php

 

<?php

/**

 * Bootstrap file for Chat Tutorial

 */

 

/*

 * The basics...

 */

error_reporting(E_ALL|E_STRICT);

ini_set('display_errors', 1); //disable on production servers!

date_default_timezone_set('Europe/London');

 

/*

 * Start our session

 */

session_start();

 

/*

 * Setup the include_path to the ZF library.

 * We set the incubator first so the

 * incubator classes are loaded in preference

 * to core ZF classes where two versions exist.

 *

 * When 0.21 is released, the MVC classes in

 * Incubator will move to the core library.

 */

set_include_path(

    './library/incubator/library'

        . PATH_SEPARATOR . './library'

);

include 'Zend.php';

 

/*

 * Use Zend::loadClass() to load essentials

 * Probably a good idea to use require_once()

 * elsewhere to avoid unnecessary coupling.

 */

Zend::loadClass('Zend_Registry');

Zend::loadClass('Zend_Controller_Front');

Zend::loadClass('Zend_Controller_RewriteRouter');

Zend::loadClass('Zend_View');

 

/*

 * Load and register our View for later use

 */

$view = new Zend_View();

$view->setScriptPath('./application/views');

Zend_Registry::getInstance()->set('view', $view);

 

/*

 * Instantiate a Request to set BaseURL

 * See later...

 */

$request = new Zend_Controller_Request_Http();

 

/*

 * Instantiate a RewriteRouter

 */

$router = new Zend_Controller_RewriteRouter();

 

/*

 * On my platform, I need to set the BaseURL for ZF 0.20

 * RewriteBase is assumed to be $_SERVER['PHP_SELF'] after

 * removing the trailing "index.php" string.

 *

 * PHP_SELF can be user manipulated. Avoided using SCRIPT_NAME

 * or SCRIPT_FILENAME because they may differ depending on SAPI

 * being used.

 */

$base_url = substr($_SERVER['PHP_SELF'], 0, -9);

$request->setBaseUrl($base_url);

 

/*

 * Setup and run the Front Controller

 *

 * Set Controller Dir, add the RewriteRouter, dispatch the

 * modified Request (with updated BaseURL) and finally

 * get the resulting Response object.

 */

$controller = new Zend_Controller_Front;

$controller->setControllerDirectory('./application/controllers');

<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIG


上一篇:五个成功习惯 让正则表达式经受的起反复试验   下一篇:菜鸟编程十大好习惯


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·五个成功习惯 让正则表达式经受的起反复试验
·菜鸟编程十大好习惯
·基于PHP的AJAX技术实现文件异步上传
·windows环境下mysql数据库的主从同步备份步骤
·ajax的最大缺点是什么?对搜索引擎的支持较弱
·新手如何使用PHP创建RSS阅读器
·理解Zend 框架(4): 用Zend_HTTP_Client 获取无提要的
·实例:用PHP实现Ftp用户的在线管理
·利用PHP和CSS改变网页文字大小
·理解Zend 框架(1):构建完美的阅读器
·使用m17n实现对各国语言间的代码移植和转换
·怎样才能成为PHP高手?学会"懒惰"的去编程
·新手入门:PHP编程中“字符串”的小常识
·新手入门:PHP编程中“数组”的基础知识
·跟我来学PHP5:session会话的使用和分析
·日记整理:Apache+MySql+PHP的快速安装
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·用PHP执行Oracle存储过程示例
·用php做一个简单的表单
·用Socket发送电子邮件(二)
·用Socket发送电子邮件(一)
·用中文命名,让汉字走向程序开发
·在Linux下安装显卡驱动程序
·在PHP中用描点法“绘制”中文
·在线人数统计源代码
·怎么样可以把 phpinfo()屏蔽掉
·则表达式判断email和URL
·正则表达式(regular expression)
·正则表达式使用详解(二)
  阅读排行
·php.ini 中文版
·PHP安装全攻略:常见问题解答
·Linux新手入门常用命令大全
·利用PHP和CSS改变网页文字大小
·入门教程:学习使用PHP数组
·PHP程序编译中常见错误信息分析及解释
·PHP5学习笔记第二节PHP5的对象模型
·带你走进PHP世界 PHP新手上路之一
·PHP开发中最常见的文件操作疑难解答
·PHPMyVisites安装
·使用PHP实现登陆验证码
·视频演示:Zend Platform功能特性详解
·基于PHP的AJAX技术实现文件异步上传
·关于PHP--session的问题集锦解决方案
·ajax的最大缺点是什么?对搜索引擎的支
网摘收藏: