PHP压缩javascritp 与CSS的例子

 更新时间:2016年11月25日 15:41  点击:2281
有的网站有很多的 CSS 文件,如果将它们合并到一起并且进行 Gzip 压缩会减少请求和文件大小,有利于提高网站加载速度。为了方便我不推荐人工压缩和合并 CSS,而是使用 PHP 代码。

首先将所有 CSS 放到一个目录里,然后在此目录新建一个空的 CSS 文件,命名为 css.php(其实除了后缀命名随便)。

然后在 PHP 文件里放下边的代码:

 代码如下 复制代码

<?php
header('Content-type: text/css');
ob_start("compress");
function compress($buffer) {
 $buffer = preg_replace('!/*[^*]**+([^/][^*]**+)*/!', '', $buffer);
 $buffer = str_replace(array("rn", "r", "n", "t", '  ', '    ', '    '), '', $buffer);
 return $buffer;
}
/*include('colorpicker.css');
include('jquery-ui.css');
include('style.css');
include('switchery.min.css');*/
foreach( glob( "*.css" ) as $filename ) include $filename;
ob_end_flush();

引入 CSS 文件的代码换成引入这个 PHP 文件,例如:


<link rel='stylesheet' id='style-css'  href='/css/css.php' type='text/css' media='all' />


压缩多个css为一个css

 代码如下 复制代码

<?php
/*
Compress multiple CSS files into one and cache for an hour.

Use the same code for Javascript, but replace below "text/css" with "text/javascript" and of course make sure you include .js files instead of .css ones.
*/  www.111cn.net
ob_start("ob_gzhandler");
header("Content-type: text/css; charset: UTF-8");    
header("Expires: ".gmdate("D, d M Y H:i:s", time() + 60*60)." GMT");

include('somefile.css');
echo "nn";
include('anotherfile.css');
echo "nn";

ob_flush();


下面整理可压缩css,js的函数

 代码如下 复制代码


/**
 * 合并css样式为一个文件
 *
 * @param unknown_type $urls
 * @param unknown_type $path
 * @param unknown_type $tmpl_path
 * @return unknown
 */
function parse_css($urls,$path="./static/",$tmpl_path='.'){
    $url = md5(implode(',',$urls));
    $css_url = $path.$url.'.css';
    if(!file_exists($css_url)){
        if(!file_exists($path))mkdir($path,0777);
        $css_content = '';
        foreach($urls as $url){
         $css_content .= @file_get_contents($url);
        }
        $css_content = preg_replace("/[rn]/",'',$css_content);
        $css_content = str_replace("../images/",$tmpl_path."/images/",$css_content);
        @file_put_contents($css_url,$css_content);
    }
    return $css_url;
}
/**
 * 合并js www.111cn.net为一个文件
 *
 * @param unknown_type $urls
 * @param unknown_type $path
 * @return unknown
 */
function parse_script($urls,$path="./static/"){
    $url = md5(implode(',',$urls));
    $js_url = $path.$url.'.js';
    if(!file_exists($js_url))
    {
        if(!file_exists($path))mkdir($path,0777);
        require_once "inc/javascriptpacker.php";
        $js_content = '';
        foreach($urls as $url)
        {
            $append_content = @file_get_contents($url)."rn";
            $packer = new JavaScriptPacker($append_content);
            $append_content = $packer->pack();
            $js_content .= $append_content;
        }
        @file_put_contents($js_url,$js_content);
    }
    return $js_url;
}
前台
js调用
<?php
$pagejs[] = $tplurl."js/jump.js";
$jsfile=parse_script($pagejs,"./template/default/js/",".");
?>
<script type="text/javascript" src="<?=$jsfile?>"></script>
css调用
<?php
$pagecss[] = $tplurl."style/index_top.css";
$pagecss[] = $tplurl."style/index.css";
$cssfile=parse_css($pagecss,"./template/default/style/",".");
?>
<link rel="stylesheet" type="text/css" href="<?=$cssfile?>" />

PHP 文件里就包含了所有被压缩的 CSS 代码,而且可以自动引入 CSS 目录里的所有 CSS 文件,不用在新建 CSS 文件的时候再修改这个 PHP 文件。

对于cookies读写操作我们如果域名配置没配置好那么可能只有一个域名要使用,像www.111cn.net与111cn.net后者是包括前者的哦,下面来给大家举个例子。

今天本地调试,有个cookies死活都写不进去,环境如下:

域名:111cn.net

浏览器:chrome34

