php+Smarty的缓存操作

 更新时间:2016年11月25日 16:11  点击:1379
一、使用缓存
要开启smarty的缓存,只需将caching设为true,并指定cache_dir即可.
使用cache_lefetime指定缓存生存时间,单位为秒
要对相同页面生成多个不同的缓存,在display或fetch中加入第二参数cache_id,如$smarty->display(''index.tpl'',$my_cache_id);此特性可用于对不同的$_GET进行不同的缓存
二、清除缓存

clear_all_cache();//清除所有缓存
clear_cache(''index.tpl'');//清除index.tpl的缓存
clear_cache(''index.tpl'',cache_id);//清除指定id的缓存

三、使用自定义缓存方式

设置cache_handler_func使用自定义的函数处理缓存
如:
$smarty->cache_handler_func = "myCache";
function myCache($action, &$smarty_obj, &$cache_content, $tpl_file=null, $cache_id=null, $compile_id=null){
}
该函数的一般是根椐$action来判断缓存当前操作:
switch($action){
case "read"://读取缓存内容
case "write"://写入缓存
case "clear"://清空
}
一般使用md5($tpl_file.$cache_id.$compile_id)作为唯一的cache_id
如果需要,可使用gzcompress和gzuncompress来压缩和解压
四、局部关闭缓存

要在某些区域使缓存失效(只对需要的缓存),有几种方法:
inser:
定义一个inser标签要使用的处理函数,函数名格式为:insert_xx(array $params, object &$smarty)其中的xx是insert的name,也就是说,如果你定义的函数为insert_abc,则模板中使用方法为{insert name=''abc''}
参数通过$params传入
也可以做成insert插件,文件名命名为:insert.xx.php,函数命名为:smarty_insert_aa($params,&$smarty),xx定义同上
register_block:
定义一个block:smarty_block_name($params,$content, &$smarty){return $content;} //name表示区域名
注册block:$smarty->register_block(''name'', ''smarty_block_name'', false); //第三参数false表示该区域不被缓存
模板写法:{name}内容{/name}
写成block插件:
1)定义一件插件函数:block.cacheless.php,放在smarty的plugins目录
block.cacheless.php的内容如下:



2) 编写程序及模板
示例程序:testCacheLess.php



所用的模板:cache.tpl

已经缓存的:{$smarty.now}
{cacheless}
没有缓存的:{$smarty.now}
{/cacheless}


关于模板中部分不被缓存的解决办法:

smarty提供了强大的缓存功能。但有时我们并不希望整篇文档都被缓存,而是有选择的缓存某一部分内容或某一部分内容不被缓存。例如你在页面上端使用一个带有广告条位置的模板,广告条可以包含任何HTML、图象、FLASH等混合信息. 因此这里不能使用一个静态的链接,同时我们也不希望该广告条被缓存. 这就需要在 insert 函数指定,同时需要一个函数取广告条的内容信息。smarty也提供了这种缓存控制能力。

我们可以使用{insert}使模板的一部分不被缓存

可以使用$smarty->register_function($params,&$smarty)阻止插件从缓存中输出,

还可以使用$smarty->register_block($params,&$smarty)使整篇页面中的某一块不被缓存。

下面我们真对一个简单需求,分别说明这三种控制缓存输出的方法。

需求:被缓存的文档中当前时间不被缓存,随每次刷新而变化。
<

    PHP 语言从诞生起,就具有了很好的面向过程编程的特性。只是在其进化过程中才逐渐加强了面向对象的特性,直到 PHP5.0,也才接近完善。一般来说,PHP 的初学者和从 ASP 转向 PHP 开发的程序员比较偏向于面向过程编程,因为教科书和大量的参考书就是这样教的。

    但是随着 PHP 语言的发展和编程技术的进步,即使是 PHP 开发人员,也应当向面向对象编程进化!因为随着 PHP 版本的升级,PHP 也在寻求向企业开发市场发展,将来的编程会越来越复杂。再者,为了解决目前大量的重复开发和代码质量低下问题,面向对象是个很好的解决方案。比如目前流行的 PEAR、Smarty、PHPlib 等 PHP 轻型函数库,都是采用 OOP 的方法实现。还有 Zend Framework 等面向对象的应用级编程框架,都是面向对象编程的典范,在该框架下编程,完全采用面向对象编程的风格。

    所以,无论是考虑 PHP 的本身及其发展,还是考虑到程序员编程思维的培养,及其职业生涯的发展,面向对象的编程都是一个大方向。特别是对目前 PHP 的编程现状,我特别推荐大家站在面向对象一边,面向对象编程才是发展出路所在。

    张庆(网眼)
    网眼视界:http://blog.why100000.com
    2008-3-28 



