网站首页php

PHP Coding Tips代码优化备忘录

发布时间:2016-03-10 20:03:35编辑:阅读(6449)

           

    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);





评论