<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>臭皮匠 &#187; php</title>
	<atom:link href="http://guogoul.com/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://guogoul.com</link>
	<description></description>
	<lastBuildDate>Fri, 29 Oct 2010 00:24:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>担心部署分布式 Memcached 导致问题</title>
		<link>http://guogoul.com/2010/10/27/memcached-danger/</link>
		<comments>http://guogoul.com/2010/10/27/memcached-danger/#comments</comments>
		<pubDate>Wed, 27 Oct 2010 12:09:08 +0000</pubDate>
		<dc:creator>shanfeng</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://guogoul.com/?p=264</guid>
		<description><![CDATA[Memcached在很多时候都是作为数据库前端cache使用的,大大降低数据库压力，使系统执行效率提升.
memcached虽然称为“分布式”缓存服务器，但服务器端并没有“分布式”功能,memcached的分布式，则是完全由客户端程序库实现的.
客户端实现分布是memcached分布式的一个特点.这个特点提供了开发者,最大的自由度,但也容易导致问题的的发生.
以Php::Memcache为例子:

$memcache = new Memcache;
$memcache-&#62;addServer(&#8217;192.168.123.4&#8242;, 11211);
$memcache-&#62;addServer(&#8217;192.168.123.6&#8242;, 11211);
$memcache-&#62;addServer(&#8217;192.168.123.7&#8242;, 11211);
$memcache-&#62;set(&#8221;justfortest2&#8243;,7);
情况1.   192.168.123.6 服务器不太稳定,当192.168.123.6请求失败的时候 .memcache可能会去请求192.168.123.7.  这样会导致数据可能cache在多个服务器中,数据的不一致问题就会产生.
情况2.  如果在写代码过程中addserver的顺序出错,或者增加,或者减少server.那么数据分布情况就会改变. 由于php::memcache中的分布式算法是基于服务器数量以及添加的顺序的.  当然频道增加server,或者 减少server是很少存,但是addserver的顺序就不太好约束了.  为了保证数据一致性,服务器的增加与减少最好是重启一下所有缓存.
建议:
1. 尽量把缓存放到单机上面,
2. 在压力大的情况下为了缓解网络连接压力,或者增加缓存空间大小.做了分布式缓存.这样就得做好机器的监控.检查机器的稳定情况,保证缓存服务器的正常工作
参考:  http://gihyo.jp/dev/feature/01/memcached/0004
]]></description>
		<wfw:commentRss>http://guogoul.com/2010/10/27/memcached-danger/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>APC cause problems</title>
		<link>http://guogoul.com/2010/01/05/apc_problems/</link>
		<comments>http://guogoul.com/2010/01/05/apc_problems/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 04:24:24 +0000</pubDate>
		<dc:creator>shanfeng</dc:creator>
				<category><![CDATA[Web开发]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[apc]]></category>

		<guid isPermaLink="false">http://guogoul.com/?p=235</guid>
		<description><![CDATA[看技术文档的时候很多作者的警告明知很重要，但经常被我们当作耳边风。不是我们有意把它们忘记，只是很多事情只是经历过之后才能铭记在心。
============================================
    APC will probably be 20-30% faster, but if you are writing to it frequently it can cause problems. The APC cache is best for things that change very rarely. And by very rarely I mean days, not hours or minutes.
    Because of the way APC does an anonymous [...]]]></description>
		<wfw:commentRss>http://guogoul.com/2010/01/05/apc_problems/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>imagick PHP扩展的安装( ubuntu版)</title>
		<link>http://guogoul.com/2008/11/13/imagick-php/</link>
		<comments>http://guogoul.com/2008/11/13/imagick-php/#comments</comments>
		<pubDate>Thu, 13 Nov 2008 10:42:01 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[imagick]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.guogoul.com/2008/11/13/imagick-php%e6%89%a9%e5%b1%95%e7%9a%84%e5%ae%89%e8%a3%85-ubuntu%e7%89%88/</guid>
		<description><![CDATA[本文原来写在csdn下面,因为近期用到了imagick.现迁移回来加深记忆.
===&#62;
在ubuntu下安装imagick的php扩展，还算比较的简单。用以下方法屡试不爽
1，编译PHP
    编译过程不在多说，可以看其它相关php编译的文章
2.安装ImageMagick(此步骤不知可不可以省略大家可以试一下，因为我的机器原本装有此工具。由于时间关系没有测试)
  sudo apt-get install imagemagick
3.安装imagemagick 的lib 供php调用
    sudo apt-get install libmagick++9-dev
4. 进入到编译好的php的bin目录
    cd php的bin目录

5.调用当前的pecl安装imagick
    pecl install imagick
6.修改php.ini.重启apache服务器
    在php.ini中添加: extension = imagick.so
7.测试

]]></description>
		<wfw:commentRss>http://guogoul.com/2008/11/13/imagick-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>关于web系统扩展的几点记录</title>
		<link>http://guogoul.com/2008/11/01/sys_web_extend/</link>
		<comments>http://guogoul.com/2008/11/01/sys_web_extend/#comments</comments>
		<pubDate>Sat, 01 Nov 2008 06:27:02 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[技巧]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.guogoul.com/2008/11/01/sys_web_extend/</guid>
		<description><![CDATA[注:本文只谈系统的可扩展点，并不涉及相关技术的具体实现。
可扩展性的定义特性: 1.系统可以容纳使用率的增加，可以简单的理解为用户数的增加2.系统可以容纳数据集的增加。3.系统可维护。
误区:
1.可扩展不是指原始速度，性能和可扩性是不同的问题2.可扩展性与是否选择某种语言无关。3.可扩展性与特定的技术是无关的。
扩展的几个方向与要点:
一,扩展硬件平台硬件扩展大体上可以分为两类：1.垂直扩展:原理：很简单当机器性能不足时买一台更大，更强，更猛的机器代替。优点:设计容易实现，只需在本地机器上构建系统。一定体系稳定，只要换好的机器就行。不足: 成本不是线性增加的，可能是指数级的。尽管你很有钱，不担心钱的问题,不过由于单台机器的能力有限的，那么这种模型最终会受到限制。2.水平扩展:原理:不断的增加更多的硬件,不同垂直扩展的是增长不需要超级强劲的机器，只要很多常规机器。优点:能够混用不同服务器并且能够配备最便宜服务器的应用程序，将一直保持成本上的优势。不足:添加减少机器可能比较容易，但不会过于简单.你将要花费大量的管理成本。3.冗余:不管是垂直扩展还是水平扩展，机器都有可能发生故障，这样的话给机器做完全热备是必要的，当一个组件故障时，其他组件自动接手它的工作。
二,负载平衡
1. DNS负载平衡这个最简单的平衡方案，同时存在不少的问题.1)做法:在 DNS中给一个域添加多个IP,这样请求域名解析的时候分随机的返回不同的IP地址实现平衡的目的2）问题： 更新dns的速度比较缓慢，如果要移除一台坏的机器比较的困难了,另一个问题就是无法实现精确控制，也不能定制化平衡。总得来说DNS负载不是一个好的方案。
2.VIP:这个名词比较有意思，记得有一回去yahoo,技术人员与我谈代码发布时谈到了VIP的一个问题，我就有点乱了，VIP===》贵宾？。还冒出了MVP之类的概念.：VIP是虚拟IP的意思，一个VIP是由负载平衡器提供的一个IP地址，背后其实有多个实际的IP地址在处理请求.负载平衡器也被称作虚拟服务器。
3.硬件方式的负载平衡:1)别名:web交换机,内容交换机,内容路由器.2)特点:非常的昂贵。
4.软件方式的负载平衡:1)前一段时间才知道lvs(http://www.linuxvirtualserver.org)是一个给linux打上内核补丁的负载平衡操作系统，不过lvs是为了处理极为复杂的负载情况，对于一般平衡就没有必要。
2)第四层与第7层负载平衡注意这个第字。刚接触的时候不理解，直接看成四层，与7层。呵呵，7层比4层多三层当然7层要牛很多。第7层的确比第4层更灵活，但原因绝对不是7比4大.第4层与第7层指的是网络分层.传统的负载平衡是在第四层处理的,用户的请求来源与目标IP地址与端口在这一层被捕获，有了这些信息就可以把这个连接引导到后台正常的端口上。最简单的第四层负载采用的是循环算法(round robin)。就是把请请求循环发送到生产服务器上。除了循环之外，也可以做随机算法。在两种方法中都可以加上权重，对权重比较高的生产服务器，只要有队列中重复出现几次那么被分配到流量的比重就越高。第7层负载比第4层负载出现的晚，它比第4层更加易活。因为第7层负载平衡器检测HTTP请求，这能够查看请求和请求的标头，并将这些信息纳入平衡策略的考虑中。这样就可以做基于URL平衡，可以确保对特定资源的所有请求都被调度到同一台机器上，这样的方便在同一台机器上做缓存，提高缓存命中率。这就是比第四层优秀的原因之一.听说apache的mod_rewrite模块加上一些脚本就可以做第7层的负载，具体我没有实施过，不过试过用ngnix做过第4层负载平衡，十分简单:)
三,扩展Mysql1.可以从主从(master-slave)复制方面考滤提高并行读写性能,当然选表的存储引引擎也很关键，MyISAM能非常快地进行读写操作，但是无法同时快速度的读写操作,而且也不支持事务操作，现在好像比较流行InnoDB。不过innoDB不提供fulltext索引,innoDB的占用的硬盘空间大约会是Myisam的3倍左右。
2.数据库分区也是数据库扩展的重要因素。不合理的数据库分区将会影响以后数据库的扩展.
四,缓存扩展在缓存的选择上我觉得分存式的缓存memcached(http://memcachedb.org/)是一个无可挑剔解决方案，可以解决大多数的问题
五,存储系统的扩展:&#160;目前只用过NFS,NFS在实际生产过程中还是存在很多不足。请各位有识之士,留下宝贵意见.!



]]></description>
		<wfw:commentRss>http://guogoul.com/2008/11/01/sys_web_extend/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于web系统的瓶颈几点记录</title>
		<link>http://guogoul.com/2008/10/26/sys_bottleneck/</link>
		<comments>http://guogoul.com/2008/10/26/sys_bottleneck/#comments</comments>
		<pubDate>Sun, 26 Oct 2008 14:30:32 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[技巧]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.guogoul.com/2008/10/26/sys_bottleneck/</guid>
		<description><![CDATA[所谓找出瓶颈，就是找出程序中费时最多的部分。要查看各个时间段，从请求进入到我们网络的边界开始，直到响应离开。&#160;Donald Knuth: 在条件不成熟的情况下贸然进行优化是程序设计中所有罪恶的源泉。如果只是想着要重构X,就能加快这儿的速度，而不去实际测试系统并确认X处于关键路径中，那就是在浪费时间和精力。
关于CPU:&#160; 在不成熟的观察者看来，cpu时间是每个应用程序的主要瓶颈，而实际上，这种情况很少发生，影响程序的主要性能的真正原因是 IO.什么是IO?IO包括了所有的数据移动，数据移动的本质上就是应用程序中所做的一切。和大家的观点相反，cpu处理速度基本上从来不是web应用程序中的瓶颈。如果发现主要瓶颈在cpu,那很有可能在基本设计层面存在问题.(那些少数cpu密集任务除外，如处理图像，视频，音频，加密大段数据等)&#160; top命令的%CPU列显示每个进程占用cpu的情况，也可以用uptime看一下当前系统的平均负载。
代码性能测试:&#160; 捕捉运行中代码的运行信息用，识别代码中最费时的部分有利于代码的优化。比较简单直接的做法不是在函数运行之前记下当前时间戳，到了函数运行之后再记一下时间，两个时间相差就可以算出当前函数花费时间。对于php程序员来说用xdebug(http://xdebug.org)是一个好的选择,安装了xdebug之后在脚本运行之前调用xdebug_start_profiling(),在脚本调用结束后运行xdebug_dump_function_trace()就可以以html来输出性能测试数据的表格。大家可以一试，很不错。测试代码会大大降低执行速度，如果有一个负载均衡池，可以让一部份的生产流量流经剖析工具。
提高代码运行的速度:&#160; 1.操作码缓存： 在cgi模式下，每执行一次脚本都要编译源代码。可以借助一些工具把源码编码成OPCODE做存起来多次运行,APC缓存是一个好的方案&#160; 2.提高模板反应速度： 与opcode相同的原理，多次编译是浪费时间，模板可以保存编译结果多次调用。在调用时默认会查看源模板文件，如果有更新就重新编译。在很多时候可以关闭检查模板是否更新的开关，减少文件IO.提高反应速度:$smarty-&#62;compile_check=0.
关于I/O&#160; 1.磁盘IO:可以通过系统的一些工具更好的了解磁盘的IO情况，可以用iostat查看当前的系统的磁盘IO值.这装命令:sudo apt-get install sysstat&#160; 2.网络IO:网络上的能够达到的带宽受限于当网络中速度最慢的设备。netstat是最好的查看网络状态的命令。网络配置上好的做法是根据网络的用途，为机配置多个子网，这样能提高网络IO的速度，当然这样就要装多个网卡，在简单的web服务器与数据库服务器安装中，可以建一个内部数据流通访问的子网，比如访问数据库。如果有主从复制数据库，也可以单为主从提供一个子网，在一般的系统中好像没有这个必要。&#160; 3.内存IO:内存IO基本不可再提高，不过内存的带宽是线性扩展的，最好的增加内存吞量的办法就是增加更多机器.还有一点要注意的是在选硬件的时候。由于AMD64体系结构在内存DIMM和每个处理器之间都提供一个独立的总线，能够为内存传输提供更多的并行能力。在谈内存的时候不能不谈的一个名字是swap,swap是当操作系统没有足够的空闲物理内存的时候，它将内存的一页交换到磁盘来释放更多的物理内存，当下次需要交换内容时，它被换回物理内存。但是swap是十分缓慢，会影响机器处理的速度。可以用free 或者 vmstat查看机器上swap的使用情况。为了避免使用swap两种比较直接的方案就是提供更多的内存或者少分配一些内存，让一台机器做更少的事情。比如有1G的内存，系统需要100M,如果你运行mysql,你应该在运行时把mysql的运行内存设置成850M就可以了。还有一种比较极端的方案就是禁用swap.
关于数据库：&#160; 在web应用程序中，你往往会发现最大的瓶颈是数据库的吞吐量。数据库的优化是一个很深的学问，在这里就不多说了，等自己研究明白之时与大家分享。&#160; &#160; 
更新： xdebug_start_profiling xdebug_dump_function_trace，这两个方法只有xdebug1.0支持。2。0之后只输出profiling数据。供其它分析工具用。
]]></description>
		<wfw:commentRss>http://guogoul.com/2008/10/26/sys_bottleneck/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>数据的安全性与一致性中的几个要点</title>
		<link>http://guogoul.com/2008/10/21/web_data/</link>
		<comments>http://guogoul.com/2008/10/21/web_data/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 15:27:48 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[技巧]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.guogoul.com/2008/10/21/web_data/</guid>
		<description><![CDATA[数据完整性的原则：应用程序内部的数据是有用的，换句话说就是引入的数据在边界处被过滤，以过滤后的结果存储，在输出数据的时不再需要做任何处理。在过滤数据时要分清好的，有效的，无效的数据的处理。
基于以上原则在做web程序设计是要注意以下几点:
1.过滤不支持的编码格式&#160;&#160; 如果你的整个体系里面用的是utf-8编码，那么你就在数据输入的时候过滤或者转化掉其他编码的字符.&#160;&#160; 相关php方法: utf8_encode($input)， iconv（&#8221;utf-8&#8243;,&#8221;utf-8&#8243;,$str）;注后者要装iconv扩展
2.过滤控制字符&#160; 很多时候输入中含有控制字符，这此控制字符虽然是有效的数据，但不是良好的数据。这时候最好把控制字符给过滤掉，可以简单的把小于0&#215;20的 ascii字符过滤之。&#160;&#160; 相关方法:&#160;&#160;&#160; 1. preg_replace(&#8217;!\p{C}!u&#8217;,&#8221;,$data)//清除所有控制字符&#160;&#160;&#160; 2.preg_replace(&#8217;!\r\n?&#8217;,'\n&#8217;,$input) //统一所有平台的回车，还省空间
3.过滤html&#160; html的过滤比较头痛，可以用strip_tags()进行过滤，所有的html标签，但是想有选择的过滤html就比较惨了。这时个可以要你写比较复杂的正则表达式。&#160; 注：把所有的外部来源的数据当成是感染过的数据是重要的，只有你自己消除感染的数据才是安全的。&#160; 有时间 可以看一下lib_filter(http://code.iamcal.com/php/lib_filter) 
4.防止sql注入攻击:&#160; 原则:不要赋于用户超出他们所需的权限。&#160; web应用程序永远也不应该需要create,drop,alter权限，如果需要，那么很可能是在基本程序设计上有问题。&#160; 对于只读的数据库，没有必要发放insert ,updata,delete 权限。&#160; 字符串型过滤相关php方法:&#160; AddSlashes() ，mysql_escape_string()&#160; 整形过滤 : interval(input)&#160; 注意如果用到like或者rlike操作时还要过滤相关字符串中的“%”与“_”两个符号。&#160; &#160; 数据净化原则:净化代码在物理位置上应该和使用数据的代码相邻，避免过早净化，就可以快速查看代码，确认是否正确进行了转义了数据。
&#160; 
]]></description>
		<wfw:commentRss>http://guogoul.com/2008/10/21/web_data/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>nginx系列(2):apache与nginx+php cgi性能比较</title>
		<link>http://guogoul.com/2008/07/08/nginx_2/</link>
		<comments>http://guogoul.com/2008/07/08/nginx_2/#comments</comments>
		<pubDate>Mon, 07 Jul 2008 16:09:48 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[技巧]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[fastcgi]]></category>
		<category><![CDATA[lighttpd]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.guogoul.com/2008/07/08/nginx_2/</guid>
		<description><![CDATA[听说nginx性能是apache的10倍，可同时处理并发3W请求。只是听说而已自己没有证明过，今天 没事就用webbench测试一下看看到底有多大差距呢！
由于没有专业的环境，只能用我这个快要淘汰的本本上试一试了。nginx的性能如果可以并发3w不挂的话，我的机器早就升天了。我想先测试并发2000看看效果。
1.先拿apache开刀:
  用apache的默认配置没有进行修改.真是受不了，我的pc基本上处于假死状态,可能已死呵呵。不过我还坚持实验了两组:
第一组:
$ webbench -t 20 -c 2000 http://home.ucenter:8080/test.php
Webbench &#8211; Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
Benchmarking: GET http://home.ucenter:8080/test.php
2000 clients, running 20 sec.
Speed=62814 pages/min, 294224 bytes/sec.
Requests: 20938 susceed, 0 failed.
难怪假死我的是p4 1.8的cpu，load 都到了12了，真是难为我的机器了

第二组:
$ webbench -t 20 -c 2000 http://home.ucenter:8080/test.php
Webbench &#8211; Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open [...]]]></description>
		<wfw:commentRss>http://guogoul.com/2008/07/08/nginx_2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>nginx系列(1)：快速搭建nginx + php fastcgi系统</title>
		<link>http://guogoul.com/2008/07/05/nginx_1/</link>
		<comments>http://guogoul.com/2008/07/05/nginx_1/#comments</comments>
		<pubDate>Sat, 05 Jul 2008 15:24:05 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[fastcgi]]></category>
		<category><![CDATA[lighttpd]]></category>

		<guid isPermaLink="false">http://www.guogoul.com/2008/07/05/nginx_1/</guid>
		<description><![CDATA[nginx历吏比较短，由俄罗斯人编写，以性能卓越闻名。国内用nginx做server的公司还不多，相关的学习文档还不是很完全。边学边记，共同学习。
首先分享一下搭建nginx心得.其实在ubuntu下面建立nginx平台还是十分的简单，只不过本人用linux系统的不长以及nginx的相关文档比较少，以至在前期走了不少的弯路.
1. 测试平台: ubuntu8.04
2.安装nginx  1)sudo apt-get install nginx   2)相关路径：      conf:  /etc/nginx/nginx.conf      bin:    /usr/sbin/nginx      vhost: /etc/nginx/sites-enable/default      cgi-params: /etc/nginx/fastcgi-params  3)例子:建一个虚拟server       在/etc/nginx/sites-enable/default中添加以下代码    [...]]]></description>
		<wfw:commentRss>http://guogoul.com/2008/07/05/nginx_1/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Zend Framework 常用模块(3)</title>
		<link>http://guogoul.com/2008/04/20/zendframework_3/</link>
		<comments>http://guogoul.com/2008/04/20/zendframework_3/#comments</comments>
		<pubDate>Sun, 20 Apr 2008 15:02:39 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[ZendFramework]]></category>

		<guid isPermaLink="false">http://www.guogoul.com/2008/04/20/zendframework_3/</guid>
		<description><![CDATA[1.Zend_Filter
1.1.用于过滤输出,对于web开发者来说非常有用,常用于过滤一些特殊的HTML字符
举个例子:
filter(&#8217;&#38;&#8217;); // &#38;
  echo $htmlEntities-&#62;filter(&#8217;&#8221;&#8216;); // &#34;
1.2.过滤器链
通常，多个过滤器可以以一个特定的顺序应用到某个值上。
addFilter(new Zend_Filter_Alpha()) -&#62;addFilter(newZend_Filter_StringToLower());
// Filter the username
$username = $filterChain-&#62;filter($_POST['username']);
先通过Zend_Filter_Alpha移动任何非英文字符.然后进行大小写转化.
1.3如何编写一个过滤器

编写定制的过滤器很容易，只要实现Zend_Filter_Interface接口。
addFilter(new MyFilter());
?&#62;
2.Zend_Pdf 用于处理pdf的模块
创建与加载用例:
save($fileName, true);
// Save document as a new file
$pdf-&#62;save($newFileName);
// Return PDF document as a string.
$pdfString = $pdf-&#62;render();
//pdf 页面管理
// Add new page
$pdf-&#62;pages[] = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4);
// Add new page
$pdf-&#62;pages[] = $pdf-&#62;newPage(Zend_Pdf_Page::SIZE_A4);
&#8230;.
?&#62;
以上只是一些基本的pdf的操作.如果有兴趣,可以查阅详细资料,包括draw之类的操作
]]></description>
		<wfw:commentRss>http://guogoul.com/2008/04/20/zendframework_3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Framework 常用模块(2)</title>
		<link>http://guogoul.com/2008/04/17/zendframework-2/</link>
		<comments>http://guogoul.com/2008/04/17/zendframework-2/#comments</comments>
		<pubDate>Thu, 17 Apr 2008 14:59:22 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[ZendFramework]]></category>

		<guid isPermaLink="false">http://www.guogoul.com/2008/04/17/zendframework-2/</guid>
		<description><![CDATA[1.Zend_Feed 这个玩意儿是个好东西！现在RSS流行，用他解析feed事半功倍以下摘自API文档: Zend_Feed提供了处理的 RSS 和 Atom Feed的功能。它提供了一套自然的方法用于 访问Feed元素、属性、和条目属性。 除此之外Zend_Feed还扩展提供了同样简单的方法 用于修改feed和条目的结构，并将结果转化成XML格式。不久的将来这些扩展可能会被 Atom Publishig Protocol(AtomPP)所支持。 Zend_Feed由一个Zend_Feed基类、一个Zend_Feed_Abstract抽象类以及一个用于表示Feed和条目的Zend_Feed_Entry_Abstract基类组成。这些类封装了 RSS 和 Atom 的feed和条目特性的，提供了一套自然的方法使他们用起来变得异常简单。 再来看一个例子:
 getMessage()}\n&#8221;;
 exit;
}// 初始化保存 channel 数据的数组
$channel = array( &#8216;title&#8217; =&#62; $slashdotRss-&#62;title(), &#8216;
link&#8217; =&#62; $slashdotRss-&#62;link(),
 &#8216;description&#8217; =&#62; $slashdotRss-&#62;description(),
&#8216;items&#8217; =&#62; array() );
// 循环获得channel的item并存储到相关数组中
foreach ($slashdotRss as $item) {
$channel['items'][] = array( &#8216;title&#8217; =&#62; $item-&#62;title(),
 &#8216;link&#8217; =&#62; $item-&#62;link(),
 &#8216;description&#8217; =&#62; $item-&#62;description());
}?&#62;
Zend_Feed导入Feed的方法总结

 // [...]]]></description>
		<wfw:commentRss>http://guogoul.com/2008/04/17/zendframework-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

