welefen的随笔

分类存档: PHP

使用xhprof分析PHP的性能瓶颈

IN:PHP   标签: , , , ,    评论: 0

最近利用空闲的时间准备对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

 

继续阅读 »

12-10
2011

Smarty3性能优化工具

IN:PHP   标签: , , ,    评论: 1

之前的文章中提到在一些复杂的模版页面中,Smarty3有性能问题。经过分析发现,主要是管理文件依赖,自定义函数参数以及一些依赖导致的。目前官方发布的新版本中虽然进行了一些性能优化,但并没有彻底解决这个问题。既然官方还没有解决,在实际项目中如何解决这个问题呢?

结合前端编译平台,可以在开发的时候还是使用Smarty3的这些新特性(毕竟这些新特性给开发和代码维护带来了非常多的便利),然后在上线前编译的时候将这些新特性的书写方式还原。如:将自定义函数还原到代码中。

经过一段时间开发和测试之后,目前已将代码放到github上,https://github.com/welefen/smarty3optimizer。有需要的同学可以了解下

继续阅读 »

09-30
2011

续: 如何减少代码上线过程中对服务的影响

IN:PHP, 前端开发   标签: , , ,    评论: 3

之前写过如何减少代码上线过程中对线上服务的影响,文中提到的方法是将所有的代码上到服务器的一个临时目录,然后一起操作cp到目标目录。这种方式虽然可以大大的减少上线过程中对线上服务的影响,可以影响时间缩短到2分钟以内。但对于0故障的服务来说,2分钟的服务故障还是非常不能接受的(比如:百度新首页)。

由于静态文件和模版是上到不同的服务器,静态文件还部署到CDN。模版是和后端代码放在一起。这样如果还是原文件名的不能彻底解决问题。

我们知道,任何的静态文件最开始都是在模版里引用了才生效,比如:在模版里有个link,或者有个外链的script。

通过分析,如果上线的时候,将静态文件先上,并且将有改动的静态文件全部重命名的话就可以彻底解决这个问题。一方面静态文件重命名后不会干扰线上正在使用的静态文件,另一方面模版还没上的时候,这部分新的静态文件将不会引用,待模版上线后就会全面切到新的静态文件模式下。

继续阅读 »

09-06
2011

Imghash:相似图片搜索的php实现

IN:PHP   标签: , , , , , , , ,    评论: 8

前几天看到阮一峰的博客里写到关于相似图片搜索的原理, 里面介绍了Google相似图片搜索的大致原理,主要是从Neal Krawetz博士的LOOKS LIKE IT翻译而来。文章详细的介绍了相似图片搜索处理的相关步骤,并且给出了一个python的实现,由于我对PHP比较熟,所以写了个PHP的版本。 继续阅读 »

08-13
2011

如何让ThinkPHP支持ActionChain

IN:PHP   标签: , , , , , ,    评论: 0

什么是ActionChain

在MVC框架中,一般都提供对自定义URL的支持。也就是将所有的请求都重定向到index.php,然后PHP程序通过URL配置规则来确定执行什么样的逻辑。

随着产品业务逻辑越来越复杂,页面模块化程度越来越高,一个URL要执行多个逻辑功能。通常的情况就是在对应的Action里分别调用不同模块的接口,然后输出到模版。但这种方式对代码的维护和管理非常不方便,不能很快速的定位到一个URL执行了哪些逻辑。

ActionChain就是用来解决这个问题的,它可以在一个URL里指定按顺序执行多个Action,每个Action可以是相互独立的。这样可以极大的方便了代码的阅读性和维护性。

什么是ThinkPHP框架

THinkPHP是一个国人开发的已经有多年历史的框架,已经有越来越多的中小型产品使用这个框架开发。并且我也用这个框架开发了多个应用。

这个框架提供了大量的非常快捷的访问接口,这也是我为什么喜欢这个框架的原因。并且相对于Zend, Yii, CI等框架,要简洁的多。

http://thinkphp.cn/ 可以通过这个URL了解更多的信息

继续阅读 »

08-10
2011

发布一款Google+版wordpress主题

IN:PHP, wordpress, 前端开发   标签: , , , , , , , , , , , , , , , , ,    评论: 69

ps: 由于plus这个名字在wordpress.org已经使用,该主题改名为 gplus,给大家带来的不便敬请谅解。 

Google+出来后,立即被它简洁的界面吸引了。并且用了ajax+pushstate等技术,以及一些键盘事件,对用户体验有非常大的提升。

正好最近想给自己的博客做个wordpress主题,顺便学习下制作wordpress主题的过程,于是就想到了借鉴google plus的界面了。

下面是plus版主题的预览图:

继续阅读 »

07-20
2011

Smarty3的性能问题

IN:PHP, 前端开发   标签: , , ,    评论: 4

前篇文章中主要介绍了使用smarty3下的开发规范以及从smarty2迁移到smarty3中要注意的问题。

虽然刚出来的时候官方对性能这块给出的结果是smarty3的性能相比smarty2要好很多,但最近在实际项目使用中发现了性能方面是有很大问题的。下面通过一个具体的实例案例分析。

实际案例

由于之前使用的是smarty2,最近在向smarty3迁移的过程中,一些不重要的页面上线后运行的一直很良好。在迁移最后的一个模块后(访问量很大),上线后直接导致页面挂了,并且CPU的占有率始终是100%,只好回滚了。但在线下并不能复现挂了的情况,后来定位到可能是性能的问题,相关的QA同学进行压力测试时,证明了这一猜测。在并发量很高的情况下,线下也能复线CPU占用100%,页面挂了的情况。

继续阅读 »

07-13
2011

Smarty3下模版开发规范和问题

IN:PHP, 前端开发   标签: , , , ,    评论: 1

介绍

在smarty2的时候,之前写过一篇文章,Smarty中实现模板继承功能,文中就是结合smarty2的一些特点如何实现模块功能的。

现在Smarty3出来了,带来了非常多新的特性,包括:模版继承、自定义模版函数、直接调用PHP函数、模版里很方便的构造数据等。

本文不介绍如何使用Smarty3,简单的使用可以去官方网站查看文档。本文主要介绍Smarty3下模版开发规范和一些问题的解决方案 继续阅读 »

07-06
2011

php将unicode编码转为utf-8方法

IN:PHP   标签: , , ,    评论: 0

介绍

在前端开发中,为了让中文在不同的环境下都能很好的显示,一般是将中文转化为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的话还是原生的字符,不能自动转化为中文。

继续阅读 »

06-23
2011

Smarty中实现模板继承功能

IN:PHP   标签: , ,    评论: 4

在PHP+Smarty大行其道的今天,怎么样进行快速的模板开发成为了前端开发人员必须思考的问题。不同的页面,相同或者相似的页面结构是否进行了模块化处理,同样的头部或者尾部是否进行了内容分离决定了开发的效率。虽然Smarty本身支持include a file的功能,但这远远不够。我们需要的是不想重写同样的页面结构。

Jinja2的模板继承功能

Jinja是基于python的模板引擎,有个非常实用的功能就是模板继承。不太了解的可以去这里看详细的介绍http://opensource.csdn.net/bbs/thread/3943?lp=1

模板继承的好处就是你不在需要写整个页面,只要写页面的模块,然后用一个布局的页面套一下就可以了。并且页面中的模块书写顺序是无序的。

smarty本身并没有模板继承的功能,但我们可以通过block,capture和方法插件(其实block,capture也是插件)。 继续阅读 »

02-11
2010
loading...