代码:

 代码如下 复制代码
header("Content-type: text/html; charset=utf-8");
if (isset($_COOKIE['test']))
{
    echo '获取到的cookies是:'.$_COOKIE['test'];
}
elseif (setcookie('test', 'okh', time() + 3600, '/', '.111cn.net'))
{
    echo '设置cookies:test';
}
else
{
    echo '什么都没有';
}

用111cn.net访问,上面这段代码在chrome下一直设置成功,但是却一直都没记录。找了半天原因,一朋友从手册上告诉我:

The domain that the cookie is available to. Setting the domain to ‘www.example.com’ will make the cookie available in the www subdomain and higher subdomains. Cookies available to a lower domain, such as ‘example.com’ will be available to higher subdomains, such as ‘www.example.com’. Older browsers still implementing the deprecated » RFC 2109 may require a leading . to match all subdomains.

于是我做了这么一个调整:

用www.111cn.net进行访问
修改之前的代码为
1
setcookie('test', 'okh', time() + 3600, '/', 'www.111cn.net')
这下正常设置,也正常记录了。
但是存在2个问题:

如何设置不带WWW的域名的cookies呢?比如:111cn.net
设置www.111cn.net虽然能在www.111cn.net下使用,但是却不能在111cn.net下使用,如何设置cookies使其通用呢?
通过求助,得知原因如下:
这个域名特殊。火狐、chrome不认为 www.111cn.net 是 111cn.net 的二级域名:

 代码如下 复制代码

var eTLDService = Components.classes["@mozilla.org/network/effective-tld-service;1"]
                    .getService(Components.interfaces.nsIEffectiveTLDService);
 
eTLDService.getBaseDomain(gBrowser.selectedTab.linkedBrowser.currentURI);
/*
www.111cn.net
*/

111cn.net 在 effective_tld_names.dat 文件中列出来了:


a.org
b.cn

原来是这么一个小问题,困扰了我一天,原本是为了方便,所以将这个域名作为自己本地开发用,结果出现这个情况,只好将111cn.net修改为1a.com

前端时间做一个APP后台时用户要求用户的评论以xx分钟前这种格式显示,给用户以良好的体验,于是笔者写了次函数。本函数主要是利用PHP计算两个时间之间的差值,通过差值来转换,虽然代码很简单,但是很实用。
 代码如下 复制代码
<?php
/**
 * 时间差计算
 *
 * @param Timestamp $time 时间差
 * @return String Time Elapsed
 * @author jakehu (http://www.111cn.net/)
 */
function time2Units ($time)
{
$year   = floor($time / 60 / 60 / 24 / 365);
$time  -= $year * 60 * 60 * 24 * 365;
$month  = floor($time / 60 / 60 / 24 / 30);
$time  -= $month * 60 * 60 * 24 * 30;
$week   = floor($time / 60 / 60 / 24 / 7);
$time  -= $week * 60 * 60 * 24 * 7;
$day    = floor($time / 60 / 60 / 24);
$time  -= $day * 60 * 60 * 24;
$hour   = floor($time / 60 / 60);
$time  -= $hour * 60 * 60;
$minute = floor($time / 60);
$time  -= $minute * 60;
$second = $time;
$elapse = '';
 
$unitArr = array('年前'  =>'year', '个月前'=>'month',  '周前'=>'week', '天前'=>'day',
'小时前'=>'hour', '分钟前'=>'minute', '秒前'=>'second'
);
 
foreach ( $unitArr as $cn => $u )
{
if ( $year > 0 ) {//大于一年显示年月日
$elapse = date('Y/m/d',time()-$time);
break;
}
else if ( $$u > 0 )
{
$elapse = $$u . $cn;
break;
}
}
 
return $elapse;
}
 
$past = 1390000000; //起点时间
$diff = time() - $past;//时间差
 
echo '发表于' . time2Units($diff) . '前';
?>
天偶然间发现水煮鱼中的PHP 中数组函数 isset 效率比 array_key_exists 更高是这么写的:

由于 isset 属于 php 中的语言结构,而 array_key_exists 是函数,所以 isset 更快。并且 isset 在其他语言中也存在,更具可读性。

顿时很是疑惑——什么,isset竟然不是函数?而至于处理效率isset更快,倒变得不重要了(至少我一直使用isset,几乎没有关注过array_key_exists,具体可以见文章)

PHP.net中,也被分在Variable handling 函数,但是其实在中间有这样一段话:

Note: 因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。

