Archive for the ‘LAMP’ Category

源代码的字符集不同带来的问题

星期日, 3月 29th, 2009

这两天在研究 Jobs Digg 的中文 URL 编码乱码的问题,我发现原来是由源代码字符集和数据输入输出字符集不同造成的。

这个乱码问题是这样的。在 Jobs Digg 的网站上,中文分类的链接里 URL 编码出错,无法还原成原来的中文名称。比如,UTF-8 的“招聘”这两个中文的 URL 编码应该是 %E6%8B%9B%E8%81%98,而出错的串变成 ae%8B%9Be%81%98。

产生这个问题的原因是在添加/更新分类的时候,Pligg 会把这个分类名称另外保存成一个 category_safe_name,代码中是先用 str_replace 函数把分类名称中可能包含的特殊字符转换成安全字符,再进行 URLEncode。

(更多...)

ThinkPHP 框架的 PATHINFO 模式对站点性能的影响

星期二, 12月 30th, 2008

最近在做的是一个基于 ThinkPHP 框架的webgame项目。在做性能优化的时候,发现 ThinkPHP 框架中 URL 的 PATHINFO 模式对性能有些不好的影响。

首先看看 ThinkPHP 的默认配置注1

URL_MODEL=1
URL模式: 0 普通模式 1 PATHINFO 2 REWRITE
默认为PATHINFO 模式,提供最好的用户体验和SEO支持
PATH_MODEL=2
// PATHINFO 模式
// 普通模式1 参数没有顺序/m/module/a/action/id/1
// 智能模式2 自动识别模块和操作/module/action/id/1/ 或者 /module,action,id,1/...
默认采用智能模式

把URL参数以斜杠分隔,这样 URL 看起来就比较友好,不管是对人(用户)还是对蜘蛛(机器人)都是。但在处理这种模式下的 URL 参数时,ThinkPHP 却做了影响性能的行为。在这种模式下,如果浏览器的 GET 参数是以常规的方式来传递(即参数以&分隔),ThinkPHP 在处理 URL 是时候,会把这样的参数重新拼成以斜杠分隔的“规范”的形式,然后向浏览器发一个重定向的响应头,让浏览器重新用“规范”的URL形式来请求。而重定向在高性能网站设计中是比较忌讳的,因为增加了浏览器向服务器提交请求的次数,也就增加了前端加载的时间,同时还会增加服务器的负载。这对于设计高性能的站点来说,是个不利的因素。注2

(更多...)

2008年终总结

星期三, 12月 24th, 2008

根据《程序员修炼之道》的建议,今年收获很多,嗯。

一直坚持使用 Ubuntu Linux 作为操作系统,坚持使用 Vim 作为主要开发的编辑器。经过一年的实践,对 Linux 的认识又有所提高,对 Vim 编辑器已经比较熟练。在 Linux 平台上作开发,效率比在 Win 平台上高出很多,主要是因为强大的开源工具集。

年初,读了《Learning Perl》,对 Perl 语言进行了初步的学习,之后写了几个小脚本,主要用于自动化方面,例如解析 CSV 文件、Excel 文档,自动处理电子邮件,以及系统管理等,并在实践中有所提高。对 Perl 的学习,是我走向 LAMP 的导火线。

由于目前国内 Java 和企业级开发环境的恶劣1,以及自身兴趣所在,决定转向 LAMP 方向。

利用出差那段时间的空闲,读了《PHP5 权威编程》,并接触了 WordPress。因为我的 Linux 和编程基础较好,所以转向 LAMP 的路很通畅。目前在一家互联网公司做 WebGame 的开发。

今年还读了不少好书,包括《精通正则表达式》、《JavaScript 权威指南》、《构建可扩展的Web站点》、《高性能网站建设指南》、《时间管理——给系统管理员》等等。

由于结合了 Web 方面的开发实践,效果很好。对 Web 站点的建设,有个最佳实践作为指导,对前端优化,也有个最佳实践作为指南,在实际开发中项目受益和个人收获都很大。尤其是对 Javascript 的深入学习和实践,理解并掌握了最核心的闭包、函数作用域链和函数调用对象的概念2。同时,掌握了命名空间,模块化开发等较高级的 Javascript 技巧。在 LAMP 开发过程中,也逐步认识到了开发符合标准 HTML/XHTML,CSS 的好处。

在项目开发中,对时间管理的概念有了初步的认识,并结合项目管理,体会到了注重时效3的重要性。

(更多...)

邮件中文问题

星期一, 10月 13th, 2008

我们经常发送中文的电子邮件,而电子邮件的编码写web不大一样。我们一般用base64的编码来处理邮件头中非ascii字符。而现在UTF-8是web上最通用的编码。

$smtp->datasend("Content-Type:text/plain;charset=UTF-8\n"); #这里设置邮件内容的编码
$smtp->datasend("Subject:=?UTF-8?B?".encode_base64($title, '')."?=\n\n"); #encode_base64是MIME::Base64模块中的函数,$title为UTF-8编码过的
$smtp->datasend($mail_body." \n"); #$mail_body为UTF-8编码过的

其中=?UTF-8?B?为前缀,?=为后缀,B表示Base64编码。在邮件头的标题中,必须先用utf-8编码,然后再用base64编码,而邮件体就可以直接采用UTF-8的编码。
这样发出的邮件,就不会出现中文乱码的问题。

(更多...)

通过SMTP发送邮件

星期一, 10月 13th, 2008

之前说过用perl发送邮件,在perl中,Net::SMTP是最底层的模块。这个模块不包含auth验证和TLS验证。比如我们如果想利用163/126的smtp服务器发送邮件,就得用到auth验证;如果我们要用gmail的smtp服务器发送邮件,就要用到auth和TLS。
在perl中,可以用Net::SMTP_auth模块来利用像163/126这样的需要auth验证的SMTP服务器来发送邮件。
可以用Net::SMTP::TLS模块来处理与gmail的SMTP服务器的交互。
这两个模块的API与Net::SMTP模块的基本上一样,所以用起来也很方便。
实际上我们可以利用封装性更好的模块,例如Mail::Sender,这样的模块很多,当然也可以根据自己的需要编写适合自己的模块。

(更多...)

终于拿到大骆驼了

星期一, 8月 18th, 2008

大骆驼——Programming Perl (3rd) /《Perl 语言编程(第三版)》,昨天终于拿到了。
首先要感谢力子,她帮我在网上买到了这本书,并帮我保管了两个多月。在此,我衷心地对她表示感谢。

好厚一本,可以当枕头了(昨晚就是枕着它睡的)。

我们鼓励你培养下面三条程序员的优点:懒惰,急躁,和傲慢。

这句话说的很有意思。在大多数人看来,上面三点简直就是糟透了,但对程序员来说,却是非常好的优点。
嗯,要往这方面发展……
(更多...)

perl发邮件脚本

星期二, 7月 1st, 2008

在外地出差也搞什么邮件签到,真无聊~
前一段看欧锦赛,时差还没调整过来,早上起不来zzzzz
不过上有政策,下有对策嘛
就在服务器上写了一个perl脚本,用Net::SMTP发邮件,用crontab来定时跑,一下就解决了,哈哈

(更多...)