狂人山庄 | Silence,声仔,吴洪声,奶罩 http://wuhongsheng.com 响应我党号召,全面建设和谐社会 Sun, 04 May 2008 14:54:57 +0000 http://wordpress.org/?v=2.5.1 en DNSPod新版本上线啦 http://wuhongsheng.com/it/2008/05/dnspod-v3-is-now-shipping/ http://wuhongsheng.com/it/2008/05/dnspod-v3-is-now-shipping/#comments Sun, 04 May 2008 08:01:59 +0000 吴洪声 http://wuhongsheng.com/?p=180 新版本从底层到界面完全重写,优化了用户体验,颠覆了传统的dns管理平台,很多功能还在开发中,欢迎大家测试
目前新增加的功能有
1.大量采用了ajax,大量减少用户提交数据时刷新页面的等待时间
2.采用tag方式来展示用户的域名,根据域名的记录条数对域名进行加粗、改变颜色等醒目标记
3.输入一个域名自动判断是新域名需要添加还是旧域名直接进入管理
4.域名输入框采用ajax下拉菜单,用户只需要输入域名某几个字母即可自动填充整个域名。如输入pod自动显示dnspod.com/dnspod.net等带有pod的域名让用户选择
5.支持中文域名
6.支持NS记录
7.支持TXT记录
8.支持域名转出到别的帐号
9.支持域名记录的导出导入,方便批量添加和备份记录(开发中)
10.支持批量修改。如1.1.1.1这台服务器挂了,通过批量修改可以把域名下所有1.1.1.1的记录修改为2.2.2.2
11.支持单条记录的禁用
12.支持域名的自诊断(开发中)
13.还有很多很多新功能等你去发现

]]>
http://wuhongsheng.com/it/2008/05/dnspod-v3-is-now-shipping/feed/
64bit Leopard下重新编译PHP并且添加iconv模块 http://wuhongsheng.com/it/2008/04/recompile-php-and-add-iconv-module-under-64bit-mac-os-x-leopard/ http://wuhongsheng.com/it/2008/04/recompile-php-and-add-iconv-module-under-64bit-mac-os-x-leopard/#comments Sat, 05 Apr 2008 02:47:17 +0000 吴洪声 http://wuhongsheng.com/?p=176 有关如何在64bit Mac OS X Leopard下面重新编译PHP并添加自己需要模块的文章请参考Leopard 编译 universal php5

重新编译后会出现一个问题:iconv无法编译进去。按照上文的方法,有些机器可以编译,但我的就死活不行。于是只能把iconv单独编译为so,再到php.ini里面添加。

$ cd php-5.2.5/ext/iconv/
$ phpize
$ ./configure
$ make && make install

然后编辑php.ini,先修改extension_dir为PHP扩展的路径,比如

; Directory in which the loadable extensions (modules) reside.
extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20060613/"

再把iconv.so添加进去,如

extension=iconv.so

保存后再看一下php -m,iconv已经加载进去了

Sam@Bogon:~$ php -m
[PHP Modules]
apc
ctype
curl
date
dom
filter
gd
hash
http
iconv
json
libxml
mbstring
mysql
pcre
PDO
pdo_mysql
pdo_sqlite
posix
Reflection
session
SimpleXML
SPL
SQLite
standard
tokenizer
xml
xmlreader
xmlwriter
zlib
 
[Zend Modules]
 
Sam@Bogon:~$
]]>
http://wuhongsheng.com/it/2008/04/recompile-php-and-add-iconv-module-under-64bit-mac-os-x-leopard/feed/
如何增加Time Capsule的备份速度 http://wuhongsheng.com/mac/2008/03/speed-up-time-capsule-backup/ http://wuhongsheng.com/mac/2008/03/speed-up-time-capsule-backup/#comments Tue, 25 Mar 2008 01:28:49 +0000 吴洪声 http://wuhongsheng.com/mac/2008/03/speed-up-time-capsule-backup/ Time Capsule的备份速度非常让人诟病,特别是初次备份,如果数据特别大(像我,90G以上),可能花上一个星期也备份不完。虽然可以通过连接网线来提高速度,但效果非常不明显。

今天在国外的论坛上发现一个方法,可以让Time Capsule的速度接近外置硬盘的速度:

系统偏好设置-网络-当前的连接-高级-TCP/IP-更新DHCP租借时间

完成上面的步骤后,你会发现Time Machine的备份速度有极大的提升。

当然,好东西也有不好的一方面,这个方法是临时有效的。也就是说,过一段时间后必须重新进行上面的步骤。

]]>
http://wuhongsheng.com/mac/2008/03/speed-up-time-capsule-backup/feed/
Time Capsule http://wuhongsheng.com/mac/2008/03/time-capsule/ http://wuhongsheng.com/mac/2008/03/time-capsule/#comments Mon, 24 Mar 2008 07:37:01 +0000 吴洪声 http://wuhongsheng.com/mac/2008/03/time-capsule/ time capsule

time capsule

time capsule

time capsule

time capsule

time capsule

time capsule