<

PHP 5.3 介绍
PHP 
2008 魁北克- Ilia Alshanetsky


 
. 新版本的特性

* 兼职老版本下的代码
* 重点主要放在现有的功能的改进
* 更少的bug
* 更快的发布周期


1. 命名空间(Namespaces)

* PHP5.3最大的新功能
* 完全支持名字空间特征
* 大部分的功能的执行在编译时
* 简化命名惯例

1) 更清晰的代码

    不使用 Namespaces
    
function MY_wrapper() {}
    
class MY_DB {}
    
define(''MY_COMM_STR'', '''');

   
    MY_wrapper();
    
new MY_DB();
    MY_COMM_STR;

2) 使用 Namespaces
   
    namespace MY;
   
    
function wrapper() {}
   
    
class DB { }
   
    
const CONN_STR = '''';
           
   
    
use MY AS MY;
   
    wrapper();
   
    
new DB();
   
    CONN_STR;
   


3) 一个文件中多个名字空间
   
    namespace LIB;
   
    
class MYSQL {}
    
class SQLite {}
   
    
$b = new SQLite(;
   
    namespace LIB_EXTRA;
   
    
class MScrypt {}
   
    
$a new MScrypt();
   
    
var_dump(
        
get_class($a),
        
get_class($b)
    };
   
    
// result:
    // string(18) "LIB_EXTRA::MScrypt"
    // string(11) "LIB::SQLite"






4) 名字空间的层级

    namespace foo;
   
    
function strlen($foo) { return htmlspecialchars($foo); }
   
    
echo strlen("test"); // test
    echo ::strlen("test"// 4
    echo namespace::strlen("test"); // test
   
    
* function, class 和 constant 引用在一个名字空间中首先指向这个名字空间, 其次才是一个全局的范围


5) 名字空间 & 自动引入


    
function __autoload($var) { var_dump($var); } // LIB::foo
    require "./ns.php";
    
/**
    <?php
     namespace LIB;
     new foo();
    ?>
    
*/

* __autoload() 将处理为和名字空间的类名一起。
* autoload 仅在 class 不在名字空间和全局范围内存在时触发。
* __autoload() 声明在一个名字空间中将不别调用!




6) 其他的名字空间的语法技巧

    namespace really
::long::pointlessly::verbose::ns;
   
    __NAMESPACE__; 
// 当前的名字空间名称
   
    
class a {}
   
    
get_classnew a() ); // really::long::pointlessly::verbose::ns::abs
   
    
use really::long::pointlessly::verbose::ns::AS b; // 从一个名字空间引用class

   


2. 改进的性能
* md5() 速度提高了大概10-15%
* 引擎中更好的堆栈实现
* 常量移到只读内存区
* 改进Exception处理(更简单 & 更少的代码)
* 调用 (require/include)_once 去掉了使用open(2)(linux下的c函数)
* 使用gcc4编译的二进制更小更快

整体性能提高 
5-15%



3. 新的语言特性


1) __DIR__

* 引入 __DIR__ magic常量 定位脚本的目录

    
echo dirname(__FILE__); // < PHP 5.3
   
    
/* vs */
   
    
echo __DIR__; // >= 5.3


