PHP · 2012年1月16日 0

处理统一资源文件的cdn地址

在项目开发中,我们常常会使用到cdn,但是呢,浏览器针对单个域名只能同时发起2个请求,这就造成了空有大量带宽,但是处理时间却还是很长。
为了解决这个问题,常常会对cdn域名建立多个二级域名,来解决浏览器同域名限制2个并发的问题。

这里我使用的ci框架

 <?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

//如果未定义站点cdn二级路径名称,则自行定义之
if (!defined('SITE_CDN_NAME')) {
    define('SITE_CDN_NAME', 'app');
}
//如果未定义站点cdn域名,则自行定义之
if (!defined('SITE_CDN_DOMAIN')) {
    define('SITE_CDN_DOMAIN', '.xs8xs8.cn');
}

/**
 * 获取CDN相关资源地址
 */
class cdn{

    public function expires($min) {
        $expires = $min*60;
        header("Pragma: public");
        header("Cache-Control: maxage=" . $expires);
        header("Expires: " . gmdate("D, d M Y H:i:s", TIMESTAMP + $expires) . " GMT");
    }

    /**
     * 获取资源文件CDN路径
     * 例如:
     *     http://book.xs8.cn/static/js/jquery.js
     *     传递参数时需传递jquery.js
     * @param string $filename
     * @param bool $global 是否获取共用文件
     * @return string
     */
    public function get_resources($filename, $global = false) {
        $path_parts = pathinfo($filename);
        $ext = strtolower($path_parts['extension']);

        if (in_array($ext, array('js', 'css'))) {
            $method = 'get_cdn_' . $ext;
            return $this->$method($filename, $global);
        } else if (in_array($ext, array('jpg', 'jpeg', 'gif', 'png', 'bmp'))) {
            return $this->get_cdn_img($filename, $global);
        } else if (in_array($ext, array('swf', 'flv'))) {
            return $this->get_cdn_flash($filename, $global);
        } else {
            return SITE_URL . $path;
        }
    }

    private function get_cdn_pre_config($filename, $global) {
        $site_cdn_name = $global == false ? SITE_CDN_NAME : 'www';
        $url_pre = sprintf("%u", crc32(md5(strtolower($filename)))) % 4 + 1; //若要生成s1和s2则代码改为:%2+1
        return array('site_cdn_name' => $site_cdn_name, 'url_pre' => $url_pre);
    }

    public function get_cdn_js($filename, $global = false) {
        $cdn_config = $this->get_cdn_pre_config($filename, $global);

        $url = 'http://s' . $cdn_config['url_pre'] . SITE_CDN_DOMAIN . '/' . $cdn_config['site_cdn_name'] . '/js/' . $filename;
        return $url;
    }

    public function get_cdn_css($filename, $global = false) {
        $cdn_config = $this->get_cdn_pre_config($filename, $global);

        $url = 'http://s' . $cdn_config['url_pre'] . SITE_CDN_DOMAIN . '/' . $cdn_config['site_cdn_name'] . '/css/' . $filename;
        return $url;
    }

    public function get_cdn_img($filename, $global = false) {
        $cdn_config = $this->get_cdn_pre_config($filename, $global);

        $url = 'http://s' . $cdn_config['url_pre'] . SITE_CDN_DOMAIN . '/' . $cdn_config['site_cdn_name'] . '/images/' . $filename;
        return $url;
    }

    public function get_cdn_flash($filename, $global = false) {
        $cdn_config = $this->get_cdn_pre_config($filename, $global);

        $url = 'http://s' . $cdn_config['url_pre'] . SITE_CDN_DOMAIN . '/' . $cdn_config['site_cdn_name'] . '/flash/' . $filename;
        return $url;
    }

}