time capsule

]]>
http://wuhongsheng.com/mac/2008/03/time-capsule/feed/
关于leopard下的权限问题和@符号的意义 http://wuhongsheng.com/mac/2008/03/about-acl-and-at-symbol-in-leopard/ http://wuhongsheng.com/mac/2008/03/about-acl-and-at-symbol-in-leopard/#comments Mon, 17 Mar 2008 06:19:19 +0000 吴洪声 http://wuhongsheng.com/mac/2008/03/about-acl-and-at-symbol-in-leopard/ Mac OS X Leopard下的文件权限改变比较大,经常会出现一些文件权限上的问题,比如使用权限修复时可能会出现下面的问题:

**********
2008-03-17 13:39:37 +0800: “磁盘工具”已启动。
 
2008-03-17 13:39:47 +0800: 正在修复“Macintosh HD”的权限
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-autoindex.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-dav.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-default.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-info.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-languages.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-manual.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-mpm.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-multilang-errordoc.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-ssl.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-userdir.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra/httpd-vhosts.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/extra”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/magic”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/mime.types”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-autoindex.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-dav.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-default.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-info.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-languages.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-manual.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-mpm.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-multilang-errordoc.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-ssl.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-userdir.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra/httpd-vhosts.conf”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/extra”上。
2008-03-17 13:44:25 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original/httpd.conf”上。
2008-03-17 13:44:26 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/original”上。
2008-03-17 13:44:26 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/other/bonjour.conf”上。
2008-03-17 13:44:26 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/other/php5.conf”上。
2008-03-17 13:44:26 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/other”上。
2008-03-17 13:44:26 +0800: 已找到 ACL,但它不是按期望的在“private/etc/apache2/users”上。
2008-03-17 13:44:26 +0800: “private/etc/profile”上的权限不一致,应该是 -r--r--r-- ,却为 -rw-r--r-- 。
2008-03-17 13:45:25 +0800: 已找到 ACL,但它不是按期望的在“Applications”上。
2008-03-17 13:45:28 +0800: 已找到 ACL,但它不是按期望的在“Library”上。
2008-03-17 13:45:30 +0800: 
2008-03-17 13:45:30 +0800: 完成权限修复
2008-03-17 13:45:30 +0800: 
2008-03-17 13:45:30 +0800:

主要是ACL的问题,不管修复几次都会存在,挥之不去,相当噩梦.只要用下面的命令即可解决

chmod -RN /etc/apache2

-R是递归,-N是删除所有ACL

另外细心的人都会发现,leopard下面的文件属性后面多了个@(以前最常见的是+),比如

drwxr-xr-x@  6 Sam   staff   204B  1 26 23:53 .subversion

这个符号代表这个目录或者文件带有扩展属性.一般情况下,这个问题要归功于Time Machine.
想要看一下@符号里面藏了什么东西,可以用下面的命令

ls -lh@
Sam@Bogon-2:~$ ls -lh@
total 128
drwx------@ 28 Sam   wheel   952B  3 17 13:38 .
	com.apple.metadata:_kTimeMachineNewestSnapshot	  50B 
	com.apple.metadata:_kTimeMachineOldestSnapshot	  50B 
drwxr-xr-x   5 root  admin   170B  3 15 18:56 ..
-rw-------   1 Sam   staff     5B  3 15 18:56 .CFUserTextEncoding
-rw-r--r--@  1 Sam   staff    12K  3 17 14:15 .DS_Store
	com.apple.FinderInfo	  32B 
drwx------   2 Sam   wheel    68B  3 17 14:10 .Trash
-rw-------   1 Sam   staff   6.2K  3 17 14:15 .bash_history
drwx------@  9 Sam   wheel   306B  3 17 14:05 .gnupg
	com.apple.metadata:_kTimeMachineNewestSnapshot	  50B 
	com.apple.metadata:_kTimeMachineOldestSnapshot	  50B 
-rw-------   1 Sam   staff    35B  3 17 14:14 .lesshst
-rwxr-----@  1 Sam   staff   177B  3 16 16:22 .login
	com.apple.TextEncoding	  15B 
-rw-------   1 Sam   wheel   119B  3 17 13:11 .mysql_history
-rw-r--r--@  1 Sam   staff   741B  3 16 19:49 .profile
	com.apple.metadata:_kTimeMachineNewestSnapshot	  50B 
	com.apple.metadata:_kTimeMachineOldestSnapshot	  50B 
drwx------@  6 Sam   staff   204B  2 29 13:29 .ssh
	com.apple.metadata:_kTimeMachineNewestSnapshot	  50B 
	com.apple.metadata:_kTimeMachineOldestSnapshot	  50B 
drwxr-xr-x@  6 Sam   staff   204B  1 26 23:53 .subversion
	com.apple.metadata:_kTimeMachineNewestSnapshot	  50B 
	com.apple.metadata:_kTimeMachineOldestSnapshot	  50B 
-rw-------   1 Sam   staff   7.5K  3 17 13:33 .viminfo
-rw-r--r--@  1 Sam   staff    41B  3 16 14:49 .vimrc
	com.apple.metadata:_kTimeMachineNewestSnapshot	  50B 
	com.apple.metadata:_kTimeMachineOldestSnapshot	  50B 
...