2?:  操作符
* 允许从2个值的or/and表达式快速的获取一个非空的值
   
    
$a = true ?: false// true;
    $a = false ?: true// true;
    $a = "" ?: 1// 1
    $a = 0 ?: 2// 2
    $a = array() ?: array(1); // array(1);
    $a = strlen(""?: strlen("a"); // 1
   



3) __callStatic()
   
    
* 等价于 __call() , 但它是为调用静态方法准备的
   
    
class helper
    {
        
static function __callStatic($name, $args){
            
echo $name.''(''.implode('','' $args).'')'';
        }       
    }
   
    helper
::test("foo", "bar"); // test(foo,bar);


// 动态的函数/方法调用有点慢...

 
 
4) 动态的调用静态方法
 
* php 现在允许 动态的调用静态的方法
   
    
class helper
    {
        
static function foo(){
            
echo __METHOD__;`
        }   
    }
   
    
$a = "helper";
    
$b = "foo";
   
    
$a::$b(); // helper::foo

// 动态的函数/方法调用有点慢...


5) 延迟静态绑定

* 静态处理从编译时延迟到执行时
   
    
class A
    {
        
public static function whoami(){
            
echo __CLASS__;   
        }
       
        
public static function identity(){
            self
::whoami();   
        }
    }
   
    
class B extends A
    {
        
public static function whoami(){
            
echo __CLASS__;
        }
    }
   
    B
::identity(); // A <-- php < 5.3
   
   
    
class A
    {
        
public static function whoami(){
            
echo __CLASS__;   
        }
       
        
public static function identity(){
            
static::whoami();   
        }
    }
   
    
class B extends A
    {
        
public static function whoami(){
            
echo __CLASS__;
        }
    }
   
    B
::identity(); // B <-- php >= 5.3
   

* 小心使用操作码缓存,没有向后兼容



6) MySQLInd

* 特殊的,高速的专门为PHP设计的MySQL调用库接口




* 更好的性能
* 内存的使用优化
* 内置的驱动(不是适应性的再次扩展)
* Many future options due to tight integration with PHP
* 目前还没有PDO_MySQL 支持 mysql(i) only for now





7) INI Magic

* CGI/FastCGI 支持".htaccess" 形式的INI控制
* 用户可以自己设定每个目录的INI在php.ini中通过[PATH=/var/www/domain.com]设定
* 优化错误处理
* 允许用户使用INI变量和常量任何定义的INI文件中
* 其他几个小的优化


    用户自定义的php
.ini(.htaccess) 文件名. 默认为".user.ini"
    user_ini
.filename = ".user.ini"


禁止这个特性 设置这个选项为空值


    用户自定义php
.ini 的缓存失效期(time-to-live) 秒数. 默认is 300s (5分钟)
    user_ini
.cache_ttl = 300s
   
    [PATH
=/var/www/domain.com]
    variables_order 
= GPC
    safe_mode 
= 1

    [my varibles]
    somevar 
= "1234"
    anothervar 
= ${somevar}    ; anothervar == somevar

    [ini arrays]
    foo[bar] 
= 1
    foo[
123= 2
    foo[] 
= 3



8) 扩展的 OpenSSL 函数

* 使用 OpenSSL Digest 函数

    
foreach (openssl_get_md_methods() as $d) {// MD4, MD5, SHA512... (12 all in all)
        echo $d. " - ". openssl_digest("foo", "md5"); // acbd18db4cc2f85cedef654fccc4a4d8
    }

* 使用 OpenSSL 加密函数

    
// BF-CBC, AES-256 CFB1... (54 all in all)
    foreach(openssl_get_cipher_methods() as $v) {
        
$val = openssl_encrypt("value", $v, "secret");
        openssl_decrypt(
$val, $v, "secret"); // value
    }


* 扩展的 openssl_pkey_new() 和 openssl_pkey_get_details()
函数 允许访问 内部的 DSA
, RSA 和 DH 密匙.


其目标在PHP中实现一个简单的OpenId


 
9) SPL(Standard PHP Library) 优化

* 优化嵌套的目录迭代次数由文件系统迭代

* 引入 GlobIterator

* 各种各样的数据结构类: 双链表, 堆栈, 队列, 堆, 小型堆, 大型堆, 优先级队列
 

* 其他的很绕口的一些特征


10) 时间处理进行扩展了和添加

* 可控制的 strtotime() 由 date_create_from_format()实现
   
    
$date = strtotime("08-01-07 00:00:00");
    
var_dump(date("Y-m-d", $date)); // string(10) "2008-01-07"
    $date = date_create_from_format("m-d-y", "08-01-07");
    
var_dump($date->format(''Y-m-d'')); // string(10) "2007-08-01"

* 添加了 date_get_last_errors(),并且返回时间语法分析的错误和警告
    
array(4) {
        [
"warning_count"=> int(0)
        [
"warnings"=> array(0) { }
        [
"error_count"=> int(2)
        [
"errors"]=>
            
array(2) {
                [
2]=> string(40"The separation symbol could not be found"
                [
6]=> string(13"Trailing data"
            }
    }


 
11) getopt() 优化

* 影响 Windows 平台

* 本地的执行不依赖于本地getopt()实现.

* 跨平台支持长选项 (--option)
    
// input: --a=foo --b --c
    var_dump(getopt("", array("a:","b::","c")));
    
/* output: array(3) {
        ["a"]=>
        string(3) "foo"
        ["b"]=>
        bool(false)
        ["c"]=>
        bool(false)
    } 
*/


 
12) XSLT Profiling
* 引入 Xslt Profiling 通过 setProfiling()实现

    
$xslt = new xsltprocessor();
    
$xslt->importStylesheet($xml);
    
$xslt->setProfiling("/tmp/profile.txt");
    
$xslt->transformToXml($dom);
   
    Resulting In
:
    
number         match     name     mode     Calls     Tot 100us Avg
        
0         date                         5         58       11
                    Total                     
5         58


 
13) E_DEPRECATED 标记
* 怎么样将一个php发行为一个没有错误的模式? 废弃

* E_DEPRECATED用来指定废弃的功能,或许未来的版本中会消除。


 
14) 垃圾回收器
* 为复杂和长时间运行脚本的执行结束周期释放内存的清理
 
        gc_enable(); 
// 允许垃圾回收
        var_dump(gc_enabled()); // true
        var_dump(gc_collect_cycles()); // 某个元素的清理
        gc_disable(); // 禁止垃圾回收
       
 
15) NOWDOC
* 一个 HEREDOC 不再进行转译

        HEREDOC
    
$foo = <<<ONE
    this is 
$fubar
    ONE;
    
/* string(10) "this is" */
   
        NOWDOC
    
$bar = <<<‘TWO’
    this is 
$fubar
    TWO;
    
/* string(16) "this is $fubar" */       
       

4. 其他优化
* SQLite 升级到 3.5.6
* 40 多个bug 被修复
* CGI/FastCGI SAPI 优化
* 各种流的优化
* 未来更多的优化










 


<
因为创建PYTHON中国(www.okpython.com)和推广PYTHON,所以一直没时间去研究PHP5的特性,现在终于有时间了。
今天说下__autoload函数的功能:
说明:自动加载类文件到本文件。
我们在用PHP4的时候一般用类的过程应该是这样的:
类文件加载require(类.php)
或include(类.php)
$test = new 类名
然后使用类方法。
php5以后就不用了,因为PHP5提供了一个简洁方便的方法,那就是autoload
具体举例说明:

test.php类文件(用与自动加载)
代码:
<?PHP
class test{//类开始
    function echo_str(){print "this is test files";}

}//类结束
?>
testone.php文件
代码:
<?PHP
$a = new test;
$a->echo_str();
function __autoload(strtolower($className)){   //strtolower是自动转化为小写字母(当然你可以不用strtolower,因为php5会自动将其转化为小写的)
        require_once($className.".php");  //自动加载类文件,根据类的名称给予文件名(即为加载规则)
}
?>
运行testone.php,output  "this is test files"
本文原创文章,如若转载请注明出处.python中国www.okpython.com

< 发布日期:2008-03-01

更新日期:2008-03-04

受影响系统:

phpMyAdmin phpMyAdmin < 2.11.5

不受影响系统:

phpMyAdmin phpMyAdmin 2.11.5

描述:

BUGTRAQ ID: 28068


phpMyAdmin是用PHP编写的工具,用于通过WEB管理MySQL。


phpMyAdmin使用$_REQUEST而不是$_GET和$_POST变量作为其参数来源,并且在SQL查询中未经过滤便使用了参数,如果用户受骗访问了恶意网站的话,就可能导致SQL注入攻击。


phpMyAdmin:目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

http://prdownloads.sourceforge.net/phpmyadmin/phpMyAdmin-2.11.5-all-languages.tar.bz2?download

[!--infotagslink--]

相关文章

  • php svn操作类

    以前我们开发大型项目时都会用到svn来同步,因为开发产品的人过多,所以我们会利用软件来管理,今天发有一居然可以利用php来管理svn哦,好了看看吧。 代码如下 ...2016-11-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • IDEA中的clean,清除项目缓存图文教程

    这篇文章主要介绍了IDEA中的clean,清除项目缓存图文教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-25
  • C#操作config文件的具体方法

    这篇文章介绍了在C#中对config文件的操作,有需要的朋友可以参考一下...2020-06-25
  • python自动化办公操作PPT的实现

    这篇文章主要介绍了python自动化办公操作PPT的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-05
  • nodejs文件操作模块FS(File System)常用函数简明总结

    件系统操作相关的函数挺多的。首先可以分为两大类。一类是异步+回调的。 一类是同步的。在这里只对异步的进行整理,同步的只需要在函数名称后面加上Sync即可1. 首先是一类最常规的读写函数,函数名称和形式,应该是起源于C...2014-06-07
  • C#模拟window操作鼠标的方法

    这篇文章主要介绍了C#模拟window操作鼠标的方法,可实现模拟鼠标移动到固定位置后点击右键的功能,涉及鼠标常用事件的操作技巧,需要的朋友可以参考下...2020-06-25
  • 微信小程序手势操作之单触摸点与多触摸点

    这篇文章主要介绍了微信小程序手势操作之单触摸点与多触摸点的相关资料,需要的朋友可以参考下...2017-03-13
  • iOS蓝牙设备名称缓存问题的解决方法

    这篇文章主要给大家介绍了关于iOS蓝牙设备名称缓存问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • python中字符串最常用的十三个处理操作记录

    这篇文章主要给大家介绍了关于python中字符串最常用的13个处理操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-09
  • AngularJS实现Model缓存的方式

    这篇文章主要介绍了AngularJS实现Model缓存的方式,分享了多种AngularJS实现Model缓存的方法,感兴趣的小伙伴们可以参考一下...2016-02-05
  • Nodejs下DNS缓存问题浅析

    本文给大家一起探讨nodejs下dns的缓存问题,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧...2016-11-22
  • @CacheEvict + redis实现批量删除缓存

    这篇文章主要介绍了@CacheEvict + redis实现批量删除缓存方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-12
  • python怎么删除缓存文件

    在本篇文章里小编给大家整理的是一篇关于python删除缓存文件方法,需要的朋友们可以学习下。...2020-07-19
  • js操作XML文件的实现方法兼容IE与FireFox

    下面小编就为大家带来一篇js操作XML文件的实现方法兼容IE与FireFox。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-07-01
  • IIS7、iis7.5中禁止缓存单个静态文件的配置方法

    这篇文章主要介绍了IIS7、iis7.5中禁止缓存单个静态文件的配置方法,需要的朋友可以参考下...2017-07-06
  • C# 模拟浏览器并自动操作的实例代码

    这篇文章主要介绍了C# 模拟浏览器并自动操作的实例代码,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-11-03
  • vue项目中禁用浏览器缓存配置案例

    这篇文章主要介绍了vue项目中禁用浏览器缓存配置案例,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-09-12
  • c#对字符串操作的技巧小结

    c#对字符串操作的技巧小结,需要的朋友可以参考一下...2020-06-25
  • C#操作PowerPoint的方法

    这篇文章主要介绍了C#操作PowerPoint的方法,涉及C#针对PowerPoint的打开、读取、播放等技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25