PHP缓冲ob_start和页面文件缓存

 更新时间:2016年11月25日 15:48  点击:2077
在php中缓存分为很多种,像ob_start ob_get_flush 这些函数是缓存技术是减轻服务器压力的,但他不能真正的减少服务器负载,我们可以利用页面缓存或文件缓存来真正的实现缓存技术哦。

ob_start ob_get_flush 这些函数是缓存技术的一种,是减轻服务器压力的,直到项目开发用到才知道混淆了和缓存的概念,
这些像ob_start ob_get_flush这些函数都是为了在编程中字符串输出到客户端上去为了延长时间而用到的技术,延迟输出(字符串先发送到缓冲区需要时在输出到浏览器),是一种输出技巧。最常见的应用是静态化技术(可以实现静态缓存):


把要输出代码的先保存到缓存区在用ob_get_contents();取得内容写入文件

php ob_start 与 ob_end_flush() 是 php 的缓冲输出函数。

ob_start([string output_callback])- 打开输出缓冲区,所有的输出信息不在直接发送到浏览器,而是保存在输出缓冲区里面,可选得回调函数用于处理输出结果信息。

ob_end_flush - 结束(发送)输出缓冲区的内容,关闭输出缓冲区。

php 输出东西,会保存在一个 php 维护的内存里,称为 buffer 也行,缓存也行,都是一个意思。然后当这个 buffer 满了,php 会自动往 web server 发送这些数据。

也就是说每次 echo,并不一定会输出东西,而是保存在 buffer 里。

ob_start() 的意思,可以理解为(但是实际上和我下面的说法有区别),这个 buffer 由 ob_ 系列函数来来控制,也就是,PHP 不会维护自己的 buffer,不会自动把buffer 的内容自动发送到 web server,直到你 ob_end() 或者类似的 ob 操作。

ob_函数一般用来捕获当前的输出,跟效率是没什么关系的。至于为什么捕获输出,原因很多,例如我捕捉输出,缓存到一个文件里,下次请求就可以直接读这个 cache 文件的内容作为输出了。

 代码如下 复制代码

ob_start(); 

2 内容 

3 echo ob_get_contents() ;

例子

 

 代码如下 复制代码
<?php
//打开缓冲区
ob_start();
?>
php页面的全部输出
<?php
//取得php页面输出的全部内容
$content = ob_get_contents();
//创建一个文件,并打开,准备写入
$fp = fopen(“1.html”, “w”);
//把php页面的内容全部写1.html
fwrite($fp, $content);
fclose($fp);
?>

而缓存是一个很大的概念,一般用来解决大型网站高负载问题,像下面雨中漫步讲的 就是一种缓存技术的实现,当然除了内存缓存还有文件、页面缓存,比如想uchome 中系统配置变量,一般不需要改变的设置生成文件是文件缓存,用到这些数据直接通过读取文件读取而不直接从数据库读取,这些都是为了避免再次查询数据减轻访问压力问题而设置的。

网上关于 PHP 缓存类的资料很多,不过这个类应该是我见过功能满足需求,但又无比简洁的一个。废话不多说,直接看代码吧!

使用说明:

1、实例化

 代码如下 复制代码

$cache = new Cache();

2、设置缓存时间和缓存目录

$cache = new Cache(60, '/any_other_path/');第一个参数是缓存秒数,第二个参数是缓存路径,根据需要配置。
默认情况下,缓存时间是 3600 秒,缓存目录是 cache/

3、读取缓存

 代码如下 复制代码

$value = $cache->get('data_key');4、写入缓存

$value = $cache->put('data_key', 'data_value');完整实例:

$cache = new Cache();

//从缓存从读取键值 $key 的数据
$values = $cache->get($key);

//如果没有缓存数据
if ($values == false) {
 //insert code here...
 //写入键值 $key 的数据
 $cache->put($key, $values);
} else {
 //insert code here...
}
Cache.class.php

<?php
class Cache {
 private $cache_path;//path for the cache
 private $cache_expire;//seconds that the cache expires

 //cache constructor, optional expiring time and cache path
 public function Cache($exp_time=3600,$path="cache/"){
  $this->cache_expire=$exp_time;
  $this->cache_path=$path;
 }

 //returns the filename for the cache
 private function fileName($key){
  return $this->cache_path.md5($key);
 }

 //creates new cache files with the given data, $key== name of the cache, data the info/values to store
 public function put($key, $data){
  $values = serialize($data);
  $filename = $this->fileName($key);
  $file = fopen($filename, 'w');
     if ($file){//able to create the file
         fwrite($file, $values);
         fclose($file);
     }
     else return false;
 }

 //returns cache for the given key
 public function get($key){
  $filename = $this->fileName($key);
  if (!file_exists($filename) || !is_readable($filename)){//can't read the cache
   return false;
  }
  if ( time() < (filemtime($filename) + $this->cache_expire) ) {//cache for the key not expired
   $file = fopen($filename, "r");// read data file
         if ($file){//able to open the file
             $data = fread($file, filesize($filename));
             fclose($file);
             return unserialize($data);//return the values
         }
         else return false;
  }
  else return false;//was expired you need to create new
  }
}
?>