@符号的存在,没什么大碍.但如果你发现某天某个文件夹里面写不进去东西了,但用户/用户组的权限都正确,那么就要考虑清理ACL了.目前暂时还不知道这个BUG是如何造成的.

]]>
http://wuhongsheng.com/mac/2008/03/about-acl-and-at-symbol-in-leopard/feed/
新本本到货 http://wuhongsheng.com/life/2008/03/new-macbook-pro/ http://wuhongsheng.com/life/2008/03/new-macbook-pro/#comments Mon, 17 Mar 2008 02:07:12 +0000 吴洪声 http://wuhongsheng.com/life/2008/03/new-macbook-pro/ 在半个月的等待后,新本本终于到货.
配置是定制的,屏幕换成了镜面.果然镜面的效果要好很多,就是会有点反光.
2.5G CPU,4G 内存,250G 硬盘,512M 显卡

macbook pro

about leopard

macbook pro硬件配置

macbook pro显卡配置

]]>
http://wuhongsheng.com/life/2008/03/new-macbook-pro/feed/
子曰:不能见义勇为! http://wuhongsheng.com/life/2008/01/ziyue/ http://wuhongsheng.com/life/2008/01/ziyue/#comments Fri, 18 Jan 2008 10:38:49 +0000 吴洪声 http://wuhongsheng.com/life/2008/01/ziyue/ “那是春秋时期,鲁国制定了一道法律,如果鲁国人在外国看见同胞被卖为奴婢,只要他们肯出钱把人赎回来,那么回到鲁国后,国家就会给他们以赔偿和奖励。这道法律执行了很多年,很多流落他乡的鲁国人因此得救,因此得以重返故国。”

“后来孔子有一个弟子叫子贡,他是一个很有钱地商人,他从国外赎回来了很多鲁国人,但却拒绝了国家的赔偿,因为他自认为不需要这笔钱,情愿为国分担赎人地负累。”

 

“但孔子却大骂子贡不止,说子贡此举伤天害理。祸害了无数落难的鲁国同胞。”

孔子说:世上万事,不过义、利二字而已,鲁国原先的法律,所求的不过是人们心中的一个‘义’字,只要大家看见落难的同胞时能生出側隐之心、只要他肯不怕麻烦去赎这个人、去把同胞带回国,那他就可以完成一件善举。事后国家会给他补尝和奖励。让这个行善举的人不会受到损失,而且得到大家的赞扬,长此以往,愿意做善事的人就会越来越多。所以这条法律是善法。”

“孔子还说,子贡的所作所为,固然让他为自己赢得了更高的赞扬,但是同时也拔高了大家对‘义’的要求。往后那些赎人之后去向国家要钱的人,不但可能再也得不到大家的称赞,甚至可能会被国人嘲笑,责问他们为什么不能像子贡一样为国分忧。圣人说,子贡此举是把‘义’和‘利’对立起来了,所以不但不是善事,反倒是最为可恶的恶行。”

自子贡之后,很多人就会对落难的同胞装做看不见了。因为他们不像子贡那么有钱,而且如果他们求国家给一点点补偿的话反而被人唾骂。很多鲁国人因此而不能返回故土。

延伸阅读

]]>
http://wuhongsheng.com/life/2008/01/ziyue/feed/
40 Tips for optimizing your php Code http://wuhongsheng.com/it/2008/01/40-tips-for-optimizing-your-php-code/ http://wuhongsheng.com/it/2008/01/40-tips-for-optimizing-your-php-code/#comments Tue, 15 Jan 2008 02:30:23 +0000 吴洪声 http://wuhongsheng.com/it/2008/01/40-tips-for-optimizing-your-php-code/ 原文地址:http://reinholdweber.com/?p=3
英文版权归Reinhold Weber所有,中译文作者yangyang(aka davidkoree)。双语版可用于非商业传播,但须注明英文版作者、版权信息,以及中译文作者。翻译水平有限,请广大PHPer指正。

1. If a method can be static, declare it static. Speed improvement is by a factor of 4. 如果一个方法可静态化,就对它做静态声明。速率可提升至4倍。

2. echo is faster than print. echo 比 print 快。

3. Use echo’s multiple parameters instead of string concatenation. 使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接。

4. Set the maxvalue for your for-loops before and not in the loop. 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。

5. Unset your variables to free memory, especially large arrays. 注销那些不用的变量尤其是大数组,以便释放内存。

6. Avoid magic like __get, __set, __autoload 尽量避免使用__get,__set,__autoload。

7. require_once() is expensive require_once()代价昂贵。

8. Use full paths in includes and requires, less time spent on resolving the OS paths. 在包含文件时使用完整路径,解析操作系统路径所需的时间会更少。

9. If you need to find out the time when the script started executing, $_SERVER[’REQUEST_TIME’] is preferred to time() 如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。

10. See if you can use strncasecmp, strpbrk and stripos instead of regex. 检查是否能用strncasecmp,strpbrk,stripos函数代替正则表达式完成相同功能。

11. str_replace is faster than preg_replace, but strtr is faster than str_replace by a factor of 4. str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。

12. If the function, such as string replacement function, accepts both arrays and single characters as arguments, and if your argument list is not too long, consider writing a few redundant replacement statements, passing one character at a time, instead of one line of code that accepts arrays as search and replace arguments. 如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。

13. It’s better to use select statements than multi if, else if, statements. 使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。

