当前位置:  编程技术>php
本页文章导读:
    ▪php缓存并压缩动态页面的方法介绍      本文介绍下,在php编程中,缓存并压缩动态页面的方法,有需要的朋友参考下吧。 例子:   代码示例: <?php void ob_start(void); ?> 告诉PHP处理器把所有的输出重定向到一个内部的缓存(buff.........
    ▪php判断与去除数组中重复数据的方法      在php中判断数组有无重复,主要用到一个处理数组重复值的函数array_unique。 例如:   代码示例: <?php if (count($array) != count(array_unique($array))) {      echo '该数组有重复值';  } ?> PHP去.........
    ▪深入理解php中ob_flush与flush的区别      ob_flush/flush在php手册中的描述:都是刷新输出缓冲区, 并且还需要配套使用。 其实,它们的操作对象不同,有些情况下,flush根本不做什么事情。 ob_*系列函数, 是操作PHP本身的输出缓冲区. 所.........

[1]php缓存并压缩动态页面的方法介绍
    来源: 互联网  发布时间: 2013-12-24

本文介绍下,在php编程中,缓存并压缩动态页面的方法,有需要的朋友参考下吧。

例子:
 

代码示例:
<?php
void ob_start(void);
?>

告诉PHP处理器把所有的输出重定向到一个内部的缓存(buffer)中。在调用ob_start之前,没有输出会被送到浏览器去。
 

代码示例:
<?php
string ob_get_contents(void);
?>

该函数将“输出缓存”(output buffer)以字符串的形式返回。你可以调用该函数把积累下来的输出送到浏览器中。(仅在把buffering功能关闭之后!!)
 

代码示例:
<?php
int ob_get_length(void);
?>

返回缓存中的字符串的长度。
 

代码示例:
<?php
void ob_end_clean(void);
?>
 

清空输出缓存,并将输出缓存关闭。在缓存中的内容输出到浏览器之前,必须使用这个函数。
void 501([int flag])
用来打开/关闭隐含的flush动作开关(默认是关)。如果flush是开的,每次调用print/echo或是其它输出命令的时候,输出的内容会被立即送到浏览器端。

使用输出控制来压缩PHP输出
你必须使用PHP4里编译的Zlib扩展包来压缩输出。如果需要的话,可以查看PHP文档中有关Zlib包的安装指导。
首先,初始化输出缓存:
 

代码示例:
<?php
ob_start();
ob_implicit_flush(0);
?>

之后,用print, echo, 或其他你喜欢的方法生成所有输出内容,例如:
 

代码示例:
<?php
print("Hey this is a compressed output!");
?>

页面生成后,我们取回输出内容:
 

代码示例:
<?php
$contents = ob_get_contents();
ob_end_clean();
?>

之后,必须检测浏览器是否支持压缩数据。如果支持,浏览器会发给服务器端一个ACCEPT-ENCODEING HTTP头。我们只需检查$HTTP_ACCEPT_ENCODING变量中是否有“gzip,deflate”字串。
 

代码示例:
<?php
if(ereg('gzip, deflate',$HTTP_ACCEPT_ENCODING)) {
// 在这里生成 Gzip 压缩的内容
} else {
echo $contents;
}
?>

这种方法使用起来既简单又结构清晰。


    
[2]php判断与去除数组中重复数据的方法
    来源: 互联网  发布时间: 2013-12-24

在php中判断数组有无重复,主要用到一个处理数组重复值的函数array_unique。

例如:
 

代码示例:
<?php
if (count($array) != count(array_unique($array))) {  
   echo '该数组有重复值'; 
}
?>

PHP去除重复的数组数据
 

代码示例:

<?php
$input = array("a" => "green","", "red","b" => "green", "","blue", "red","c" => "witer","hello","witer");
//$result = array_unique($input); //去除重复元素
$result = a_array_unique($input);   //只留下单一元素
foreach($result as $aa)
{
echo $aa."<br />";
}
function multi_unique($array) {
   foreach ($array as $k=>$na)
       $new[$k] = serialize($na);
   $uniq = array_unique($new);
   foreach($uniq as $k=>$ser)
       $new1[$k] = unserialize($ser);
   return ($new1);
}

function a_array_unique($array)//写的比较好
{
   $out = array();
   foreach ($array as $key=>$value) {
       if (!in_array($value, $out))
{
           $out[$key] = $value;
       }
   }
   return $out;
}
?>
 

PHP数组去除重复项 有个内置函数array_unique (),但是php的 array_unique函数只适用于一维数组,对多维数组并不适用。
以下实现一个二维数组的array_unique函数:
 

代码示例:
<?php
function unique_arr($array2D,$stkeep=false,$ndformat=true)
{
    // 判断是否保留一级数组键 (一级数组键可以为非数字)
    if($stkeep) $stArr = array_keys()($array2D);
    // 判断是否保留二级数组键 (所有二级数组键必须相同)
    if($ndformat) $ndArr = array_keys(end($array2D));
    //降维,也可以用implode,将一维数组转换为用逗号连接的字符串
    foreach ($array2D as $v){
        $v = join(",",$v);
        $temp[] = $v;
    }
    //去掉重复的字符串,也就是重复的一维数组
    $temp = array_unique($temp);
    //再将拆开的数组重新组装
    foreach ($temp as $k => $v)
    {
        if($stkeep) $k = $stArr[$k];
        if($ndformat)
        {
            $tempArr = explode()(",",$v);
            foreach($tempArr as $ndkey => $ndval) $output[$k][$ndArr[$ndkey]] = $ndval;
        }
        else $output[$k] = explode(",",$v);
    }
    return $output;
}
?>
 

测试用例:
 

代码示例:
<?php
$array2D = array('first'=>array('title'=>'1111','date'=>'2222'),'second'=>array('title'=>'1111','date'=>'2222'),'third'=>array('title'=>'2222','date'=>'3333')); 
print_r($array2D); 
print_r(unique_arr($array2D,true));
?>

php判断数组中是否存在相同的值array_unique


    
[3]深入理解php中ob_flush与flush的区别
    来源: 互联网  发布时间: 2013-12-24

ob_flush/flush在php手册中的描述:都是刷新输出缓冲区, 并且还需要配套使用。
其实,它们的操作对象不同,有些情况下,flush根本不做什么事情。
ob_*系列函数, 是操作PHP本身的输出缓冲区.

所以, ob_flush是刷新PHP自身的缓冲区。而flush, 严格来讲, 这个只有在PHP做为apache的Module(handler或者filter)安装的时候, 才有实际作用. 它是刷新WebServer(可以认为特指apache)的缓冲区.

在apache module的sapi下, flush会通过调用sapi_module的flush成员函数指针, 间接的调用apache的api: ap_rflush刷新apache的输出缓冲区, 当然手册中也说了, 有一些apache的其他模块, 可能会改变这个动作的结果。

有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。
甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。
一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。

所以, 正确使用俩者的顺序是. 先ob_flush, 然后flush,如果Web服务器的操作系统是windows系统,那顺序颠倒或者不使用ob_flush()也不会出现问题。但是在Linux系统上就无法刷新输出缓冲。

当然, 在其他sapi下, 不调用flush也可以, 只不过为了保证你代码的可移植性, 建议配套使用.

根据以上描述,进行如下的测试:

测试1,
 

代码示例:
<?php
ob_start();
echo '1';
ob_flush();//输出php缓存并刷新
echo '2';
ob_flush();//输出php缓存并刷新
$cc = ob_get_contents();
ob_end_clean();
var_dump($cc);
?>

输出:
12string(0) ""

测试2:
 

代码示例:
<?php
ob_start();
echo '1';
flush();     //输出apache缓存并刷新
echo '2';
flush();     //输出apache缓存并刷新
$cc = ob_get_contents();
ob_end_clean();
var_dump($cc);
?>

输出:
string(2) "12"

测试3:
 

代码示例:
<?php
ob_start();
echo '1';
ob_flush();//输出php缓存并刷新
flush();//输出apache缓存并刷新
echo '2';
ob_flush();//输出php缓存并刷新
flush();//输出apache缓存并刷新
$cc = ob_get_contents();
ob_end_clean();
var_dump($cc);
?>

输出:
12string(0) ""

测试4,
 

代码示例:
<?php
ob_start();
echo '1';
flush();//输出apache缓存并刷新
ob_flush();//输出php缓存并刷新
echo '2';
flush();//输出apache缓存并刷新
ob_flush();//输出php缓存并刷新
$cc = ob_get_contents();
ob_end_clean();
var_dump($cc);
?>

输出:
12string(0) ""


    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3