<?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>welefen的随笔</title>
	<atom:link href="http://www.welefen.com/category/phpzend-framewrok/feed" rel="self" type="application/rss+xml" />
	<link>http://www.welefen.com</link>
	<description>前端打杂者@baidu</description>
	<lastBuildDate>Tue, 07 Feb 2012 07:28:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>使用xhprof分析PHP的性能瓶颈</title>
		<link>http://www.welefen.com/use-xhprof-analytic-php-performance.html</link>
		<comments>http://www.welefen.com/use-xhprof-analytic-php-performance.html#comments</comments>
		<pubDate>Sat, 10 Dec 2011 02:29:00 +0000</pubDate>
		<dc:creator>welefen</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[fl]]></category>
		<category><![CDATA[perfomance]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[smarty]]></category>
		<category><![CDATA[xhprof]]></category>

		<guid isPermaLink="false">http://www.welefen.com/?p=979</guid>
		<description><![CDATA[最近利用空闲的时间准备对Fl进行重构，Fl是一个支持模版语法（如：Smarty3模版语法）的HTML/Js/Css解析，压缩，美化，检测等工具。关于Fl的更多信息你可以从github上了解。 但是重构完HTML的解析之后，在使用simpletest进行单元测试的时候，使用豆瓣首页的源代码发现比较慢，发现需要1.5s，但在第一个版本中只要200ms就解析完了，这个差距是完全不能接受的。虽然这次重构对很多方法进行了抽象，但应该不至于直接导致这么慢。 之前看过可以使用Facebook开发的xhprof来分析PHP的性能，安装了下分析后终于发现了直接影响到性能的瓶颈。xhprof的安装网上有很多教程，这里就不在说明了。 这里就有个安装的教程： http://hi.baidu.com/thinkinginlamp/blog/item/f4bd08fa1a03ba9e59ee90fd.html &#160; 从图中可以很分析的看到，find方法里调用的stripos系统函数导致的，这个函数被执行了13749次，花了1s的时间。而find方法主要用于检测特征值所在的位置的，有时候需要不区分大小写进行检测。 更多的信息请见这里 找到问题的所在就要想办法进行优化了，网上找了很久没有发现stripos的替代方案，那只能从使用场景上寻求替代方案了。 使用过程中很多时候是startWith对find方法进行的调用，startWith方法是用来检测是否以某个特征值打头的。 使用substr和首个字符的方式替代原有的find方案，在对一些细节进行了优化后，时间降到550ms了，不过相对于原来的版本还是要差很多。 xhprof不光能够直接观看当前是哪个方法引起的性能外，还是可以看每个函数的执行次数，以及执行的环境，如： 父级方法是什么，调用了哪些其他的方法，非常直观。 有了这些数据后，就可以想办法慢慢的优化了。 当然如果用PHP写一般的应用的话是没有性能问题的。 附上xhprof里的名词解释： http://www.yufeng.me/read.php?282 相关文章 在线工具: js/css/html压缩 Imghash:相似图片搜索的php实现 如何让ThinkPHP支持ActionChain php将unicode编码转为utf-8方法 Smarty中实现模板继承功能]]></description>
		<wfw:commentRss>http://www.welefen.com/use-xhprof-analytic-php-performance.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Smarty3性能优化工具</title>
		<link>http://www.welefen.com/smarty3-optimizer-tools.html</link>
		<comments>http://www.welefen.com/smarty3-optimizer-tools.html#comments</comments>
		<pubDate>Fri, 30 Sep 2011 02:02:10 +0000</pubDate>
		<dc:creator>welefen</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[smarty3]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[性能]]></category>

		<guid isPermaLink="false">http://www.welefen.com/?p=918</guid>
		<description><![CDATA[之前的文章中提到在一些复杂的模版页面中，Smarty3有性能问题。经过分析发现，主要是管理文件依赖，自定义函数参数以及一些依赖导致的。目前官方发布的新版本中虽然进行了一些性能优化，但并没有彻底解决这个问题。既然官方还没有解决，在实际项目中如何解决这个问题呢？ 结合前端编译平台，可以在开发的时候还是使用Smarty3的这些新特性（毕竟这些新特性给开发和代码维护带来了非常多的便利），然后在上线前编译的时候将这些新特性的书写方式还原。如：将自定义函数还原到代码中。 经过一段时间开发和测试之后，目前已将代码放到github上，https://github.com/welefen/smarty3optimizer。有需要的同学可以了解下 功能列表 1、将自定义函数还原 2、解决include的文件依赖，将include的文件内容直接填进去 使用方式 $file = "Smarty3Optimizer.class.php"; require_once $file; $path = 'share/template/'; //模版目录 $savepath = 'share.output'; //要保存的目录，如果要修改原文件的话，这里的值保持和$path一致即可。 $instance = Smarty3Optimizer::getInstance(); $instance-&#62;left_delimiter = '&#60;&#38;'; //smarty的左定界符 $instance-&#62;right_delimiter = '&#38;&#62;'; //smarty的右定界符 $instance-&#62;setPathFilter('share'); //这里设置路径的filter方式，可以是个字符串，也可以是个函数 $instance-&#62;run($path, $savepath); @todo 1、将extends和block还原，解除block的文件依赖。 2、完整的预编译 相关文章 Smarty3的性能问题 百度新首页性能优化 Smarty3下模版开发规范和问题 velocity性能大会总结 前端编译平台fcp介绍]]></description>
		<wfw:commentRss>http://www.welefen.com/smarty3-optimizer-tools.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>续: 如何减少代码上线过程中对服务的影响</title>
		<link>http://www.welefen.com/how-to-reduce-bad-service-on-code-update.html</link>
		<comments>http://www.welefen.com/how-to-reduce-bad-service-on-code-update.html#comments</comments>
		<pubDate>Tue, 06 Sep 2011 10:37:23 +0000</pubDate>
		<dc:creator>welefen</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[baidu]]></category>
		<category><![CDATA[服务]]></category>
		<category><![CDATA[百度]]></category>
		<category><![CDATA[编译平台]]></category>

		<guid isPermaLink="false">http://www.welefen.com/?p=890</guid>
		<description><![CDATA[之前写过如何减少代码上线过程中对线上服务的影响，文中提到的方法是将所有的代码上到服务器的一个临时目录，然后一起操作cp到目标目录。这种方式虽然可以大大的减少上线过程中对线上服务的影响，可以影响时间缩短到2分钟以内。但对于0故障的服务来说，2分钟的服务故障还是非常不能接受的（比如：百度新首页）。 由于静态文件和模版是上到不同的服务器，静态文件还部署到CDN。模版是和后端代码放在一起。这样如果还是原文件名的不能彻底解决问题。 我们知道，任何的静态文件最开始都是在模版里引用了才生效，比如：在模版里有个link，或者有个外链的script。 通过分析，如果上线的时候，将静态文件先上，并且将有改动的静态文件全部重命名的话就可以彻底解决这个问题。一方面静态文件重命名后不会干扰线上正在使用的静态文件，另一方面模版还没上的时候，这部分新的静态文件将不会引用，待模版上线后就会全面切到新的静态文件模式下。 虽然这种方式是行得通的，但如果是手工去做重命名静态文件的方式是完全不现实的，并且人工的方式还极容易出现遗漏的情况。那如何去解决呢？ 通过编译平台去解决，代码开发完后，在编译的时候，编译平台会自动分析静态文件的引用情况，并且计算该静态文件的md5值，并且取其中的几位（如：后8位），与原文件名一起组成新的文件名，将引用静态文件的地方的地址替换成新的地址，这样就完成了静态文件引用自动更新地址的情况。包含：模版里引用了静态文件，css里引用了图片，JS里可能引用了图片或者flash等。 比如：百度新首页里的源代码 如上图：开发的时候使用的&#60;script type=”text/javascript” src=”http://su.bdimg.com/static/superpage/js/superbase_88722c3f.js“&#62;&#60;/script&#62;，编译的时候会自动编译成上面的形式。 这种方式还一个好处就是：即使代码需要回滚也只用回滚模版就可以了，静态文件是不用回滚的。 可能有同学担心始终都是新文件模式上线的化，会不会导致线上文件特别多？ 这种担心是有的，但一般静态文件都不是太大，即使一年下来也不会有太多，并且现在的硬盘都超级大。相对于一天几百G的web server日志来说，这点真不算什么。 相关文章 新百度首页 百度音乐盒 百度新首页性能优化 前端交流会 tangram最优定制版codesearch工具]]></description>
		<wfw:commentRss>http://www.welefen.com/how-to-reduce-bad-service-on-code-update.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Imghash:相似图片搜索的php实现</title>
		<link>http://www.welefen.com/similar-image-search-in-php.html</link>
		<comments>http://www.welefen.com/similar-image-search-in-php.html#comments</comments>
		<pubDate>Sat, 13 Aug 2011 01:44:48 +0000</pubDate>
		<dc:creator>welefen</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[baidu]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[imghash]]></category>
		<category><![CDATA[phash]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sift]]></category>
		<category><![CDATA[tineye]]></category>
		<category><![CDATA[图片指纹]]></category>
		<category><![CDATA[相似搜索]]></category>

		<guid isPermaLink="false">http://www.welefen.com/?p=849</guid>
		<description><![CDATA[前几天看到阮一峰的博客里写到关于相似图片搜索的原理, 里面介绍了Google相似图片搜索的大致原理，主要是从Neal Krawetz博士的LOOKS LIKE IT翻译而来。文章详细的介绍了相似图片搜索处理的相关步骤，并且给出了一个python的实现，由于我对PHP比较熟，所以写了个PHP的版本。 图片相似搜索的简单原理 根据文章里的描述，其实原理比较简单，大致有如下几个步骤： 1、缩小尺寸。将图片缩小到8&#215;8的尺寸，总共64个像素。这一步的作用是去除图片的细节，只保留结构、明暗等基本信息，摒弃不同尺寸、比例带来的图片差异。 2、简化色彩。将缩小后的图片，转为64级灰度。也就是说，所有像素点总共只有64种颜色。 3、计算平均值。计算所有64个像素的灰度平均值。 4、比较像素的灰度。将每个像素的灰度，与平均值进行比较。大于或等于平均值，记为1；小于平均值，记为0。 5、计算哈希值。将上一步的比较结果，组合在一起，就构成了一个64位的整数，这就是这张图片的指纹。组合的次序并不重要，只要保证所有图片都采用同样次序就行了。得到指纹以后，就可以对比不同的图片，看看64位中有多少位是不一样的。 这种算法的优点是简单快速，不受图片大小缩放的影响，缺点是图片的内容不能变更。实际应用中，往往采用更强大的pHash算法和SIFT算法，它们能够识别图片的变形。只要变形程度不超过25%，它们就能匹配原图。 图片相似搜索的PHP实现 原文中给出了一个python版本的实现，代码只有53行。我写了个对应的PHP版本，由于直接是用类写的，所以代码有100行，具体如下：]]></description>
		<wfw:commentRss>http://www.welefen.com/similar-image-search-in-php.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>如何让ThinkPHP支持ActionChain</title>
		<link>http://www.welefen.com/how-to-make-thinkphp-support-actionchain.html</link>
		<comments>http://www.welefen.com/how-to-make-thinkphp-support-actionchain.html#comments</comments>
		<pubDate>Wed, 10 Aug 2011 10:43:02 +0000</pubDate>
		<dc:creator>welefen</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[ActionChain]]></category>
		<category><![CDATA[Dispatcher]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Router]]></category>
		<category><![CDATA[ThinkPHP]]></category>
		<category><![CDATA[自定义URL]]></category>
		<category><![CDATA[路由]]></category>

		<guid isPermaLink="false">http://www.welefen.com/?p=826</guid>
		<description><![CDATA[什么是ActionChain 在MVC框架中，一般都提供对自定义URL的支持。也就是将所有的请求都重定向到index.php，然后PHP程序通过URL配置规则来确定执行什么样的逻辑。 随着产品业务逻辑越来越复杂，页面模块化程度越来越高，一个URL要执行多个逻辑功能。通常的情况就是在对应的Action里分别调用不同模块的接口，然后输出到模版。但这种方式对代码的维护和管理非常不方便，不能很快速的定位到一个URL执行了哪些逻辑。 ActionChain就是用来解决这个问题的，它可以在一个URL里指定按顺序执行多个Action，每个Action可以是相互独立的。这样可以极大的方便了代码的阅读性和维护性。 什么是ThinkPHP框架 THinkPHP是一个国人开发的已经有多年历史的框架，已经有越来越多的中小型产品使用这个框架开发。并且我也用这个框架开发了多个应用。 这个框架提供了大量的非常快捷的访问接口，这也是我为什么喜欢这个框架的原因。并且相对于Zend, Yii, CI等框架，要简洁的多。 http://thinkphp.cn/ 可以通过这个URL了解更多的信息 ThinkPHP对ActionChain的支持 ThinkPHP虽然理论上是支持ActionChain模式的，但是设计上没有考虑安全问题，导致无法使用。如： http://serverName/appName/User/action1:action2:action3/ 那么会依次执行 UserAction 癿 action1 、action2 和 action3 方法,并且当前操作名称是最后一个操作。 由于ActionChain是支持在URL上指定的，导致访问者可以很轻松的绕过某些Action，这样就有严重的安全问题，比如： action1是检测用户是否已经登录的功能，action2是拉取某个特定模块信息的功能，action3是... 如果用户将URL里的action1去掉，直接导致是否已经登录的检测去掉了。 如何让ThinkPHP完美的支持ActionChain 既然ThinkPHP原生提供的ActionChain有安全问题，那如果想使用ActionChain功能的化必须对ThinkPHP进行改造。 由于ThinkPHP支持自定义路由功能，所以改造非常简单，下面讲讲具体的改造过程： 支持的ActionChain在路由的配置里是如何表现的？ array( //各个页面速度对比 '/^page\/compare/', 'index/initVar,analytic/pageCompare', '', 'tpl=analytic_page_compare' ), 不同的action可以用逗号隔开，并且可以指定不同的Controller，还可以指定不同的Group。（但不推荐不同的Group之间的调用） 1、修改ThinkPHP/Lib/Think/Util/Dispatcher.class.php，将parseUrl方法修改如下： static private function parseUrl($route) { if (strpos($route, ',') !== false){ return array(C('VAR_ACTION_CHAIN') =&#62; $route); } $array = explode('/',$route); [...]]]></description>
		<wfw:commentRss>http://www.welefen.com/how-to-make-thinkphp-support-actionchain.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>发布一款Google+版wordpress主题</title>
		<link>http://www.welefen.com/google-plus-for-wordpress-theme.html</link>
		<comments>http://www.welefen.com/google-plus-for-wordpress-theme.html#comments</comments>
		<pubDate>Wed, 20 Jul 2011 07:38:58 +0000</pubDate>
		<dc:creator>welefen</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[compress]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[localstorage]]></category>
		<category><![CDATA[manifest]]></category>
		<category><![CDATA[pjax]]></category>
		<category><![CDATA[plus]]></category>
		<category><![CDATA[pushstate]]></category>
		<category><![CDATA[theme]]></category>
		<category><![CDATA[免费]]></category>
		<category><![CDATA[开源]]></category>

		<guid isPermaLink="false">http://www.welefen.com/?p=677</guid>
		<description><![CDATA[ps: 由于plus这个名字在wordpress.org已经使用，该主题改名为 gplus，给大家带来的不便敬请谅解。  Google+出来后，立即被它简洁的界面吸引了。并且用了ajax+pushstate等技术，以及一些键盘事件，对用户体验有非常大的提升。 正好最近想给自己的博客做个wordpress主题，顺便学习下制作wordpress主题的过程，于是就想到了借鉴google plus的界面了。 下面是plus版主题的预览图： 使用到的技术及特色功能 1、完全基于html5+css3的实现，使用了header, footer, section, article, nav, aside等html5标签，使用圆角，阴影、动画等css3技术 2、使用ajax+pushstate技术进行无刷新浏览，并且可以改变页面的URL。 3、使用localstorage技术对数据进行本地存储，即使下次打开页面访问也是直接读取缓存。内容有更新后可以通过接口清除缓存。 4、使用manifest技术可以将静态资源在本地缓存，这样之后的访问可以直接读取本地缓存文件，完全不用发送http请求到web server。 5、文章列表页面支持键盘事件，可以通过J键查看上一条，通过K键查看下一条，并且有动态自定适应到对应的位置。 6、使用了支持PHP语法的HTML压缩技术，对HTML进行了压缩。 7、对主题使用的js和css进行了压缩，包含style.css文件。 8、使用渐进增强的原则，IE下不支持这些新技术特性，没有额外的操作，不会发生JS请求。 9、可以自定义logo图片，替换默认的标题文字。在主题选项里设置，下面介绍。 10、可以自定义404页面题图。在主题选项里设置 11、可以自定义是否显示文章作者。 12、默认将页面头部固定，可以设置页面头部不固定。 13、可以自定义顶部导航的展示，默认展示自定义页面。具体的下面介绍 14、其他等很多细小特性。 自定义顶部导航 可以在控制台 -&#62; 外观 -&#62; 菜单 里新建菜单，自定义要显示的菜单，如： 自定义主题选项 可以在控制台 -&#62; 外观 -&#62; 主题设置 里设置主题选项，如： 主题下载安装 &#160; 点击这里下载主题，下载后解压并上传到wp-content/themes下，然后在后台启用plus主题即可。 主题发布到wordpress.com，正在审核中，审核完成后就可以直接在线安装了。 源代码下载 该皮肤的代码已经开源，放在了github上，可以通过这里访问。 &#160; ps: 第一次制作wordpress主题，问题可能比较多，大家多见谅，有问题麻烦通知我， 我会及时修复的。谢谢 相关文章 使用ajax和history.pushState无刷新改变页面URL 发布gplus主题1.1版 [...]]]></description>
		<wfw:commentRss>http://www.welefen.com/google-plus-for-wordpress-theme.html/feed</wfw:commentRss>
		<slash:comments>69</slash:comments>
		</item>
		<item>
		<title>Smarty3的性能问题</title>
		<link>http://www.welefen.com/smarty3-bad-performance.html</link>
		<comments>http://www.welefen.com/smarty3-bad-performance.html#comments</comments>
		<pubDate>Wed, 13 Jul 2011 10:34:16 +0000</pubDate>
		<dc:creator>welefen</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[perfomnace]]></category>
		<category><![CDATA[smarty3]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[性能]]></category>

		<guid isPermaLink="false">http://www.welefen.com/?p=649</guid>
		<description><![CDATA[前篇文章中主要介绍了使用smarty3下的开发规范以及从smarty2迁移到smarty3中要注意的问题。 虽然刚出来的时候官方对性能这块给出的结果是smarty3的性能相比smarty2要好很多，但最近在实际项目使用中发现了性能方面是有很大问题的。下面通过一个具体的实例案例分析。 实际案例 由于之前使用的是smarty2，最近在向smarty3迁移的过程中，一些不重要的页面上线后运行的一直很良好。在迁移最后的一个模块后（访问量很大），上线后直接导致页面挂了，并且CPU的占有率始终是100%，只好回滚了。但在线下并不能复现挂了的情况，后来定位到可能是性能的问题，相关的QA同学进行压力测试时，证明了这一猜测。在并发量很高的情况下，线下也能复线CPU占用100%，页面挂了的情况。 事后对这个模块进行了详细的分析，以及和smarty2的对比，下面是具体的对比结果。 上图的数据是个导致页面挂了的极端情况，虽然其他页面数据上反差不会这么大，但确实反应了Smarty3有性能问题。 具体分析 从上面的图表中，使用smarty2开发的文件大小为34K。由于Smarty3里使用了模版继承(inc_layout.html 1.8K)和自定义函数(inc_util.html 25K)，并且自定义函数是整个模块的，所以Smarty3的开发文件大小相对要比Smarty2大一些。 但编译后Smarty2的文件大小只有52K，Smarty3编译后确有200，我们看下到底是哪些东西导致了Smarty3编译后有那么大。 这是编译后文件依赖的代码片段，其中用了200行的代码维护了文件依赖。 只是自定义函数参数的管理代码片段，用了370行的代码进行了自定义函数参数的维护。 这时自定义函数实体的代码片段，用了1000行的代码进行自定义函数实体的维护。 还有大量使用了__set,__get等魔术方法，这些直接导致文件体积很大的原因。 性能损耗点 通过以上分析，可以大致确定影响性能有一下几个方面： 1、文件依赖管理 2、自定义函数参数管理 3、自定义函数实体代码管理(直接编译成php函数，太二了。不过跨模块的方式貌似也没其他比较好的办法) 4、过量使用了类、__set、__get等魔术方法 如何优化 既然smarty3有这么严重的性能问题，如果使用的话就要对它进行优化。下面介绍一些优化方法，主要是开发 的时候还是用smarty3的那些优秀特性，这样可以大大提高开发效率和维护成本。在代码上线之前进行编译，将影响性能的那些方式优化系统原生的方式，如： 1、优化文件依赖。如果引用本模块的文件，可以直接读取文件内容替换过去，减少文件依赖和IO开销。 2、自定义函数。如果是本模块的自定义函数并且其他模块不会引用（非通用模块一般都不会被其他模块引用），可以直接将自定义函数的主题替换过去，减少自定义函数参数管理和编译成PHP函数。 3、优化一些魔术方法，将一些魔术方式直接编译后数据的调用。 4、可以考虑在编译的时候把文件编译好，对编译后的文件将进行优化。 &#160; 近期会进行smarty3优化的开发，开发完成后会细谈优化这块。 &#160; 相关文章 Smarty3性能优化工具 百度新首页性能优化 Smarty3下模版开发规范和问题 velocity性能大会总结 前端编译平台fcp介绍]]></description>
		<wfw:commentRss>http://www.welefen.com/smarty3-bad-performance.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Smarty3下模版开发规范和问题</title>
		<link>http://www.welefen.com/smarty3-regular.html</link>
		<comments>http://www.welefen.com/smarty3-regular.html#comments</comments>
		<pubDate>Wed, 06 Jul 2011 01:22:22 +0000</pubDate>
		<dc:creator>welefen</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[smarty3]]></category>
		<category><![CDATA[性能]]></category>
		<category><![CDATA[构造数据]]></category>
		<category><![CDATA[模版继承]]></category>
		<category><![CDATA[自定义函数]]></category>

		<guid isPermaLink="false">http://www.welefen.com/?p=639</guid>
		<description><![CDATA[介绍 在smarty2的时候，之前写过一篇文章，Smarty中实现模板继承功能，文中就是结合smarty2的一些特点如何实现模块功能的。 现在Smarty3出来了，带来了非常多新的特性，包括：模版继承、自定义模版函数、直接调用PHP函数、模版里很方便的构造数据等。 本文不介绍如何使用Smarty3，简单的使用可以去官方网站查看文档。本文主要介绍Smarty3下模版开发规范和一些问题的解决方案 Smarty3开发规范 1、每个模块下都有layout和util文件， 2、layout命名为inc_layout.html，用来布局页面 3、util命名为inc_util.html，用来存放模版里自定义的函数 4、block命名方式必须是block_打头 5、function命名方式必须是fn_打头，主要是让模块里的自定义函数和php系统函数区分。（php里是不允许函数重定义的） 6、基础block命名有统一的命名方式，具体如下面 block命名方式和分组 模块里的inc_layout.html里定义了如下的block: block_assign ，定义ui变量。 block_include ，用来引入模块里的util(即引用inc_util.html文件)。 block_title 页面标题 block_meta 页面keywords,description等 block_head_css 页面头部的css block_head_js 页面头部的js block_head 页面头部内容 block_content 页面主题内容 block_foot 页面底部内容 block_foot_js 页面底部js 在smarty3中，具体展示型页面里只能存在extends和block(其他的会被smarty忽略)，所以要引入当前模块下的inc_util.html的话，必须放在block_include里。 smarty3里的block支持append和prepend的，block是可以多级继承的，如果没有加append和prepend，那么是直接替换之前父级已经定义的block，如果定义了append和prepend，则把内容追加上去，这点是非常有用的。 模块inc_layout.html基本内容 &#60;&#38;block name='block_assign'&#38;&#62; &#60;&#38;$pageMode='ui-cols2'&#38;&#62; &#60;&#38;/block&#38;&#62; &#60;&#38;block name='block_include'&#38;&#62; &#60;&#38;capture&#38;&#62; &#60;&#38;include file="base/inc_util.html" inline&#38;&#62; &#60;&#38;/capture&#38;&#62; &#60;&#38;/block&#38;&#62; &#60;!DOCTYPE html&#62; &#60;html&#62; &#60;!--STATUS OK--&#62; &#60;head&#62; &#60;title&#62;&#60;&#38;block [...]]]></description>
		<wfw:commentRss>http://www.welefen.com/smarty3-regular.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>php将unicode编码转为utf-8方法</title>
		<link>http://www.welefen.com/php-unicode-to-utf8.html</link>
		<comments>http://www.welefen.com/php-unicode-to-utf8.html#comments</comments>
		<pubDate>Thu, 23 Jun 2011 02:29:22 +0000</pubDate>
		<dc:creator>welefen</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[unicode]]></category>
		<category><![CDATA[utf--8]]></category>
		<category><![CDATA[utf8]]></category>

		<guid isPermaLink="false">http://www.welefen.com/?p=576</guid>
		<description><![CDATA[介绍 在前端开发中，为了让中文在不同的环境下都能很好的显示，一般是将中文转化为unicode格式，即\u4f60，比如：”你好啊”的unicode编码为”\u4f60\u597d\u554a”。 JS里将中文转为unicode编码很简单。 function convert2Unicode(str) { return str.replace(/[\u0080-\uffff]/g, function($0) { var tmp = $0.charCodeAt(0).toString(16); return "\u" + new Array(5 - tmp.length).join('0') + tmp; }); } 并且也很简单，直接alert出来或者innerHTML到dom节点里都可以。 但如果将\u4f60\u597d\u554a”字符传递给php，php就不能直接echo或者其他操作了。直接echo的话还是原生的字符，不能自动转化为中文。 php将unicode转为utf-8方法 在php5.0及以上版本中提供了json_encode, json_decode方法。在使用json_encode变量的时候，如果变量里含有中文的话，会将中文转为unicode格式。所以在想是否可以通过json_decode将unicode转为中文呢？实际测试发现是可以的，但对单一的字符串发现有些问题。 对于简单的字符串，发现有时候使用json_decode转的化，结果直接为空了。但将字符串替换为数组然后在转就可以了。下面就有了下面封装的代码。 function unicode2utf8($str){ if(!$str) return $str; $decode = json_decode($str); if($decode) return $decode; $str = '["' . $str . '"]'; $decode = json_decode($str); if(count($decode) == 1){ [...]]]></description>
		<wfw:commentRss>http://www.welefen.com/php-unicode-to-utf8.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Smarty中实现模板继承功能</title>
		<link>http://www.welefen.com/smarty-tpl-inherit.html</link>
		<comments>http://www.welefen.com/smarty-tpl-inherit.html#comments</comments>
		<pubDate>Thu, 11 Feb 2010 03:41:22 +0000</pubDate>
		<dc:creator>welefen</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[block]]></category>
		<category><![CDATA[smarty]]></category>
		<category><![CDATA[模板继承]]></category>

		<guid isPermaLink="false">http://www.welefen.com/?p=256</guid>
		<description><![CDATA[在PHP+Smarty大行其道的今天，怎么样进行快速的模板开发成为了前端开发人员必须思考的问题。不同的页面，相同或者相似的页面结构是否进行了模块化处理，同样的头部或者尾部是否进行了内容分离决定了开发的效率。虽然Smarty本身支持include a file的功能，但这远远不够。我们需要的是不想重写同样的页面结构。 Jinja2的模板继承功能 Jinja是基于python的模板引擎，有个非常实用的功能就是模板继承。不太了解的可以去这里看详细的介绍http://opensource.csdn.net/bbs/thread/3943?lp=1 模板继承的好处就是你不在需要写整个页面，只要写页面的模块，然后用一个布局的页面套一下就可以了。并且页面中的模块书写顺序是无序的。 smarty本身并没有模板继承的功能，但我们可以通过block,capture和方法插件（其实block,capture也是插件）。 Smarty实现模板继承 首先我们看看一个实际的页面需要怎么写？ {=block name=page type=normal =} //这里标识block名称和页面类型，这里是{=,=}是smarty的左右标记符，你可以定义其他的 {=block name=title=} 这里是页面的标题 {=/block=} {=block name=head_static=} 这里是页面的静态样式（如css） {=/block=} {=block name=header=} 这里是页面的头部 {=/block=} {=block name=content=} 这里是页面的内容区 {=/block=} {=block name=footer=} 这里是页面的地步 {=/block=} {=block name=foot_static=} 这里是页面的静态样式（如js） {=/block=} {=/block=} 从上面的代码我们可以看到，原本需要写一个完成的页面，现在只需要写页面的模块就可以了。如果某个模块引用是公共模块的话，还可以省略。这里主要的实现方式就是定义了一个为名为block的block块。下面我们看看是怎么解析这些block的。 解析block的插件放在smarty的插件目录下，名为block.block.php文件。 function smarty_block_block($params, $content, &#38;$smarty) { if($content === null) return; $name = strtoupper($params['name']); //页面型block if($name [...]]]></description>
		<wfw:commentRss>http://www.welefen.com/smarty-tpl-inherit.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using eaccelerator
Database Caching 1/40 queries in 0.037 seconds using disk: basic
Object Caching 832/954 objects using disk: basic

Served from: welefen.com @ 2012-02-08 04:23:26 -->