14. Error suppression with @ is very slow. 用@屏蔽错误消息的做法非常低效。

15. Turn on apache’s mod_deflate 打开apache的mod_deflate模块。

16. Close your database connections when you’re done with them. 数据库连接当使用完毕时应关掉。

17. $row[’id’] is 7 times faster than $row[id]. $row[‘id’]的效率是$row[id]的7倍。

18. Error messages are expensive. 错误消息代价昂贵。

19. Do not use functions inside of for loop, such as for ($x=0; $x < count($array); $x) The count() function gets called each time. 尽量不要在for循环中使用函数,比如for ($x=0; $x < count($array); $x)每循环一次都会调用count()函数。

20. Incrementing a local variable in a method is the fastest. Nearly the same as calling a local variable in a function. 在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。

21. Incrementing a global variable is 2 times slow than a local var. 递增一个全局变量要比递增一个局部变量慢2倍。

22. Incrementing an object property (eg. $this->prop++) is 3 times slower than a local variable. 递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。

23. Incrementing an undefined local variable is 9-10 times slower than a pre-initialized one. 递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。

24. Just declaring a global variable without using it in a function also slows things down (by about the same amount as incrementing a local var). PHP probably does a check to see if the global exists. 在一个函数里如果只声明一个全局变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP很有可能会检查看是否存在全局变量。

25. Method invocation appears to be independent of the number of methods defined in the class because I added 10 more methods to the test class (before and after the test method) with no change in performance. 方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。

26. Methods in derived classes run faster than ones defined in the base class. 派生类中的方法运行起来要快于在基类中定义的同样的方法。

27. A function call with one parameter and an empty function body takes about the same time as doing 7-8 $localvar++ operations. A similar method call is of course about 15 $localvar++ operations. 调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。

28. Surrounding your string by ‘ instead of ” will make things interpret a little faster since php looks for variables inside “…” but not inside ‘…’. Of course you can only do this when you don’t need to have variables in the string. 用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。当然,只有当你不需要在字符串中包含变量时才可以这么做。

29. When echoing strings it’s faster to separate them by comma instead of dot. Note: This only works with echo, which is a function that can take several strings as arguments. 输出多个字符串时,用逗号代替句点来分隔字符串,速度更快。注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。

30. A PHP script will be served at least 2-10 times slower than a static HTML page by Apache. Try to use more static HTML pages and fewer scripts. Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。

31. Your PHP scripts are recompiled every time unless the scripts are cached. Install a PHP caching product to typically increase performance by 25-100% by removing compile times. 除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。

32. Cache as much as possible. Use memcached - memcached is a high-performance memory object caching system intended to speed up dynamic web applications by alleviating database load. OP code caches are useful so that your script does not have to be compiled on every request. 尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码(OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。

33. When working with strings and you need to check that the string is either of a certain length you’d understandably would want to use the strlen() function. This function is pretty quick since it’s operation does not perform any calculation but merely return the already known length of a string available in the zval structure (internal C struct used to store variables in PHP). However because strlen() is a function it is still somewhat slow because the function call requires several operations such as lowercase & hashtable lookup followed by the execution of said function. In some instance you can improve the speed of your code by using an isset() trick. 当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset()技巧加速执行你的代码。

Ex.(举例如下)
if (strlen($foo) < 5) { echo “Foo is too short”; }
vs.(与下面的技巧做比较)
if (!isset($foo{5})) { echo “Foo is too short”; }

Calling isset() happens to be faster then strlen() because unlike strlen(), isset() is a language construct and not a function meaning that it’s execution does not require function lookups and lowercase. This means you have virtually no overhead on top of the actual code that determines the string’s length. 调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。

34. When incrementing or decrementing the value of the variable $i++ happens to be a tad slower then ++$i. This is something PHP specific and does not apply to other languages, so don’t go modifying your C or Java code thinking it’ll suddenly become faster, it won’t. ++$i happens to be faster in PHP because instead of 4 opcodes used for $i++ you only need 3. Post incrementation actually causes in the creation of a temporary var that is then incremented. While pre-incrementation increases the original value directly. This is one of the optimization that opcode optimized like Zend’s PHP optimizer. It is still a good idea to keep in mind since not all opcode optimizers perform this optimization and there are plenty of ISPs and servers running without an opcode optimizer. 当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。

35. Not everything has to be OOP, often it is too much overhead, each method and object call consumes a lot of memory. 并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。

36. Do not implement every data structure as a class, arrays are useful, too. 并非要用类实现所有的数据结构,数组也很有用。

37. Don’t split methods too much, think, which code you will really re-use. 不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?

38. You can always split the code of a method later, when needed. 当你需要时,你总能把代码分解成方法。

39. Make use of the countless predefined functions. 尽量采用大量的PHP内置函数。

40. If you have very time consuming functions in your code, consider writing them as C extensions. 如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。

41. Profile your code. A profiler shows you, which parts of your code consumes how many time. The Xdebug debugger already contains a profiler. Profiling shows you the bottlenecks in overview. 评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。

42. mod_gzip which is available as an Apache module compresses your data on the fly and can reduce the data to transfer up to 80%. mod_gzip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。

43. Excellent Article (http://phplens.com/lens/php-book/optimizing-debugging-php.php)about optimizing php by John Lim 另一篇优化PHP的精彩文章,由John Lim撰写。

]]>
http://wuhongsheng.com/it/2008/01/40-tips-for-optimizing-your-php-code/feed/
技术测试:你是oltp应用开发方面的高手吗? http://wuhongsheng.com/it/2008/01/are-you-a-master-at-oltp/ http://wuhongsheng.com/it/2008/01/are-you-a-master-at-oltp/#comments Mon, 07 Jan 2008 14:11:09 +0000 吴洪声 http://wuhongsheng.com/it/2008/01/are-you-a-master-at-oltp/ 整理文章整理出来的,很早时候caoz写的,翻出来备份