下面我来介绍PHP strlen与mb_strlen判断字符串是纯英文/纯汉字/汉英混合,在php中UTF8每个汉字等于3个长度; GBK每个汉字等于2个长度;

利用以上汉字与英文的差异,我们就可以利用mb_strlen函数与strlen函数分别计算出两组长度数字,然后根据规律进行运算即可判断出字符串的类型了

先讲一下strlen与mb_strlen是求字符串长度的函数

 代码如下 复制代码

<?php

//测试时文件的编码方式要是UTF8

$str='中文a字1符';

echo strlen($str).'<br>';//14

echo mb_strlen($str,'utf8').'<br>';//6

echo mb_strlen($str,'gbk').'<br>';//8

echo mb_strlen($str,'gb2312').'<br>';//10

?> 


PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得 到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在 UTF-8编码下,一个汉字占3个字节)。

 代码如下 复制代码

<?php

/**

* PHP判断字符串纯汉字 OR 纯英文 OR 汉英混合

*/
echo '<meta charset="utf-8" />';

function utf8_str($str){

$mb = mb_strlen($str,'utf-8');

$st = strlen($str);

if($st==$mb)

return '纯英文';

if($st%$mb==0 && $st%3==0)

return '纯汉字';

return '汉英混合';

}

$str = '琼台博客';

echo '字符串:<span style="color:red">'.$str.'</span>,是<span style="color:red">'.utf8_str($str).'</span>';

?>


需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题

我们有时刚安装好环境是会碰到PHP中php_ldap.dll不能加载,以前以为php_ldap.dll是默认加载的后来知道,解压的php是需要我们手动配置的。

将winntphp.ini-dist改名为php.ini,并找到;Windows Extensions项将

 代码如下 复制代码

;extension=php_ldap.dll

改成

extension=php_ldap.dll

如果有其它的可以

 代码如下 复制代码

extension_dir = c:php4
extension=php_zlib.dll
extension =php_ldap.dll
extension =php_zlib.dll
extension =php_calendar.dll
extension =php_exif.dll
extension =php_ftp.dll
extension =php_mssql70.dll (这一项不要加,没有MSSQL7.0呀)
extension =php_imap.dll

然后从php5中 把libeay32.dll和ssleay32.dll文件 复制到

 代码如下 复制代码

C:/Windows/System/System32
C:/Windows/System
C:/Windows

这样就可以使用了php_ldap了,查看是否安装上php_ldap.dll文件,打开phpinfo().就可以查看是否安装成功!

一般情况下您只需将其放入以下目录后“系统找不到php_ldap.dll”或者“没有php_ldap.dll的问题”就可以得到解决:


当然,如果您的操作系统没有安装到C盘,只需将路径中的C换作安装操作系统的盘符即可。如果是一般的应用程序找不到DLL文件,可能只需要将下载到的DLL文件拷贝到您启动的应用程序所在的目录。

下面我来介绍一个Zend Framework中如何判断URL是否设置了转发,有需要学习的朋友可参考。

发送HTTP请求:

 

 代码如下 复制代码
 $client    = new Zend_Http_Client();
 $client->setUri($url);
 $client->setConfig(array('maxredirects' => 1));
 $response  = $client->request();
 if ( $response->isRedirect() ) {
    echo "设置了转发";
 } else {
    echo "没有设置转发";
 }

在这里如果不设置maxredirects参数,Zend默认的最大跳转数为5。就是在每次请求的时候,如果该地址设置了转发,他会读取转发到的新地址,然后再对这个地址发起请求。循环做这个操作,直至新地址没有设置转发或者循环超过了5次才会返回最后一次的请求数据。

这样的话,如果我只想获取某个域名是否设置了转发,那么就必须设置下maxredirects这个参数了。

•Zend Framework代码:

 

 代码如下 复制代码

public function request($method = null)
    {
        if (! $this->uri instanceof Zend_Uri_Http) {
            /** @see Zend_Http_Client_Exception */
            require_once 'Zend/Http/Client/Exception.php';
            throw new Zend_Http_Client_Exception('No valid URI has been passed to the client');
        }

        if ($method) {
            $this->setMethod($method);
        }
        $this->redirectCounter = 0;
        $response = null;

        // Make sure the adapter is loaded
        if ($this->adapter == null) {
            $this->setAdapter($this->config['adapter']);
        }

        // Send the first request. If redirected, continue.
        do {
            // Clone the URI and add the additional GET parameters to it
           //省略一万字
        } while ($this->redirectCounter < $this->config['maxredirects']);

        return $response;
    }

json 数据格式数据用得最多的是与js,flash实时交互用的哦,那么php怎么返回json数据格式呢,下面我来分析一下实例。

php代码

 代码如下 复制代码

<?php
header('Content-type: text/json');

$fruits = array (
    "fruits"  => array("a" => "orange", "b" => "banana", "c" => "apple"),
    "numbers" => array(1, 2, 3, 4, 5, 6),
    "holes"   => array("first", 5 => "second", "third")
);
echo json_encode($fruits);
?>

上面是英文是没有问题,如果是中文就会有问题,解决办法如下

Json 只支持 utf-8 编码,我认为是前端的 Javascript 也是 utf-8 的原因。

 代码如下 复制代码

<?php
$array = array
 (
   'title'=>iconv('gb2312','utf-8','这里是中文标题'),
  'body'=>'abcd...'
 );

echo json_encode($array);
?>

结果

 代码如下 复制代码

{"title":"u8fd9u91ccu662fu4e2du6587u6807u9898","body":"abcd..."}

利用js来分析这个函数

 代码如下 复制代码

$(function(){
     $('#send').click(function() {
          $.getJSON('json.php', function(data) {
              $('#resText').empty();
   var html = '';
   $.each( data  , function(commentIndex, comment) {
    html += '<div class="comment"><h6>' + comment['username'] + ':</h6><p class="para">' + comment['content'] + '</p></div>';
   })
  $('#resText').html(html);
         })
    })
})

注意在你的php输出js格式时我们必须是header('Content-type: text/json');这样的头部信息发送哦。

后面加一个完整的可解析中文乱码的问题程序

 代码如下 复制代码

<?php
/**************************************************************
 *
 * 使用特定function对数组中所有元素做处理
 * @param string &$array  要处理的字符串
 * @param string $function 要执行的函数
 * @return boolean $apply_to_keys_also  是否也应用到key上
 * @access public
 *
 *************************************************************/
function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
{
    static $recursive_counter = 0;
    if (++$recursive_counter > 1000) {
        die('possible deep recursion attack');
    }
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            arrayRecursive($array[$key], $function, $apply_to_keys_also);
        } else {
            $array[$key] = $function($value);
        }
 
        if ($apply_to_keys_also && is_string($key)) {
            $new_key = $function($key);
            if ($new_key != $key) {
                $array[$new_key] = $array[$key];
                unset($array[$key]);
            }
        }
    }
    $recursive_counter--;
}
 
/**************************************************************
 *
 * 将数组转换为JSON字符串(兼容中文)
 * @param array $array  要转换的数组
 * @return string  转换得到的json字符串
 * @access public
 *
 *************************************************************/
function JSON($array) {
 arrayRecursive($array, 'urlencode', true);
 $json = json_encode($array);
 return urldecode($json);
}

$array = array
       (
          'Name'=>'希亚',
          'Age'=>20
       );


echo JSON($array);
?>

[!--infotagslink--]

相关文章

  • php读取zip文件(删除文件,提取文件,增加文件)实例

    下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
  • Jupyter Notebook读取csv文件出现的问题及解决

    这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • Photoshop打开PSD文件空白怎么解决

    有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • C#实现HTTP下载文件的方法

    这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • SpringBoot实现excel文件生成和下载

    这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • php无刷新利用iframe实现页面无刷新上传文件(1/2)

    利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25
  • IDEA中的clean,清除项目缓存图文教程

    这篇文章主要介绍了IDEA中的clean,清除项目缓存图文教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-25
  • php批量替换内容或指定目录下所有文件内容

    要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
  • PHP文件上传一些小收获

    又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
  • AI源文件转photoshop图像变模糊问题解决教程

    今天小编在这里就来给photoshop的这一款软件的使用者们来说下AI源文件转photoshop图像变模糊问题的解决教程,各位想知道具体解决方法的使用者们,那么下面就快来跟着小编...2016-09-14
  • Zend studio文件注释模板设置方法

    步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • php文件上传你必须知道的几点

    本篇文章主要说明的是与php文件上传的相关配置的知识点。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,下面一一说明。打开php.ini配置文件找到File Upl...2015-10-21
  • ant design中upload组件上传大文件,显示进度条进度的实例

    这篇文章主要介绍了ant design中upload组件上传大文件,显示进度条进度的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-29
  • C#使用StreamWriter写入文件的方法

    这篇文章主要介绍了C#使用StreamWriter写入文件的方法,涉及C#中StreamWriter类操作文件的相关技巧,需要的朋友可以参考下...2020-06-25
  • php实现文件下载实例分享

    举一个案例:复制代码 代码如下:<?phpclass Downfile { function downserver($file_name){$file_path = "./img/".$file_name;//转码,文件名转为gb2312解决中文乱码$file_name = iconv("utf-8","gb2312",$file_name...2014-06-07
  • C#路径,文件,目录及IO常见操作汇总

    这篇文章主要介绍了C#路径,文件,目录及IO常见操作,较为详细的分析并汇总了C#关于路径,文件,目录及IO常见操作,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25