首页 > 编程技术 > php

php ob_start(ob_gzhandler)进行网页压缩

发布时间:2016-11-25 17:08

本文章来总结关于php ob_start(ob_gzhandler)进行网页压缩传输的实现有需要的朋友可参考一下。

先来看ob_start用法

使用PHP ob_start()函数打开browser的cache,这样可以保证cache的内容在你调用flush(),ob_end_flush()(或程序执行完毕)之前不会被输出

 代码如下 复制代码

<?php  

ob_start(); //打开缓冲区  
phpinfo(); //使用phpinfo函数  
$info=ob_get_contents(); //得到缓冲区的内容并且赋值给$info  
$file=fopen(’info.txt’,'w’); //打开文件info.txt  
fwrite($file,$info); //写入信息到info.txt  
fclose($file); //关闭文件info.txt  

?> 

PHP ob_start()函数一个很大的特点;也可以使用ob_start的参数,在cache被写入后,然后自动运行命令,比如ob_start(”ob_gzhandler”);而我们最常用的做法是用ob_get_contents()得到cache中的内容

面的代码是一个压缩网页的例子,我 们利用ob_gzip函数,使用ob_start将输出内容压缩后放到“缓冲区”后再输出。

 代码如下 复制代码

//启用压缩   
if(function_exists('ob_gzip'))   
{   
   ob_start('ob_gzip');   
}   
//准备一些待压缩的内容   
for($i=0; $i<100; $i++)   
{   
    echo('这里是测试内容 <br>');   
}   
//输出压缩成果   
ob_end_flush();   
  
  
//这是ob_gzip压缩函数   
function ob_gzip ($content)   
{   
    if( !headers_sent()  && extension_loaded ("zlib")  && strstr ( $_SERVER["HTTP_ACCEPT_ENCODING"], "gzip")){   
        $content = gzencode($content,9);   
        header ("Content- Encoding: gzip");   
        header ("Vary: Accept- Encoding");   
        header ("Content- Length: ".strlen ($content));   
    }   
    return ($content) ;   
}

在php中foreach 语句用于循环遍历数组,每进行一次循环,当前数组元素的值就会被赋值给 value 变量(数组指针会逐一地向下移动)

 代码如下 复制代码

<?php
/* php foreach循环简单例子 */   
$a = array('a'=>'网上','b'=>'朋友','c'=>'其它',);   
// 这是一个hash数组,我们现在把内容输出   
foreach ($a as $key => $value) {   
    echo $key . '->' . $value . '<br>';   
}   
?>  
<?php
$a = array('a'=>'网上','b'=>'朋友','c'=>'其它',);


开始运行foreach第一次,这时 $key='a';$value='网上';
输出后第二次运行 这时 $key='b';$value='朋友';
输出后第三次运行 这时 $key='c';$value='其它';
这时数组已经到了尾部,退出循环


 代码如下 复制代码

<?

1,"two"=>2,"three"=>3,"four"=>4);
foreach($array1 as $key=>$value)
{echo "KEY:$key value: $value n";}

$array2=array(5,6,7,8);
foreach($array2 as &$value)
{
$value=$value*2;
echo "$valuen";
}

?>

结果是

$array1=array("one"=>1,”two”=>2,”three”=>3,”four”=>4);
foreach($array1 as $key=>$value)
{echo “KEY:$key value: $value n”;}

$array2=array(5,6,7,8);
foreach($array2 as &$value)
{
$value=$value*2;
echo “$valuen”;
}

?>

为了便于理解,我们假定这里的$array是一个一维的相关数组,$key是数组的索引,$value是这个索引的值,它们的名字可以随意,之所以叫$key和$value是为了便于理解。为了能让你更好的理解foreach的工作过程,我们来创建一个数组:
$array = array('first'=>'ibm','second','hp');
现在我们模拟PHP服务用foreach对$array进行遍历:

 代码如下 复制代码
foreach ($array as $key=>$value)
{
echo $key.'=>'$value;
}

第一次循环,$key = 'first',$value = 'ibm',这个时候,实际foreach对$array执行了一个我们看不见的操作

foreach循环中使用引用要注意

发现了一个容易出错,但是不懂得原理却解释不明白的问题

 代码如下 复制代码
foreach ($array as &$row) {
$row = explode(‘/’, $row);
}
foreach ($array as $row) {
//do something
}

这么写,在第二个循环会出逻辑错误,加入第二个循环中do something的地方是输出$row,循环到最后一个的时候的输出是倒数第二个元素,而不是最后一个

要这么写

 代码如下 复制代码

foreach ($array as &$row) {
$row = explode(‘/’, $row);
}
unset($row);
foreach ($array as $row) {
//do something
}

或者第一个循环这么写

foreach ($array as $key => $row) {
$array[$key] = explode(‘/’, $row);
}

在php中我们要返回数据集初始位置mysql_data_seek函数即可实现,下面看代码
 代码如下 复制代码

<?

// Start snipit 1

$sql = "SELECT * from <table>";
$result = mysql_query($sql);

while ($row = mysql_fetch_assoc($result)) {
         // do stuff with $row
}

mysql_data_seek($result, 0); //关键是这儿

while ($row = mysql_fetch_assoc($result)) {
         // do other stuff with $row
}
?>

定义和用法
mysql_data_seek() 函数移动内部结果的指针。