这里是一篇技术测试的文章,希望所有那些自称的和被人吹捧的技术高手来看一看,做做我们的几个测试,看看你属于那种层次的高手?

以下测试是针对oltp开发而言的,对于做算法和桌面程序的,不是我这里要讨论的对象。

好了,第一个考题:你能否做一个统计系统,功能上和易数差不多,能够通过页面嵌入方式记录一个网站的显示次数,来访分析,时段分析,日期分析等等。怎么,这就被难住了,那你算哪门子高手?啊哈,这位说了,这些都easy,手到擒来,很好,很好,看来在实现功能上,你具有了高手的基本能力,不过且慢,如果你认为可以实现这些功能就能自称做个易数统计出来,未免也太小瞧了技术这碗饭的分量,实现这些功能,就中国而言,至少有6位数的程序员可以作到,而设计这么一套系统(仅从功能考虑),也至少有5位数的程序员可以作到,明白吗?你不过是这里面平平常常的一个而已了,要高兴还早呢。

第二个考题:呵呵,其实还是做这些功能,不过加个条件,我只给你一台PC Server(单/双PIII 733+512M Ecc内存+18G SCSI硬盘),你要支撑300万/天的请求调用。琢磨琢磨吧。
简简单单的一个cgi+数据库,那是肯定死翘翘了,怎么办?
第一,你要建立三层体系模型,后台数据库必须通过中间应用层和前台CGI分开。
第二,合理分配使用共享内存空间,并合理通过IPC信号量防止内存区的读写冲突和死锁。
第三,必要时改写web server原代码以获得效率最优化,比如改写apache server的http_log.c程序并重新编译。
如果你对建立这么一套系统的整体架构非常清楚,那么恭喜,你可以在一个比较不错的网络公司做一个CTO了,中国能够清晰搭建这样系统的人,不过4位数而已(当然,能够在这样系统里进行编码工作的,肯定还是有5位数以上的,毕竟左右都是c语言而已)。
知道为什么层出不穷那么多统计系统,虽然功能花哨,但是最后都撑不过易数,基本功不扎实,光靠功能花哨,那是没前途的。

在这个领域做的比较好的,好耶,网易,adsunion,腾讯,太极链等几家而已。
那些所谓广告交换没什么技术瓶颈的人,自己做一套大并访系统出来再说话。

第三个考题,还是这些功能,(我够贫的是吧)我要你一天能记录下3000万次浏览日志,不但要统计,还要完整记录,以供随时查验,当然主机环境提升一下,处理数据的主机用集群,但是核心数据库还是用一台电脑的,这次用sun的小型机,比如RS6000什么的;还有这次再加个条件,数据损失不能超过 0.01%。
这个已经不再象建立一个网站了,到象是大型电信的计费中心。你能胜任吗?
这时候要求对整体操作系统,对C语言,对数据库核心都必须有深入骨髓的理解,甚至于,对于数据的导入导出和一些日志的数据库记录,你已经不能再用sql去写了!要利用数据库产品的核心接口按照其数据存储格式直接进行文件或设备块的读写操作!对于一些负载非常大而性能要求又非常高的系统,甚至你需要建立一套独立的数据库体系和数据结构体系。这不是玩笑,因为我领教过这样的系统。
在中国,能搭建这样平台的高手,最多3位数而已。主要集中在电信计费领域,如亚信这样的企业。

第四个考题,这次每天的请求不是3000万了,而是3万万,我没说胡话,3万万!不过你的工作变了,我不要你再做后面的数据处理,我只让你做一个前端报文转发处理,这次我很苛刻,给你一台PII的PC服务器,256M Ecc内存,而数据损失要求则绝对不能超过0.0001%,你的工作很简单,对来往的请求进行简单识别并转发到合适的应用服务器处理。
你用web server转发?别开玩笑了!这时候,你已经别无选择,用汇编自己写一套报文处理程序,作为看守进程驻入内存并挂在接收报文的端口上,你对效率的理解,应当已经超出了对操作系统的认识,对编程语言的认识,而直接达到对CPU指令集的认识程度上,是的,你必须清楚自己的每一条汇编指令是不是已经达到最小的 CPU指令占用。必须能计算出分解和处理一条报文的流程需要多少CPU指令循环,是不是已经针对CPU的指令集达到了最大优化,当然,你还必须很熟悉 TCP/IP协议对每一种报文的格式定义和规范,不过这和汇编指令的效率优化而言,到不显得有多高深了。
我们经常说CISCO是硬件产品服务商,错了!他们的利润主要就来自于这样的算法!!中国联想、华为等等都想强占这块肥肉的市场,但是在高端领域(其实并不是硬件高端,而是算法高端!),我们还是彻底的空白。
庆幸的是,我知道国内有人在做这样的事情了,当宽带不可避免的成为主流的时候,这种算法的强度和要求,会成为攫取利润的最好途径。
中国在这方面能达到标准的,又有几个人呢?

出了这四个考题,没别的意思,我刚大学毕业的时候,也是自视甚高,因为当时的感觉是,和专业课的计算机作业相比(我是力学专业的,动不动要求编程解一个偏微分方程的收敛解,来分析什么旋流场的速度、温度等的分布),做wewebb开发简直毫无算法可言。再加上当时国内做web数据库的也少,动辄以为自己已经是满高手了,结果幸好跑到给电信做计费的企业混了一年,接触了国内最大的电信集中计费中心的解决方案(一直在运营,还不错),才知道敢情OLTP应用里面学问大的很,自己这点皮毛拿出来吹嘘简直是不知天高地厚。现在看看外面一堆和我当初一样的小毛孩子整天做两个烂程序就自诩高手,只好出来说几句。

其实对于OLTP应用而言,功能的实现一般都非常容易,和那些从事力学、数学、物理等行业的数值计算相比简直毫无算法可言,而OLTP的技术难点主要在于性能,也就是你做一个桌面程序或算法程序,都不会面临并访过高的处理问题,但是做一个OLTP应用,无论如何你都必须直视一下子很多访问冲上来的情况,如果这个问题解决不了,无论多好的创意,多好的功能,都不会得到持续和长远的发展。

由于很多创业者和投资者对技术不通或半通,他们往往拿一个性能指标有很大缺陷的东东当个宝贝,因为一般而言,开发出新东东大家都只是忙着测试功能,很少有对性能进行完整测评的,只有持续运营到一定阶段,并访达到一定程度,性能缺陷开始暴露,才临急抱佛脚,这时候造成的损失就很不核算,甚至是压根解决不了,只好放弃某种功能,从而使品牌信誉整体下降。

加强算法基础,加强技术基础,少卖弄一些花里胡哨的东西,是走向技术高手的真正路线,那些今天学会了什么语言,明天又学会了什么语言的主儿,别吹嘘了,从70年代到现在,最值钱的程序员一直是写汇编和写标准C的,不为什么,因为这是真功夫。

—————————————————–
搜出来这个帖子,呵呵,稍微回复一下。

caoz早期也做过asp,中国最早的asp中文教程,是caoz翻译的,那是1998年的事情。但是后来(99年)换了php,不是因为asp不好,而是因为安全性,安全性的问题,根源在microsoft,这个和程序员没关系,但是程序员规避风险的话,还是linux下塌实一些,顺便说一下,caoz 在安全公司混过一年半的程序员。

asp和php相比,在某些应用的效率上,甚至更胜一筹,这个原因也不是语言的问题,而是本身系统的进程模式,Asp是线程模式,线程间的数据通信是非常简单的,写过asp的都知道,可以用application变量做,非常简单。而php在apache下只能是进程模式就麻烦很多,虽然也有共享内存支持,但是调用时候需要做信号量锁定,很麻烦,否则就有内存索引崩溃的危险。就进程间通信而言,asp不是略胜一筹的问题,而是拥有无可比拟的优势。

所以一个统计系统效率还还是不好,语言并不是决定因素,但是阿江有一点说的过了,一台服务器千万次的静态调用就达到极限?
caoz告诉你,在apache 下,caoz所能达到的数字是4000万次,而且是普通的服务器。

阿飞做过极限测试,单服务器最高的一天,统计量达到了3670万次(真实网络流量,不是测试机的模拟流量),单p4的机器,配置很一般的那种。当然这种极限测试不代表真正的应用环境,毕竟单用户和多用户对统计系统负载开销是不同的,但是单服务器在应用环境下每日支撑千万次以上的统计,却并非难事。关键不是看语言,而是看设计。cnzz可以做到,50bang也可以做到。

技术无止境,对比千兆的网络数据包分析工具(如千兆路由器,千兆IDS,千兆黑洞等),那种每秒解析上百万数据包变态应用,的现在的站点统计系统,日千万次处理简直是小儿科的东西。

不过说实话,国内统计系统技术依然有很大的提升空间,阿江的,caoz的,不外如此,处理效率上去只是一方面,分析能力提高也是很考验技术实力的。就这一点,caoz坦承,Google Analytics的数据挖掘能力,无可比拟,完全超越了caoz的技术理解力。当然,这是另一个话题了。

—————————————————
阿江的回帖

看了那个顶上了的贴,接受里面的一些批评,
我自己的观点也在实践中变化,我仔细的看过CNZZ的统计报告并对其统计方式进行了推断。
我的结论是,影响效率差异的主要因素并不在操作系统和WEB服务软件上,
而是在数据结构和程序结构上。

对于一次访问,51LA立即更新统计报告,保存统计报告,
而CNZZ则很傲能是追加访问记录,而在显示统计报告时检索汇总,或者每天还会把前一天的数据汇总后保存。
所以差异出现在这里:向数据库里追加行少数次 VS 更新数据库中指定的行多次
后者的效率明显要低的多。

