2008 年 5 月 26 日
流行的开源软件 Zend Framework 刚刚实现了一些出色的增强。本文介绍 V1.5 中的新特性以及如何升级对 GData Web 服务的增强支持,包括 Zend_Form、Zend_Layout 和 Zend_View,并且,改进的 Ajax 支持可以帮助 PHP 开发人员轻松地构建先进的 Web 应用程序。
软件框架指一组代码库集合,旨在以一种标准化方式处理应用程序中的所有基本需求,以便使开发人员集中精力进行开发,而不是进行重复劳动。目前有多个开源的 PHP 开发框架可供选择,在所有这些框架中,Zend Framework 也许是最受欢迎的。
Zend 收到欢迎的原因是它非常重视最佳实践,这一特性对于那些重视可持续性的开发人员来说十分有吸引力。Zend 以一种高度模块化的方式构造框架:大多数 Zend Framework 组件可以完全分离并单独使用,这一点非常吸引只需要用到可用库的其中一部分的开发人员。Zend 的灵活性以及重视最佳实践而产生的良好标准化,使它成为具有广泛用途的实用框架。
已经很强大的 Zend Framework 在 V1.5 中又增加了几个全新的组件和组件增强。这些升级使开发复杂的 PHP 应用程序更加简单、更加可维护,这是因为对诸如表单验证例程甚至是前端布局创建等内容实现了标准化。让我们首先看一下Zend_Form 组件以及它提供的全部功能。
Zend_Form
Zend Framework 的一个令人兴奋的新增特性就是 Zend_Form 组件。Web 应用程序如果不能接收输入数据并对其进行处理,那么就会变得毫无意义,获得用户数据的最简单方式就是使用表单。当然,在开发与维护一个 Web 应用程序时,表单是最单调乏味的工作:您必须验证收到的全部内容,确保它是您需要的内容,并需要对每个到来的数据片段进行单独处理。所有上述操作都假设您 [...]
什么是节点(Node):
节点是构建Drupal的一个核心模块,“节点(Node)”并不是告诉你它是某个网络的一部分,相反地,你应该将一个节点想成是你网站一个具有魔
力的一部分,它可以由你网站的用户创建,当然你自己也可以创建,它可以是一个博客或者一份手册,通过Drupal内容管理工具箱(Content
Construction
Kit),你甚至可以创建无限多种你可以想像的类型的节点。你要牢记的是,任何一个节点都有它的类型,这种类型指向节点的内容类型,每一个节点都有自己唯
一的节点ID号、一个标题、主内容区、创作的内容、一位作者以及一些其它的属性,一个节点与其它所有节点一起被存在在数据库中的一份数据表之中。
Drupal拥有很多数据表,核心数据表在50份左右,或许你q希望将它们中的某些数据显示在你的网站上来实现某种功能。
用户模块也拥有自己的数据表,用户之中有很多又是某节点的作者,在这两者之间就产生了一种联系,要找到与某位用户相关联的节点的唯一途径就是搜索整个数据表想发现相匹配的项目,这是一个很大的工程,当然,感谢数据库服务器是很快速的。
任何一个节点都可以拥有无限数量的评论,评论又被存放在另一份数据表中,要找到某个节点所拥有的所有评论,我们需要搜索评论数据表中的所有记录。
节点是怎样工作的:
看一下正在访问Drupal站点的浏览器的地址栏,你或许可以看到这样的一个地址:“http:
//yourdomain.com/node/1”,这正是浏览器使用Drupal方式来向Drupal站点请求一次数据库查询,其内容包括:“从数据库
中查询ID为1的节点的所有查询允许的信息(如作者、评论等)并展示在页面中”,这叫数据查询请求。
大多数查询都是由相关模块来完成的,/tracker 会搜索所有节点并且按时间将结果存在在一份数据表中,只要你开启了Tracker 模块,那么它将一直运行。
当你将鼠标移到一个链接上面之后,察看浏览器的状态栏,你或许就可以更深的了解这个链接的文字所表达的意思,因为Drupal可以模仿文件夹路径一样的链接来表示内容的类型。
Drupal的模块(Modules)可以对数据进行很多操作,打个比方,当你打开一个你自己创建的文章节点后,你会在页面的最底部看到一个标签
栏,里面有查看/编辑(View/Edit)两个链接,但是这两个链接在不是你自己创建的页面却看不到,这就是通过用户权限设置后所拥有的功能。
节点类型:
Drupal将所有内容存储为节点,系统默认的节点类型有以下几种:
博客文章:由网站用户发表在他开设于Drupal站点上的博客上的文章。
网站文章:与博客文章类似,只不过它不是发表在用户的个人博客上,而是有相关权限的用户直接发表于网站上。
手册页面:手册页面是为联合协作文档编辑而准备的,一份手册可以由很多人共同完成。
评论:评论是每一个节点都有的,它是有评论权限的用户对某一个节点内容的看法,由用户提交。
论坛:论坛是内建于Drupal系统之中的默认模块,通过它网站拥有者可以建立根据不同的话题建立不同的论坛,用户可以在不的同论坛中发起相关的讨论。
页面:页面是一种简单的节点,它只是一个静态的页面并且可以生成一个在主导航栏的链接
投票:一种特殊的 节点,可以发起对某个话题的投票与调查活动
其它类型节点:由不同的模块生成的相关的节点
这个系列是我的学习笔记。主要内容来自 Zend Framework 的[程序员参考手册],结合了自己的学习和开发过程。
1. 安装
从 Zend Framework 的网页上下载最新版本。解压后,把整个目录拷贝到一个理想的地方,比如:/php/library/Zend。
打开 php.ini 文件,确认包含 Zend 目录的路径在 include_path 里定义了。以上面的配置为例,php.ini 中应有类似下面的条目:
include_path = “.:/php/library”
注意:Windows 下的写法略有不同,应该类似于 include_path = “.;C:\php\library”
初始的安装就这么简单。Zend Framework 的一些组件会用到 php 的一些附加模块。具体的要求请参考这里。
2. 项目的目录结构
如果你的项目不包含多个模块,可以用下面的目录结构:
<span style=”color: rgb(0, 0, 0);”>application/<br /> controllers/<br /> IndexController.php<br /> models/<br /> views/<br /> [...]
在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是静态页面的灵活性较差。
做静态页面的几个关键:
其实页面静态化就是页面级缓存,相当于把整个html页面缓存起来,用的时候跳过数据库直接读文件。
ob_start()函数:打开输出缓冲区.
函数格式 void ob_start(void)
说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。
Flush:刷新缓冲区的内容,输出。
函数格式:flush()
说明:这个函数经常使用,效率很高。
ob_get_contents :返回内部缓冲区的内容。
函数格式:string ob_get_contents(void)
说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE.
ob_get_length:返回内部缓冲区的长度。
函数格式:int ob_get_length(void)
说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活,则返回 FALSE.
ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区
函数格式:void ob_end_clean(void)
说明:这个函数不会输出内部缓冲区的内容而是把它删除
ob_end_flush:发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区
函数格式:void ob_end_flush(void)
说明:这个函数发送输出缓冲区的内容(如果有的话)
ob_implicit_flush:打开或关闭绝对刷新
函数格式:void ob_implicit_flush ([int flag])
说明:默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直接发送到浏览器,不再需要调用 flush()
具体应用中有ob_start()和ob_get_contents()就足够了。
关于缓存:包括页面级缓存,数据库级缓存,页面级缓存一般访问键,数据库级缓存现在流行的是写内存,这里要介绍的也是写文件。。(转载)
SQL查询缓存
适合读者
本教程适合于那些对缓存SQL查询以减少数据库连接与执行的负载、提高脚本性能感兴趣的PHP程序员。
概述
许多站点使用数据库作为站点数据存储的容器。数据库包含了产器信息、目录结构、文章或者留言本,有些数据很可能是完全静态的,这些将会从一个缓存系统中得到的极大好处。
这样一个系统通过把SQL查询的结果缓存到系统的一个文件中存储,从而阻止连接数据库,构造查询与取得返回结果而提高了响应时间。
有些系统数据库并不是放在WEB服务器上的,这样需要一个远程连接(TCP或者其它类似的),或者从数据库中获取大量的数据,这样你得忍受更多时间,这决定于系统响应时间与资源利用。
前提
本教程使用MySQL作为数据库。你需要安装MySQL(www.mysql.com下载是有效的)和激活PHP MYSQL扩展(默认情况是激活的)。
由于要查询数据库,你需要知识一些SQL(结构化查询语言)的基本常识。
缓存SQL查询结果
为什么要缓存查询结果?
缓存查询结果能极大地改进脚本执行时间和资源需求。
缓存SQL查询结果也允许你通过后期处理数据。如果你用文件缓存去存储全部脚本的输出结果(HTML输出),这样可能是行不通的。
当你执行一个SQL查询时,点典的处理过程是:
l 连接数据库
l 准备SQL查询
l 发送查询到数据库
l 取得返回结果
l 关闭数据库连接
以上方法非常占用资源并且相反的影响了脚本的性能。只能通过取得的大量返回数据和数据库服务器的位置这二个要素来相互协调。尽管持续连接可以改进连接数据库时的负载,但非常耗费内存资源,如果获取的是大量的数据,那么存储的全部时间会非常短暂。
创建一条SQL查询:
SQL(结构化查询语言)查询被用作操作数据库及它内容的接口。SQL可用于定义和编辑表的结构,插入数据到表,更新或删除表中的信息。
SQL是用于与数据通讯的语言,在大多数PHP数据库扩展(MySQL,ODBC,Oracle等)通过传递SQL查询到数据库中来管理整个过程。
本教程中,仅仅用select语言来获取数据库中的数据。这些数据将被缓存,之后将用作数据源。
决定什么时候更新缓存:
根据程序的需要,缓存可以采取多种形式。最常见的3种方式是:
l 时间触发缓存(过期的时间戳)
l 内容改变触发缓存(发现数据改变后,相应地更新缓存)
l 人工触发缓存(人工的方式告知系统信息超期并且强制产生新的缓存)
你的缓存需求可能是以上原理的一个或多个的综合。本教程将讨论时间触发方式。然而,在一个全面的缓存机制中,3种方式的综合将被使用。
缓存结果:
基本的缓存是用PHP的两个函数serialize()和unserialize()(译注:这二个函数分别代表序列化与反序列化)。
函数serialize()用于存储PHP的值,它能保证不失去这些值的类型和结构。
事实上,PHP的session扩展是用序列化过的变量,把session变量($_SESSION)存储在系统的一个文件中。
函数unserialize()与以上操作相反并且使序列化过的字符串返回到它原来的结构和数据内容。
在本例中,以一个电子商务商店为例。商店有2个基本表,categories和products(此处为原始数据库表名).product表可能每天都在变化,categories仍然是不变静止的。
要显示产品,你可以用一个输出缓存脚本来存储输出的HTML结果到一个文件中。然而categories表可能需要后期处理。例如,所有的目录通过变量category_id(通过$_REQUEST['category_id']来取得)被显示,你可能希望高亮当前被选择的目录。
表categories结构
Field
Type
Key
Extra
category_id
category_name
category_description
int(10) unsigned
varchar(255)
text
PRI
auto_incremen
在本例中,通过时间触发缓存技术被运用,设定一段时间后让其缓存SQL输出过期。在此特殊的例子中,定一段时间为24小时。
序列化例子:
l 连接数据库
l 执行查询
l 取得所有结果构成一个数组以便后面你可以访问
l 序列化数组
l 保存序列化过的数组到文件中
$file = ’sql_cache.txt’;
$link = mysql_connect(’localhost’,’username’,’password’)
or die (mysql_error());
mysql_select_db(’shop’)
or die (mysql_error());
/* 构造SQL查询 */
$query = “SELECT * FROM categories”; [...]
1.如果某个element的value显示不出来,有可能是assign的数组的维数不对。
2.如果想用数组的下标索引,一般要用section而不是foreach。
今天觉得直接访问php比较慢,然后就想设置一下可以生成静态页面,减少服务器读取数据库的负担.搜了一下,发现有cos-html-cache(http://wordpress.org/extend/plugins/cos-html-cache/)[国产的], wp-super-cache(http://wordpress.org/extend/plugins/wp-super-cache/)等,然后就下载了一个cos-html-cache并上传到wp-content/plugins/下,登录到后台,执行下面的步骤:
进入设置/永久链接(settings/permalinks),在通用设置(Common settings)里选择”自定义结构”,填入”/archives/%year%/%monthnum%/%post_id%.htm”,保存更改,此时如果根目录下面的.htaccess文件可写,wp会自动更改其内容,如果不可写,可以自己编写.htaccess文件,输入类似下面的内容:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
切换到插件(plugins)界面:激活cos-html-cache插件.
下面再刷新一下页面就可以看到效果了.
注:在写自定义URL规则的时候最后一定要写文件后辍名,比如.htm
功能描述:生成文章和首页HTML缓存文件,当有评论、修改、添加和删除文章的时候更新首页和当前页面缓存。注意,不缓存其他页面。
环境需求:服务器必须支持URLrewrite
插件独立性:不依赖其他插件
你是否需要该插件?满足下列要求表示你需要该插件:
访问量过大;
服务器和数据库负荷过高;
不需要花哨的插件,仅仅是发表文章……
插件过多,页面载入速度太慢;
我想上面的原因已经够了
满足下面的条件则表示你不需要此插件:
安装了url 定向插件的,比如permalink redirect;
喜欢测试花哨的插件,缓存会让你不能即时看到测试结果;
页面需要实时更新数据,如非JS的访客统计程序;
总之,得到了一些,必须失去一些……
安装方法:
首先,永久连接不能使用默认格式;
修改你的永久链接格式,保证你的url路径看起来像真正的HTML文件的路径,中文推荐采用 /html/y%year%/%post_id%.html如果你和我一样不怕麻烦愿意为每篇文章写一个英语的post slug,建议采用这样的格式:/html/y%year%/%post_id%_%postname%.html;
下载插件,在后面的下载页面;
后台激活插件;
选项-〉coshtmlcache 将以前的文章批量生成cache;
如果你会css,可以自行修改插件目录下的css文件来显示留言;
done
change log:
2007.05.28 version1.0 released;
cookie read bug fixed;
考虑到有网友需要没有ajax集成的插件,所以特此增加了没有ajax的插件,并且重新确认了cookie的有效性;
增加了JS,判断当前用户是否登陆,如果登陆,发表留言则不需要留下姓名和email,同时该插件不在集成Ajax comment
解决了留言者姓名中文乱码问题;
增加了页面缓存功能
下载地址:
version1.0 cos-html-cache.zip (替代后并重新批量更新缓存)
version1.01 cos-html-cache101.zip(替代后并重新批量更新缓存)
version1.1 cos-html-cache-v11.zip(替代后并重新批量更新缓存)
version1.11 cos-html-cachev111.zip(替代后并重新批量更新缓存)
测试地址:demo.storyday.com
FAQ:
我后缀名是.htm不是.html的可以用么?
可以,你设置永久连接是什么后缀就可以用什么后缀,jsp都可以,不需要修改插件。
如果我的永久连接是目录形式的可以用么?
可以,插件将会在目录下生成index.html文件。
缓存的静态HTML文件在哪里?
放在你URL链接对应的地方,比如你页面的地址是http://www.xxx.com/dir1/dir2/2.html 那么静态文件就在 dir1/dir2 目录下
后台批量生成的时候出现超时错误如何处理?
如果你的文章太多,应该选择分步生成缓存,不要一次重建所有的缓存文件!
如果我的永久连接不合理怎么办?
放心修改就是,不用担心链接失效问题,我自己都修改过几次,看看这里:http://www.storyday.com/html/y2007/706_permalinks-migration-plugin.html
静态化后不支持pingback,如何处理?
在你的模板文件夹下的header.php文件中,加上这样的pingback meta:<link rel=”pingback” href=”<?php bloginfo(’pingback_url’); ?>” />,加在css调用之前,当调用静态文件的时候,htaccess和这个meta会帮你处理ping back的!
如果确定静态化成功?
FTP查看有没有html文件生成,或者看看当前页面的源代码的最后面是否有这样的代码:<!– this is a real html file created at 2007-06-02 20:28:21 –>
生成了index.html为什么访问的还是index.php
服务器配置文件访问优先级的问题,本插件无能为力,请修改服务器配置。
必须要ajax comment才能使用此插件么?
不需要,任何模板均可,目前不集成任何其他ajax comment插件
如何停用插件?
先在后台或者FTP中删除缓存文件,然后停止该插件即可,注意,一定要删除首页的index.html文件,要不就会出现评论中第51楼的“问题”
如何不生成首页?
打开 php文件 ,看看最后几行
add_action(’edit_post’, ‘createIndexHTML’);将 带有 createIndexHTML的add_action的行 删除即可,用了这个,没有必要用wp-cache,如果你要用也没有问题
再次提醒朋友们:有问题,先看你安装步骤是否正确,再看FAQ,然后再决定是否需要在下面的评论框中发表你的问题!
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
|---|---|---|---|---|---|---|
| « 11 | ||||||
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 | |