Google犯下天大错误,5条PHP优化建议遭痛批

首先我承认我有点标题党了,然后:

近日Google 在 Google Code 下的 “Let’s make the web faster” 网站中,发表了一篇名为“PHP performance tips”的文章,介绍了一些php性能优化建议,其中:

  1. 不要随意复制变量
  2. 用单引号表示字符串
  3. 使用echo输出字符串
  4. 不要在echo中使用点号连接符
  5. 使用switch/case代替if/else

这篇文章发表后没多久就立刻遭到了一些PHP社区和个人无情的批驳,他们声称Google错了,错的很彻底,这5条看似有效优化建议其实完全是迷信:

1. 不要随意复制变量

Zend引擎采用了“写时复制”机制,这意味着无论你对变量进行多少次复制,真正的复制动作都仅在变量值改变时才发生。

2. 用单引号表示字符串

无数的基准测试已经证明,使用双引号表示纯字符串并不比使用单引号时慢。有兴趣的朋友也可以重复一下这个测试:

php > $blah=”blah”; $s=microtime(true); for($i=0;$i<100000;$i++) “omgwtf$blah\n”; echo microtime(true)-$s;
0.044615983963013
php > $blah=”blah”; $s=microtime(true); for($i=0;$i<100000;$i++) ‘omgwtf’.$blah.”\n”; echo microtime(true)-$s;
0.042807102203369

3. 使用echo输出字符串

根据php所在服务器环境的不同,某些情况下echo会比print()慢。这里有一篇echo和print()对比的帖子,对echo和print()的速度进行了测试:http://www.learnphponline.com/php-basics/php-echo-vs-print

4. 不要在echo中使用点号连接符

基准测试证明这又是一条与事实完全相反的建议。php引擎处理以点号连接(或者使用双引号)传递给echo的变量实际上是更快的。你可以重复这个测试:

$ php -d implicit_flush=off -r ‘$s=microtime(true); for($i=0;$i<100000;$i++) echo “omgwtf”,”bbq”,”\n”; echo microtime(true)-$s;’ | tail -n 1
1.071463108062710
$ php -d implicit_flush=off -r ‘$s=microtime(true); for($i=0;$i<100000;$i++) echo “omgwtf”.”bbq”.”\n”; echo microtime(true)-$s;’ | tail -n 1
0.44555306434631

5. 使用switch/case代替if/else

这条建议毫无意义。关于是要使用switch/case还是if/else的问题,其实完全是个代码风格问题,而它们的效率相差无几。

一向以技术为长的Google,竟然在技术问题上犯了如此错误,相当不严谨。PHP小组已经督促文章作者重新仔细审查文章,希望能尽快改掉,以正视听。

Farewell Michael

You are not alone

Michael Jackson

新网域名转出记

放在国内注册的国际域名只剩一个了,在新网(不是新网互联),一鼓作气也给转走。

新网的办事效率比万网高多了,收到我的材料后第二天就给回复了邮件。结果材料上少填了一些项目,只好重新再寄一份。

新的材料寄过去后,第二天就收到了确认转出的邮件,要求用域名注册邮箱回复。这点比万网好多了,SB万网只认发票。

于是第二天收到了转移密码,这里小小牢骚一下,新网发来的转移密码格式有点小问题,发来的是“xxxx .”,一个空格一个点号把我弄晕了,第一次提交到Godaddy时说转移失败,后来想想可能空格和点号是不需要的,去掉之后,果然好了。5天后域名就成功转入Godaddy了。

这次新网转域名的经历总体还是很愉快的。补充一下,我是直接在新网注册的域名,如果你是从新网代理手上拿的域名,过程会更麻烦一些。

Goodbye新网,Goodbye国内域名注册商,我已经成功逃往国外了。

用PHP在网页上显示psd文件

或许你会有直接在网页上显示psd文件的需要,那么classPhpPsdReader.php能帮助你。这是一个由Tim de Koning在2007年编写的一个基于GD库的PHP类,能够用PHP对图片进行一些操作,包括显示psd文件。这个类兼容PHP4和PHP5,可以放心使用。

使用方法也很简单,上传classPhpPsdReader.php,然后:

<?php
// 发送header
header("Content-type: image/jpeg");
// 包含类文件
include_once('classPhpPsdReader.php');
// 显示psd文件
imagejpeg(imagecreatefrompsd('yourPsdFile.psd'));
?>
就这么简单。

下载classPhpPsdReader.php

Elgg网站迁移指南

Elgg官方文档上的网站迁移部分是有问题的——缺少了一些重要步骤,而且过程更麻烦。正确的方法如下:

  1. 备份网站文件,包括uploads文件夹
  2. 导出数据库
  3. 在数据库文件中,将所有旧域名、网站根路径、uploads文件夹路径替换成新的
  4. 将数据库文件导入新数据库
  5. 上传网站文件,包括uploads文件夹
  6. 删除uploads文件夹中的view_path文件
  7. 编辑/engine/settings.php文件中的数据库配置信息
  8. 如果此时网站仍然不能正常访问,禁用所有插件,再重新启用

官方文档上要求在新服务器上安装elgg,然后删除数据库、导入uploads文件夹。这里缺少了“导入网站文件”一步,而且这样做很麻烦。直接在新服务器上导入数据库和网站文件、uploads文件夹和数据库就行了。

此外官方文档里没有6和8两步。如果view_path不删除,elgg会继续在旧的网站根路径和uploads文件夹路径里寻找文件,从而导致错误。

最后,有些插件在迁移后会出现故障,禁用后再重新激活就好了。

注:以上方法只在Elgg1.5上测试成功,未在旧版本上进行测试。

知识普及:

Elgg是一个开源SNS平台软件,通过组合如博客、微薄、书签、相册、群组等多种插件来打造个性化SNS网站。

广告:

扯Web是一个用Elgg搭建的SNS社区,这个社区的成员来自“扯淡的互联网从业人员”群,欢迎志同道合者加入。目前扯Web实行邮件邀请制,如果需要邀请邮件请给我发邮件或在本日志下留言(不要忘记写上你的邮箱地址)。