语法
mysql_data_seek(data,row)参数 描述
data 必需。返回类型为 resource 的结果集。该结果集从 mysql_query() 的调用中得到。
row 必需。想要设定的新的结果集指针的行数。0 指示第一个记录。

说明
mysql_data_seek() 将 data 参数指定的 MySQL 结果内部的行指针移动到指定的行号。

接着调用 mysql_fetch_row() 将返回那一行。

row 从 0 开始。row 的取值范围应该从 0 到 mysql_num_rows - 1。

但是如果结果集为空(mysql_num_rows() == 0),要将指针移动到 0 会失败并发出 E_WARNING 级的错误,mysql_data_seek() 将返回 false。

返回值
如果成功则返回 true,失败则返回 false。

php中is_dir,is_file,file_exists函数性能分析 ,我们从各方法来总结了三个函数的用法在具体的地方,有需要的同学可参考一下。

php中is_dir,is_file,file_exists函数性能分析
php,is_dir,is_file,file_exists

很显然file_exists是受了asp的影响,因为asp不但有fileExists还有folderExists,driverExists,那么PHP中file_exists是什么意思呢?

PHP的 file_exists = is_dir + is_file

它既可以判断文件是否存在,又可以判断目录是否存在。但这样一个全面的函数执行效率非常低,就像asp中request不指定是form,还是get,cookies,所以结论是:

◦如果要判断目录是否存在,请用独立函数 is_dir(directory)
◦如果要判断文件是否存在,请用独立函数 is_file(filepath)
--------------------------------------------------------------------------------------

is_file 只判断文件是否存在;
file_exists 判断文件是否存在或者是目录是否存在;
is_dir 判断目录是否存在;

查看手册,虽然这两个函数的结果都会被缓存,但是is_file却快了N倍。
还有一个值得注意的:
文件存在的情况下,is_file比file_exists要快N倍;
文件不存在的情况下,is_file比file_exists要慢;
结论是,file_exits函数并不会因为该文件是否真的存在而影响速度,但是is_file影响就大了

 

看了这篇PHP中file_exists与is_file,is_dir的区别的说法基本明白,PHP的 file_exists = is_dir + is_file。

写程序验证一下:

分别执行1000次,记录所需时间。

 代码如下 复制代码

文件存在(当前目录)
is_file:0.4570ms
file_exists:2.0640ms

文件存在(绝对路径3层/www/hx/a/)
is_file:0.4909ms
file_exists:3.3500ms

文件存在(绝对路径5层/www/hx/a/b/c/)
is_file:0.4961ms
file_exists:4.2100ms

文件不存在(当前目录)
is_file:2.0170ms
file_exists:1.9848ms

文件不存在(绝对路径5层/www/hx/a/b/c/)
is_file:4.1909ms
file_exists:4.1502ms

目录存在
file_exists:2.9271ms
is_dir:0.4601ms
目录不存在
file_exists:2.9719ms
is_dir:2.9359ms

is_file($file)
file_exists($file)
当$file是目录时,is_file返回false,file_exists返回true


文件存在的情况下,is_file比file_exists要快得多;
要检测文件所在的目录越深,速度差越多,但至少快4倍。

文件不存在的情况下,is_file比file_exists要慢一点点,但可以忽略不计。

目录存在的情况下,is_dir比file_exists要快得多;
目录不存在的情况下,is_dir比file_exists要慢一点点,但可以忽略不计。

结论:
如果要判断文件是否存在,用函数 is_file(),
如果要判断目录是否存在,用函数 is_dir(),
好像没地方需要用file_exists了,不确定传入的参数是文件还是目录的时候用?

要按多维数组中某个元素进行排序,在PHP中也是非常容易实现的,一个函数调用一个回调函数就搞定了,也可以php自带的函数

如array_multisort($a,$b),$a,$b是两个数组,如果排序之后,$a数组的第3个元素被排到了第一位,那么$b的第三个元素不管他在$b中的大小都会排在第一位。看看下边的程序运行结果:

 代码如下 复制代码

<?php
$a =array(100,80,50,10,0);
$b = array("c","f","q","e","z");
array_multisort($a,$b);
var_dump($a);
var_dump($b);
?>

运行结果:

 代码如下 复制代码

array(5) { [0]=> int(0) [1]=> int(10) [2]=> int(50) [3]=> int(80) [4]=> int(100) }
array(5) { [0]=> string(1) “z” [1]=> string(1) “e” [2]=> string(1) “q” [3]=> string(1) “f” [4]=> string(1) “c” }

自定义函数实现排序

 代码如下 复制代码

$arr = array(    
 
    'index'=>array( 'name'=>'首页','order'=>3),
 
    'intro'=>array( 'name'=>'企业概况','order'=>2),
 
    'news'=>array( 'name'=>'新闻动态','order'=>1 ),
 
    'product'=>array( 'name'=>'产品中心','order'=>4 ),
 
    'message'=>array( 'name'=>'访客留言','order'=>7 ),
 
    'position'=>array( 'name'=>'人才招聘','order'=>6),
 
    'contact'=>array( 'name'=>'联系我们','order'=> 5 )
 
);
 
uasort($arr, 'cmp');
 
public function cmp($a, $b){
 
   return $a['order'] - $b['order'];
 
}

这时$arr就是以order大小排序了,呵呵……

标签:[!--infotagslink--]

您可能感兴趣的文章: