文档介绍:榨干 PHP, 不得不转的一篇 PHP 使用技巧! 这篇杂文翻译整理自网络各路文档资料( 见最末的参考资料) ,尤其是 Ilia sky (佩服之至) 在多个 PHP 会议上的演讲,主要是各类提高 PHP 性能的技巧。为求精准,很多部分都有详细的效率数据,以及对应的版本等等。偷懒,数据就不一一给出了,直接给结论, 如果需要看原文档,请到文末「参考资料」部分。橙色标题为推荐部分。======================================================== [size=+2] 静态调用的成员一定要定义成 static (PHP5 ONLY) 贴士: PHP 5 引入了静态成员的概念,作用和 PHP 4 的函数内部静态变量一致,但前者是作为类的成员来使用。静态变量和 Ruby 的类变量(class variable) 差不多,所有类的实例共享同一个静态变量。 QUOTE: // PHP CODE Highliting for CU by dZ902 <?php class foo { function bar() { echo 'foobar'; }} $foo = new foo; // instance way $foo->bar(); // static way foo::bar(); ?> 静态地调用非 static 成员, 效率会比静态地调用 static 成员慢 50-60% 。主要是因为前者会产生 E_STRICT 警告,内部也需要做转换。[size=+2] 使用类常量(PHP5 ONLY) 贴士: PHP 5 新功能,类似于 C++ 的 const 。使用类常量的好处是: - 编译时解析,没有额外开销- 杂凑表更小,所以内部查找更快- 类常量仅存在于特定「命名空间」,所以杂凑名更短- 代码更干净,使除错更方便[size=+2]( 暂时) 不要使用 require/include_once require/include_once 每次被调用的时候都会打开目标文件! - 如果用绝对路径的话, PHP 不存在这个问题- 新版的 APC 缓存系统已经解决这个问题文件 I/O 增加=> 效率降低如果需要,可以自行检查文件是否已被 require/include 。[size=+2] 不要调用毫无意义的函数有对应的常量的时候,不要使用函数。 QUOTE: // PHP CODE Highliting for CU by dZ902 <?php php_uname('s') == PHP_OS; php_version() == PHP_VERSION; php_sapi_name() == PHP_SAPI; ?> 虽然使用不多,但是效率提升大概在 3500% 左右。[size=+2] 最快的 Win32 检查 QUOTE: // PHP CODE Highliting for CU by dZ902 <?php $is_win = DIRECTORY_SEPARATOR == '\\'; ?> - 不用函数- Win98/NT/2000/XP/Vista/Longhorn/Shorthorn/Whistler... 通用- 一直可用[size=+2] 时间问题(PHP> ONLY) 你如何在你的软件中得知现在的时间?简单,「 time() time() again, you ask me... 」。不过总归会调用函数,慢。现在好了,用$_SERVER['REQUEST_TIME'] ,不用调用函数,又省了。[size=+2] 加速 PCRE - 对于不用保存的结果,不用() ,一律用(?:) 这样 PHP 不用为符合的内容分配内存,省。效率提升 15% 左右。- 能不用正则,就不用正则,在分析的时候仔细阅读手册「字符串函数」部分。有没有你漏掉的好用的函数? 例如: strpbrk() strncasecmp() strpos()/strrpos()/stripos()/strripos() [size=+2] 加速 strtr 如果需要转换的全是单个字符的时候,用字符串而不是数组来做 strtr : QUOTE: // PHP CODE Highliting for CU by dZ902 <?php $addr = strtr($addr, "abcd", "efgh"); // good $addr = strtr($addr, array('a' => 'e', // ... )); // bad ?> 效率提升: 10 倍。[size=+2] 不要做无谓的替换即使没有替换, str_replace 也会为其参数分配内存。很慢!解决办法: -用 strpos