网站首页php
PHP Coding Tips代码优化备忘录
发布时间:2016-03-10 20:03:35编辑:阅读(5282)
1. 检查服务器环境,是否win系统;
<?php
$is_win = DIRECTORY_SEPARATOR == '//';
?>
2. 使用$_SERVER['REQUEST_TIME']代替time();
time()会引来一次函数调用, 而如果对时间的精确值要求不高, 可以使用$_SERVER['REQUEST_TIME']代替,
3. 用FALSE表示错误, 用NULL表示不存在;
对于操作类的函数, 失败返回FALSE, 表示”操作失败了”。
而对于查询类的函数, 如果找不到想要的值, 则应该返回NULL, 表示”找不到”
4. 用字符串函数代替正则
例如:
strpbrk()
strncasecmp()
strpos()/strrpos()/stripos()/strripos()
5. 不要用常量代替字符串
- 需要查询杂凑表两次
- 需要把常量名转换为小写(进行第二次查询的时候)
- 生成 E_NOTICE 警告
- 会建立临时字符串
6. 不要把 count/strlen/sizeof 放到 for 循环的条件语句中
for ($i=count($res);$i>=0;$i--){
do_sth($res[i]);
}
7. 查看脚本内存使用量
memory_get_usage()
单位是字节,写脚本的时候记得unset对象或者大数组,不知道哪里用了内存,就用上面的方法跟踪
8. 查看脚本执行时间
<?php class Timer { private static $__startTime = 0; private static $__stopTime = 0; private static $__timeSpent = 0; public static function start(){ self::$__startTime = microtime(true); } public static function stop(){ self::$__stopTime = microtime(true); } public static function spent() { self::$__timeSpent = self::$__stopTime-self::$__startTime; return round(self::$__timeSpent, 5); } } Timer::start(); ... Timer::stop(); echo Timer::spent(); ?>
9. 用带目录路径提高 PHP 文件访问效率
需要包含其他 PHP 文件的时候,使用完整路径,或者容易转换的相对路径。
<?php
include 'file.php'; // bad approach
incldue './file.php'; // good
include '/path/to/file.php'; // ideal
?>
10. 如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍;
11. 注销那些不用的变量尤其是大数组,以便释放内存;
12. 使用PHP的Gzip加载CSS文件
<?php if(extension_loaded('zlib')){//检查服务器是否开启了zlib拓展 ob_start('ob_gzhandler'); } //如果处理的是js文件,则使用 header ("content-type:application/x-javascript; charset: gb2312"); header ("content-type: text/css; charset: gb2312");//注意修改到你的编码 header ("cache-control: must-revalidate"); $offset = 60 * 60 * 24;//css文件的距离现在的过期时间,这里设置为一天 $expire = "expires: " . gmdate ("D, d M Y H:i:s", time() + $offset) . " GMT"; header ($expire); ob_start("compress"); function compress($buffer) {//去除文件中的注释 $buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer); return $buffer; } //包含你的全部css文档 include('global.css'); include('layout.css'); if(extension_loaded('zlib')){ ob_end_flush();//输出buffer中的内容,即压缩后的css文件 } ?>
13. 循环内部不要声明变量,尤其是大变量和对象;
14. foreach效率更高,尽量用foreach代替while和for循环;
15. 使用func_get_args()获取匿名形参;
function foo() { $args = func_get_args(); foreach ($args as $k => $v) { echo "arg".($k+1).": $v\r\n"; } }
16. 不用第三变量交换俩个变量的值;
list($a,$b) = array($b,$a);
17. 用switch代替条件判断语句块:
if( $a ){ }elseif($b){ }elseif($c || $d){ }
可以写为:
swithc(TRUE){ case $a: break; case $b: break; case $c: case $d: break; }
18. switch和in_array要确定变量类型, 防止隐形的类型转换
switch( strval($name) ){ case 'good': break; case 'day': break; case 'world': break; }
19. PHP转发中文名文件下载代码
<?php $file = "/tmp/中文名.tar.gz"; $filename = basename($file); header("Content-type: application/octet-stream"); //处理中文文件名 $ua = $_SERVER["HTTP_USER_AGENT"]; $encoded_filename = rawurlencode($filename); if (preg_match("/MSIE/", $ua)) { header('Content-Disposition: attachment; filename="' . $encoded_filename . '"'); } else if (preg_match("/Firefox/", $ua)) { header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"'); } else { header('Content-Disposition: attachment; filename="' . $filename . '"'); } header("Content-Length: ". filesize($file)); readfile($file);
20. 使用Glob()查找文件
<?php $files = glob('*.{php,txt}', GLOB_BRACE); print_r($files); /* 输出: Array ( [0] => phptest.php [1] => pi.php [2] => test.txt ) */
21. PHP系统常量
行号 (__LINE__); 文件 (__FILE__); 目录 (__DIR__); 函数名 (__FUNCTION__); 类名 (__CLASS__); 方法名 (__METHOD__); 名字空间 (__NAMESPACE__);
22. 生成唯一的ID
<?php // 前缀 echo uniqid('foo_'); /* 输出 foo_4bd67d6cd8b8f */
23.字符串压缩
<?php $string = "abcdefg..."; $compressed = gzcompress($string); echo "Original size: ". strlen($string)."\r\n"; /* 输出原始大小 Original size: 800 */ echo "Compressed size: ". strlen($compressed)."\r\n"; /* 输出压缩后的大小 Compressed size: 418 */ // 解压缩 $original = gzuncompress($compressed);
评论