网站首页php
PHP Coding Tips代码优化备忘录
发布时间:2016-03-10 20:03:35编辑:阅读(6166)
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);
评论