虽然51LA在统计程序效率上有差距,
但是这种设计思路可以实现统计报告的完整、快速显示、翻页、排序、筛选,
这对很多站长是非常有用的,也是很多人喜欢51LA的原因。
这也正是我迟迟不肯使用承受力更强的新思路重写统计的原因。

另外,MSSQL数据库是一个库一个文件,而MYSQL是一个表一个文件,
这使MSSQL在磁盘操作上稍逊一筹,因为要处理的是大文件。
加上直接更新统计报告的统计方式增加了数据库操作次数,效率大打折扣。

]]>
http://wuhongsheng.com/it/2008/01/are-you-a-master-at-oltp/feed/
玩《征途》感受,这么多年白玩游戏了 http://wuhongsheng.com/it/2007/12/zhengtu/ http://wuhongsheng.com/it/2007/12/zhengtu/#comments Wed, 26 Dec 2007 05:32:23 +0000 吴洪声 http://wuhongsheng.com/it/2007/12/zhengtu/ 写得很好的一篇文章,转过来保存

=====================
前言、你可以看完前言就把这篇文章扔到一边

《征途》=?假如你刚好没玩过《征途》,那么在本文开始之前,我认为你有必要先回忆一下脑海里对《征途》的印象。就我猜测,你可能想到的关键词大致包括这些:最昂贵的游戏,垃圾游戏,黑心的公司,史玉柱,道德的底限,游戏行业的搅局者……如果这猜测正确的话,那么我要说,大致在一个月前,我跟你的这些想法一样,——可能更甚。

但是,在接触了《征途》一个月后,我却得出了一个令自己都难以相信,难以接受的结论:我18年(今年24岁, 1989年6岁时开始接触FC,1990年7岁时开始接触黄海286电脑以及上面的游戏)来的游戏理念,以及近8年来在游戏行业工作的经验,——所有这一切,统统都被颠覆了。当我向身边一位朋友推荐《征途》时,我是这样说的:“《征途》是一款颠覆了现有游戏理念的东西,堪称‘心理学百科全书’+‘营销百科全书’,我在玩过《征途》之后,最大的感受就是这些年游戏全白玩了。”

——至此,如果你认为这是一篇枪稿,那么可以不看了。否则请继续。

一、不可忽视的《征途》理念

因为工作的关系,我看过许多公司的“《征途》研究报告”,也听过不少业内人士对《征途》的评价。但是这些研究和评价基本都是围绕《征途》的系统展开的,却忽略了《征途》最本质的东西,它的理念,以及它所颠覆的理念。我认为这和我们在制作、运营,乃至玩游戏的时候,很少去思考什么是游戏理念有关。

所谓游戏理念,在本文中的定义主要是指设计一款游戏的思想依据,包括:你认为一款游戏的意义何在?比如,日本某著名游戏制作人说:一款游戏如果不能折磨玩家几百个小时,那它简直不配称为游戏;游戏应该做成什么样?比如,Blizzard认为要让玩家在每一个阶段都能体验到乐趣,发现惊喜,循序渐进;它如何给人带来快乐、或者说你从种获得了什么样的快乐?比如,许多游戏公司都会不停的推出新系统、道具和内容;等等这些……

每家公司、每个人对游戏的理解和认识不同,导致了他们的游戏理念有极大的差距,也幸亏如此,才让游戏的类别和内容不至于千篇一律。但是在《征途》之前,对几乎所有游戏而言,有一点是同样的:所有游戏在设计时,都认为应该让玩家体验到包括收集装备、等级提升、技巧熟练等各方面的辛苦,使之在成长之后获得巨大的成就感。比如说极品装备的掉率通常低于1%,比如说一款网络游戏在没有外挂的前提下升满级需要半年,比如说若是没有高超的技巧就打不过强大的BOSS……诸如此类,不一而足。

但《征途》完全不是这样。

在《征途》中,等级的提升非常迅速,从1级升到10级甚至只需要二十几分钟。而在此后,通过完成住线任务、答题、每天限制参与次数的固定活动,几乎可以保证你在30级以前,等级像飞,——或许比飞还要快的增长。与此同时,当玩家打怪的时候几乎不用去操作,按下快键 Ctrl+Z,人物就会像开了外挂一样自动打怪,而怪物掉落的装备,可以用“一大片”、“半屏”甚至是“满屏”这些词来形容其数量之多,且所掉落的装备中包含大量付费道具,任务赠送的装备属性之好更是夸张,10级的任务赠送武器属性竟强过25级能买到的装备……如此等等,说也说不完。

以上,就是《征途》的理念所在:给予玩家最大的满足感,让你爽,并且向往花钱换来的更爽。但是,你是会不会因此觉得:一款游戏的等级、装备,所有的一切都能如此轻松的拥有,其乐趣何在?那么,让我以问答的形式来给你讲讲一个《征途》玩家,是如何一步一步体验到乐趣并着迷的。

二、看看人家《征途》是怎么研究玩家心理的

问题一,如前所说,但凡是个曾有游戏经验的玩家,在进入《征途》后只需要二十几分钟,就可以轻松升到10级,并且必然在10级前领到一把属性远比15级装备还优秀的武器。——那么假设你是这个玩家,当你在1级时候获得了一把10级可以使用的武器,你愿不愿意练到10级?

问题二,当你练到10级,已经了解了这款游戏的基本系统,并发现手中的武器在属性上远远好过15级武器,那么你愿意不愿意至少练到15级?

问题三,当你决定至少练到15级之后,你却惊讶的发现从10级到15级同样只需要不到一小时的时间,甚至于,你是在自己都还没反应过来的情况下,就莫名其妙的升到了20级。你愿意不愿意继续?

问题四,你觉得《征途》升级太快了,简直没有意思,但是这个时候你忽然发现,通过做主线任务,你竟然获得了几样要付费才能买到的道具。你会不会想,至少把这个付费道具用掉,然后再离开游戏?

问题五,你在做主线任务的时候发现,你完全不需要去官网或百度查资料,不用论坛发帖QQ求人等形式来知道这游戏该怎么玩,更不需要为了找到一个躲在角落的NPC而找上大半天,所有任务中提示你需要找到的NPC和怪物,名字下面都有一行下划线,就像网页的超连接一样,你只要点一下,就会自动找到他并完成任务。在打怪时,只要按一下Ctrl+Z,就可以实现自动打怪。你会不会因为这游戏简直太轻松了,觉得挂在上面让它自动打怪的同时,除了聊聊网页也无所谓?

问题六,不论是什么原因,总之你已经20级了,升级的速度稍微,——注意,是稍微慢了下来。至少不会让你Ctrl +Z打不了十分钟就升一级了,这个时候你应该已经通过任务拿到了比30级装备还好的武器,并完成了五行任务,获得了金、木、水、火、土中的某一种属性。你发现在你自动打怪的时候,身边有许多人在用同样的方法和你一起打怪,自然,像所有网络游戏那样,你们组队了。假设你们属性相合的话,你立刻获得了高达 300点的攻击力提升,杀怪如同切瓜。这个时候,由于你们不需要操作,所以你们的全部时间都在聊天,你们当然成为了朋友。那么,当你们成为了朋友之后,你会离开一款有朋友在玩的游戏么?

问题七,在你20级之前,你会发现NPC将你引导到皇城的公告牌,——确切的说,是一个叫智者的NPC旁边。这个 NPC的作用是,你可以消费一定数量的游戏币,来回答她所提出的20道问题,并获得数倍于打怪的经验,甚至可以一次升2级。这个时候,你会不会发现其实这游戏有点乐趣?

问题八,你终于决定,——好吧,事实上是在你做出决定之前,你已经又一次莫名其妙的就升了10级。当你30级的时候,你发现你可以骑马了,很威风;你发现自己在一分钱没花的情况下,仓库里存了一堆要花钱才能买到的道具,仿佛赚到了;你发现自己已经穿着一身通过打怪就轻松获得的,属性很好的装备;你发现由于之前组队的缘故,你的朋友已经有好几个了;你还发现10级的时候系统曾送给过你一个替身宝宝,你清楚的知道把它变为等待领养状态后,即便你下线了,当你再次登陆的时候也很可能已经到了35级。如果这个时候让你放弃《征途》,你会不会有一点不舍得?

问题九,你还会发现,如果现在你充10元点券,NPC会送你许多珍贵的道具,并且差不多你每升几级,NPC还会再返还给你点券。简单点说,可能你在30级时花了10元钱,但等到50级的时候,你却一共获得了价值200元的道具。那么,假如你在问题八的时候就已经决定再多玩一会,你愿意不愿意尝试性的付出10元钱?——当然不付也没关系,因为后面有的是地方让你心甘情愿的掏钱。

问题十,你就这样,几乎毫不费力的在很短时间内到50级了,假如你已经付过费了,你几乎一定会玩下去。但假如你没付过费,并依旧觉得这游戏很垃圾,想离开,那也没关系,因为这时候你会发现,许多高级别的玩家以低于官方的价格收购某些付费道具,——而这些道具,你几乎一定拥有。那么你很轻松的利用《征途》赚了一小笔钱,这个时候,你是否重新觉得这游戏值得玩下去?

问题先到此为止吧,在那以后,你还会见识到许多类似的诱惑,比如你刚杀完一个玩家,忽然发现屏幕上显示出你的名字:“你杀死了谁谁谁”并且全服务器的人都能看到,这个时候你是否觉得太有成就感了?但我恐怕你在到达那一步之前,已经开始欲罢不能了。

当你在内心深处默默回答完以上全部问题之后,你可能依然觉得:“不就是就快速度让你达到一个离不开游戏的临界点么?很多游戏都这么做啊。”又或者,“我认为大多数玩家对这些不会有兴趣,看到《征途》两个字我就恶心,不想去玩,所以你这些话白说。”——那么,《征途》今天的100万峰值在线怎么来的?——让我来告诉你。

三、看看人家《征途》是如何结合游戏特色来做宣传的

《征途》的宣传上,最大的看点其实不是它长年在各大媒体的首页“新闻推荐栏目”里,把同样一个内容车轱辘话来回说。而是其别出心裁的市场活动。

《征途》曾做过比如“发工资”,“迷宫”等等许多市场活