PHP里有echo、print、die、require等几个特殊的关键字,虽然它们用起来像是函数,但实际上更类似于if、while这样控制语句,而不是一个函数。也就是说,当解释器遇到:

print 'Hello world';
这样的一个表达式的时候,并不会把它转换成函数调用,而是直接映射到一系列预先定义好的操作。使用语言构成的时候可以加括号,也可以不加括号,但是使用函数的时候必须加括号。

可变函数可见:http://www.php.net/manual/zh/functions.variable-functions.php

$func = 'foo';
$func(); // This calls foo()
$func = 'bar';
$func('test'); // This calls bar()
$func = 'echoit';
$func('test'); // This calls echoit()
而如果

$func = 'print';
// 这样做会产生异常,因为print不是一个函数,而是语言的构成部分
$func('hello world');
这么写的话就会导致报错了。

 

在PHP源码里,关于isset是这么写的:


很明显不是函数的写法。
又长见识了。

注意这个类库有一个重名的叫phpThumb,只是大小写的差别,所以查找文档的时候千万注意。 在网站建设过程中,需要处理图片的地方多不胜数,用PHP的图片函数处理图片,十分繁琐。而且对新手来讲十分不好掌握。现在我们可以用PHPThumb类库来处理图片,包括,图片尺寸调整,图片截取,图片加水印,图片旋转等等功能

使用演示:

 代码如下 复制代码

//加载类库文件
require_once 'path/to/ThumbLib.inc.php';

//实例化类库,传入你要处理的图片的地址可以是网络地址,也可以是本地地址
$thumb = PhpThumbFactory::create('http://www.111cn.net/');

//把图片等比缩小到最大宽度 100px或者最高100px,当只输入一个参数的时候,是限制最宽的尺寸。
$thumb->resize(100, 100);

//把图片等比缩小到原来的百分数,比如50就是原来的50%。
$thumb->resizePercent(50);

//截取一个175px * 175px的图片,注意这个是截取,超出的部分直接裁切掉,不是强制改变尺寸。
$thumb->adaptiveResize(175, 175);

//从图片的中心计算,截取200px * 100px的图片。
$thumb->cropFromCenter(200, 100);

//截图,前两个参数分别是需要解出的图片的右上角的坐标X,Y。 后面两个参数是需要解出的图片宽,高。
$thumb->crop(100, 100, 300, 200);

//把图片顺时针反转180度
$thumb->rotateImageNDegrees(180);

//保存(生成)图片,你可以保存其他格式,详细参考文档
$thumb->save( 'NewPath/Of/image.jpg ' );

这个类库还有更多功能就不多做介绍了,如果你也在开发PHP网站过程中需要处理图片不妨阅读一下这个类库的文档,保证你处理图片很简单,再也不用和那十几个烦人的php图片处理函数打交道了!
 
 
 
另外一个强大的PHP图片缩略图类:phpThumb
该类除了缩放图片外,还能将图片转换成不同的格式输出(比如将GIF格式的图片输出为PNG格式),其特色功能还包括色彩、特效等
官方网址:http://phpthumb.sourceforge.net/
We’ll be using phpThumb , the open source PHP script to generate thumbnails on the fly.
Download and extract phpThumb to somewhere in your website folder. Now to use a rounded corner thumbnail of an image, simply use the img tag of HTML with src as

 代码如下 复制代码
<img src=”phpThumb.php?src=test.jpg&w=200&h=150&fltr[]=ric|20|20&f=png” />
Adjust the path to phpThumb according to where you place the phpThumb files.
<html>
<head>
</head>
<body>
    <img src="phpThumb/phpThumb.php?src=../images/test.jpg&w=400&fltr[]=fram|3|2|CC9966|333333|CCCCCC" alt="">
</body> 
</html>

 
一般只需要下面的文件就可以了
其实phpThumb的功能比我原先想象的要强大一些,下面把他的其他一些有用的参数列一下:
src:目标图片的地址
w:输出图片的宽度
h:输出图片的高度(如果不指定他将按w参数等比缩放)
q:输出如果是JPG格式的,可以规定它的输出质量
bg:输出时的背景(如果需要)
sw、sh、sx、sy:局部输出,宽高、起始位置
f:输出格式,可以为jpeg、png、gif、ico
sfn:输出gif动画中的某一帧
fltr[]:滤镜,可以有很多效果,包括锐化、模糊、旋翻转、水印、边框、遮照、色彩调整等

[!--infotagslink--]

相关文章