php 站点使用XML文件做配置类

 更新时间:2016年11月25日 16:11  点击:2010

要用到,在网站上找了一个,然后自己整理成一个类..

 



<?php
/*
*PHP获取和设置XML节点,用于修改和读取站点配置文件
*2008-4-3 
*LIQUAN
*eg.get config 
*$c = new Configuration(''config.xml'');
*echo( $c->TemplateDirectory." " );
*
* set config
* $c = new Configuration(''config.xml'');
* $c->TemplateDirectory=''test'';
* $c->save();
*/

class Configuration
{
 
private $configFile;
 
private $items=array();
 
 
//构造函数
 function __construct($configFile)
 {
   
$this->configFile=$configFile;
   
$this->parse();
 } 
 
 
//获取属性
 function __get($id)
 {
    
return $this->items[$id];
 }

    
//设置属性
 function __set($key,$value)
 {
    
$this->$items[$key]=$value;
 } 
    
 
//解析XML文件保存到数组
 function parse()
 {
    
$doc=new DOMDocument();
    
$doc->load($this->configFile);
    
$cn=$doc->getElementsByTagName(''config'');
    
$nodes=$cn->item(0)->getElementsByTagName(''*'');
    
foreach($nodes as $node)
    {
          
$this->items[$node->nodeName]=$node->nodeValue;
    }
 }

 
//保存XML文件
    function save()
    {
    
$doc=new DOMDocument();
       
$doc->formatOutput=true;

    
$r=$doc->createElement(''config'');
       
$doc->appendChild($r);

    
foreach($this->items as $k=>$v)
    {
         
$keyName=$doc->createElement($k);
         
$keyName->appendChild($doc->createTextNode($v));
   
$r->appendChild($keyName);
    }
    
copy($this->configFile,$this->configFile.".bak");
    
    
$doc->save($this->configFile);
    }

}


?>

 





1、int     filesize(string filename),获取文件的大小。对于2~4GB之间的文件,可以使用sprintf("%u",filesize($file))来处理

2、bool     unlink(string filename) ,删除一个文件

3、bool     rmdir(string dirname)      ,删除一个目录

4、bool     mkdir(string     pathname [,int     mode])      ,新建一个由lpathname指定的目录,mode是指操作权限,默认为0777,表示最大可能的访问权限

5、string basename(string path [,string suffix]) ,path参数给出一个文件的全路径字符串,函数返回基本的文件名。如文件名以suffix结束,则去掉这部分

6、string     dirname(string path) ,返回路径中的目录部分。

7、array     pathinfo(string path) ,返回文件路径的信息,包含以下的数组单元dirname,basename,extension.

8、string     realpath(string path)     ,返回规范化的绝对路径名

9、bool    copy( string     source     ,string dest) ,将文件从source复制到dest

                        例:copy("hello.txt","temp.php");

10、float    disk_free_space(string    directory )    ,返回目录中的可用空间

                        例:$df = disk_free_space("F:/");
                               echo $df.''<br>'';

    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 



< 一、使用缓存
要开启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 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 优化
* 各种流的优化
* 未来更多的优化










 


<
[!--infotagslink--]

相关文章

  • IntelliJ IDEA2021.1 配置大全(超详细教程)

    这篇文章主要介绍了IntelliJ IDEA2021.1 配置大全(超详细教程),需要的朋友可以参考下...2021-04-18
  • php读取zip文件(删除文件,提取文件,增加文件)实例

    下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
  • Windows VPN服务器配置图文教程 超详细版

    VPN可以虚拟出一个专用网络,让远处的计算机和你相当于处在同一个局域网中,而中间的数据也可以实现加密传输,用处很大,特别是在一些大公司,分公司处在不同的区域。...2016-01-27
  • Tomcat配置及如何在Eclipse中启动

    这篇文章主要介绍了Tomcat配置及如何在Eclipse中启动,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-04
  • Jupyter Notebook读取csv文件出现的问题及解决

    这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06
  • Laravel4安装配置的方法

    如果我们需要安培Laravel4的话最php最低要求要在php5.3.7版本并且我们需要把mcrypt与openss这两个扩展开启才可以,具体步骤我们参考下文。 前面我们介绍我了 com...2016-11-25
  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • 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
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
  • php无刷新利用iframe实现页面无刷新上传文件(1/2)

    利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25
  • 使用insertAfter()方法在现有元素后添加一个新元素

    复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31
  • php批量替换内容或指定目录下所有文件内容

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

    又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24