php中adodbzip类实例


Posted in PHP onDecember 08, 2014

本文实例讲述了php中adodbzip类程序代码。分享给大家供大家参考。具体如下:

<?php 

/** 

 * AdodbZip 1.1 

 *  

 * 代码示例: 

 * include_once 'AdodbZip.php'; 

 * $db = AdodbZip::init(NewADOConnection('mysql教程t')); 

 * echo $db->GetOne('SELECT NOW()'); 

 *  

 * 流程说明: 

 * 1. 如果$extract_dir里的Adodb程序文件存在,并且$zip_file不存在;则使用$extract_dir里的Adodb程序文件。 

 * 2. 如果$extract_dir里的Adodb程序文件存在,并且$zip_file存在;则比较修改时间,$extract_dir里的Adodb程序文件更新为较新的。 

 * 3. 如果$extract_dir里的Adodb程序文件不存在,并且$zip_file存在;则$extract_dir里的Adodb程序文件从$zip_file解压获得。 

 * 4. 如果 $extract_dir里的Adodb程序文件不存在,并且$zip_file不存在;则从$zip_url下载Adodb的Zip文件,并解压Adodb的程序文件。 

 * 其他说明: 

 * 1. $extract_dir可自定义。如果将Adodb的Zip包完全解压到此目录,则可忽略$zip_url和$zip_file设置项,这和传统使用Adodb一样。 

 * 2. $zip_file可自定义。如果$zip_file存在,则可忽略$zip_url,这样可整站统一使用$zip_file。 

 * 3. $zip_url可自定义。可随时修改Adodb版本,此时$zip_file和$extract_dir最好使用默认值,各版本互不干扰。 

 * 4. $server、$user、$pwd、$db可自定义。默认是mysql默认值,此项只有调用AdodbZip::init方法后才起效果。 

 * 5. $charset可自定义。默认不改变编码,此项只有调用AdodbZip::init方法后才起效果。 

 * 6. AdodbZip::init方法里可增加Adodb初始化值。 

 */ 

 

/** 

 * AdodbZip启动项 

 */ 

// 设定参数 

AdodbZip::$zip_url = 'http://c.net教程works-kr-1.dl.sourceforge.net/project/adodb/adodb-php5-only/adodb-509-for-php5/adodb509.zip'; //[设置项]Adodb的Zip文件下载地址,文件比较大建议先下载或者解压 

AdodbZip::$zip_file = sys_get_temp_dir () . preg_replace ( '/^.*/(adodb.*?.zip)$/i', 'adodb/$1', AdodbZip::$zip_url ); //[设置项]Adodb的Zip文件缓存位置 

AdodbZip::$entry_dir = 'adodb5'; 

AdodbZip::$extract_dir = sys_get_temp_dir () . 'adodb/' . AdodbZip::$entry_dir; //[设置项]Adodb程序文件缓存位置 

AdodbZip::$server = 'localhost'; //[设置项]服务器  

AdodbZip::$user = 'root'; //[设置项]用户名 

AdodbZip::$pwd = ''; //[设置项]密码 

AdodbZip::$db = 'test'; //[设置项]数据库教程 

AdodbZip::$charset = ''; //[设置项]编码 

 

// 注册协议 

if (! in_array ( 'AdodbZip', stream_get_wrappers () )) { 

 stream_wrapper_register ( 'AdodbZip', 'AdodbZip' ); 

} 

// 定义常量 

if (! defined ( 'ADODB_DIR' )) { 

 define ( 'ADODB_DIR', 'AdodbZip:/' ); 

} 

// 包含程序 

require_once (ADODB_DIR . '/adodb.inc.php'); 

// $db = AdodbZip::init(NewADOConnection('mysqlt')); // [选择项]引用即定义$db 

// return AdodbZip::init(NewADOConnection('mysqlt')); // [选择项]引用即返回$db,注意只可引用一次。 

 

/** 

 * AdodbZip类定义 

 */ 

class AdodbZip { 

  

 /** 

  * Adodb变量 

  */ 

 public static $zip_url; 

 public static $zip_file; 

 public static $entry_dir; 

 public static $extract_dir; 

 public static $server; 

 public static $user; 

 public static $pwd; 

 public static $db; 

 public static $charset; 

  

 /** 

  * Stream变量 

  */ 

 private $handle; 

 public $context; 

  

 /** 

  * Adodb函数组 

  */ 

  

 /** 

  * init 

  * @param adodb &$adodb 

  * @return adodb 

  */ 

 public static function init(&$adodb) { 

  $adodb->Connect ( self::$server, self::$user, self::$pwd, self::$db ); 

  if(self::$charset!=''){ 

   $adodb->Execute('SET NAMES '.self::$charset.';'); 

  } 

  return $adodb; 

 } 

  

 /** 

  * Stream函数组 

  */ 

  

 /** 

  * __construct 

  */ 

 public function __construct() { 

 } 

  

 /** 

  * stream_cast 

  * @param int $cast_as 

  * @return resource 

  */ 

 public function stream_cast($cast_as) { 

  return false; 

 } 

  

 /** 

  * stream_close 

  */ 

 public function stream_close() { 

  fclose ( $this->handle ); 

 } 

  

 /** 

  * stream_eof 

  * @return bool 

  */ 

 public function stream_eof() { 

  return feof ( $this->handle ); 

 } 

  

 /** 

  * stream_flush 

  * @return bool 

  */ 

 public function stream_flush() { 

  return fflush ( $this->handle ); 

 } 

  

 /** 

  * stream_lock 

  * @param mode $options 

  * @return bool 

  */ 

 public function stream_lock($options) { 

  return flock ( $this->handle, $options ); 

 } 

  

 /** 

  * stream_open 

  * @param string $path 

  * @param string $mode 

  * @param int $options 

  * @param string &$opend_path 

  * @return bool 

  */ 

 public function stream_open($path, $mode, $options, &$opend_path) { 

  // 验证文件地址 

  if (! preg_match ( '/^.*?://(.*)$/', $path, $matches )) { 

   return false; 

  } 

  $tmp_file = self::$extract_dir . DIRECTORY_SEPARATOR . $matches [1]; 

  $entry_file = self::$entry_dir . '/' . str_replace ( '\', '/', $matches [1] ); 

  $zip_file = self::$zip_file; 

  // 验证程序文件 

  if (! file_exists ( $tmp_file ) || file_exists ( $zip_file ) && filectime ( $tmp_file ) < filectime ( $zip_file )) { 

   // 下载文件 

   if (! file_exists ( $zip_file )) { 

    // 目录处理 

    if (! is_dir ( dirname ( self::$zip_file ) )) { 

     if (mkdir ( dirname ( self::$zip_file ), 0777, true ) === false) { 

      header ( 'Content-type: text/html;charset=utf-8' ); 

      die ( '请创建目录 ' . $zip_dir ); 

     } 

    } 

    // 下载文件 

    if (! file_exists ( self::$zip_file )) { 

     $break = true; 

     do { 

      $url_arr = parse_url ( self::$zip_url ); 

      $fp = fsockopen ( $url_arr ['host'], isset ( $url_arr ['port'] ) ? ( int ) $url_arr ['port'] : 80, $errno, $errstr, 10 ); 

      if ($fp === false) { 

       break; 

      } 

      $out = "GET " . $url_arr ['path'] . " HTTP/1.0rnHost: " . $url_arr ['host'] . " rnConnection: closernrn"; 

      fputs ( $fp, $out ); 

      if (feof ( $fp )) { 

       break; 

      } 

      $buffer = fgets ( $fp, 1024 ); 

      if (! preg_match ( '/^HTTP/1.d 200 /i', $buffer )) { 

       break; 

      } 

      $content_length = false; 

      $content_start = false; 

      while ( ! feof ( $fp ) ) { 

       $buffer = fgets ( $fp, 1024 ); 

       if ($buffer === "rn") { 

        $content_start = true; 

        break; 

       } 

       if (preg_match ( '/^Content-Length:s*(d+)/i', $buffer, $matches )) { 

        $content_length = ( int ) $matches [1]; 

       } 

      } 

      if ($content_length === false || $content_start === false) { 

       break; 

      } 

      $content = stream_get_contents ( $fp ); 

      if ($content === false) { 

       break; 

      } 

      $result = file_put_contents ( self::$zip_file, $content ); 

      unset ( $content ); 

      if ($result === false) { 

       break; 

      } 

      fclose ( $fp ); 

     } while ( $break = false ); 

     if ($break) { 

      header ( 'Content-type: text/html;charset=utf-8' ); 

      die ( '请下载文件 <a href="' . self::$zip_url . '">' . self::$zip_url . '.zip</a > 保存为 ' . self::$zip_file ); 

     } 

    } 

   } 

   // 创建目录 

   $tmp_dir = dirname ( $tmp_file ); 

   if (! is_dir ( $tmp_dir )) { 

    if (mkdir ( $tmp_dir, 0777, true ) === false) { 

     header ( 'Content-type: text/html;charset=utf-8' ); 

     die ( '请创建目录 ' . $tmp_dir ); 

    } 

   } 

   // 打开压缩文件 

   $zip = zip_open ( $zip_file ); 

   if (! is_resource ( $zip )) { 

    return false; 

   } 

   // 寻找解压文件 

   do { 

    $entry = zip_read ( $zip ); 

    if (! is_resource ( $entry )) { 

     return false; 

    } 

    if (zip_entry_name ( $entry ) == $entry_file) { 

     break; 

    } 

   } while ( true ); 

   // 转存压缩文件 

   zip_entry_open ( $zip, $entry ); 

   file_put_contents ( $tmp_file, zip_entry_read ( $entry, zip_entry_filesize ( $entry ) ) ); 

   zip_entry_close ( $entry ); 

   zip_close ( $zip ); 

  } 

  // 打开文件 

  $this->handle = fopen ( $tmp_file, $mode ); 

  if (! is_resource ( $this->handle )) { 

   return false; 

  } 

  return true; 

 } 

  

 /** 

  * stream_read 

  * @param int $count 

  * @return string 

  */ 

 public function stream_read($count) { 

  return fread ( $this->handle, $count ); 

 } 

  

 /** 

  * stream_seek 

  * @param int $offset 

  * @param int $whence=SEEK_SET 

  * @return bool 

  */ 

 public function stream_seek($offset, $whence = SEEK_SET) { 

  return fseek ( $this->handle, $offset, $whence ); 

 } 

  

 /** 

  * stream_set_option 

  * @param int $option 

  * @param int $arg1 

  * @param int $arg2 

  * @return bool 

  */ 

 public function stream_set_option($option, $arg1, $arg2) { 

  return false; 

 } 

  

 /** 

  * stream_stat 

  * @return array 

  */ 

 public function stream_stat() { 

  return fstat ( $this->handle ); 

 } 

  

 /** 

  * stream_tell 

  * @return int 

  */ 

 public function stream_tell() { 

  return ftell ( $this->handle ); 

 } 

  

 /** 

  * stream_write 

  * @param string $data 

  * @return int 

  */ 

 public function stream_write($data) { 

  return fwrite ( $this->handle, $data ); 

 } 

  

 /** 

  * url_stat 

  * @param string $path 

  * @param int $flag 

  * @return array 

  */ 

 public function url_stat($path, $flag) { 

  if (! preg_match ( '/^.*?://(.*)$/', $path, $matches )) { 

   return false; 

  } 

  $tmp_file = self::$extract_dir . DIRECTORY_SEPARATOR . $matches [1]; 

  if (file_exists ( $tmp_file )) { 

   if ($flag & STREAM_URL_STAT_LINK) { 

    return lstat ( $tmp_file ); 

   } else { 

    return stat ( $tmp_file ); 

   } 

  } 

  if ($flag & STREAM_URL_STAT_QUIET) { 

   $arr = array ('dev' => 0, 'ino' => 0, 'mode' => 0, 'nlink' => 0, 'uid' => 0, 'gid' => 0, 'rdev' => 0, 'size' => 0, 'atime' => 0, 'mtime' => 0, 'ctime' => 0, 'blksize' => 0, 'blocks' => 0 ); 

   return array_merge ( array_values ( $arr ), $arr ); 

  } 

  return false; 

 } 

} 

?>

使用实例代码如下:
<?php 

 include_once 'AdodbZip.php';  

 $db = AdodbZip::init(NewADOConnection('mysqlt'));  

 echo $db->GetOne('SELECT NOW()');  

 ?>

也是两步.

1. 包含AdodbZip.php文件

2. AdodbZip::init(...)函数对adodb连接类进行初始化

希望本文所述对大家的PHP程序设计有所帮助。

PHP 相关文章推荐
如何开发一个虚拟域名系统
Oct 09 PHP
自己前几天写的无限分类类
Feb 14 PHP
利用PHP和AJAX创建RSS聚合器的代码
Mar 13 PHP
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
Jul 17 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
Feb 19 PHP
PHP+jQuery实现自动补全功能源码
May 15 PHP
php中的比较运算符详解
Oct 28 PHP
PHP微框架Dispatch简介
Jun 12 PHP
CodeIgniter输出中文乱码的两种解决办法
Jun 12 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
Jul 22 PHP
浅谈thinkphp的实例化模型
Jan 04 PHP
php生成图片验证码
Jun 09 PHP
php中Array2xml类实现数组转化成XML实例
Dec 08 #PHP
PHP内存缓存Memcached类实例
Dec 08 #PHP
thinkphp实现上一篇与下一篇的方法
Dec 08 #PHP
PHP模块memcached使用指南
Dec 08 #PHP
PHP原生函数一定好吗?
Dec 08 #PHP
thinkphp中ajax与php响应过程详解
Dec 08 #PHP
一款简单实用的php操作mysql数据库类
Dec 08 #PHP
You might like
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
2011/07/03 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
2015/12/22 PHP
PHP Cookie学习笔记
2016/08/23 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
PHP实现简单日历类编写
2020/08/28 PHP
JavaScript基础知识之数据类型
2012/08/06 Javascript
js的alert弹出框出现乱码解决方案
2013/09/02 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
jQuery实现转动随机数抽奖效果的方法
2015/05/21 Javascript
写给小白的JavaScript引擎指南
2015/12/04 Javascript
Bootstrap实现登录校验表单(带验证码)
2016/06/23 Javascript
浅谈JavaScript中的this指针和引用知识
2016/08/05 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
jQuery基于ajax操作json数据简单示例
2017/01/05 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
Nodejs读取文件时相对路径的正确写法(使用fs模块)
2017/04/27 NodeJs
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
垃圾回收器的相关知识点总结
2018/05/13 Javascript
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
vue实现标签云效果的方法详解
2019/08/28 Javascript
python技能之数据导出excel的实例代码
2017/08/11 Python
Python补齐字符串长度的实例
2018/11/15 Python
python pickle存储、读取大数据量列表、字典数据的方法
2019/07/07 Python
Django错误:TypeError at / 'bool' object is not callable解决
2019/08/16 Python
深入学习python多线程与GIL
2019/08/26 Python
python列表返回重复数据的下标
2020/02/10 Python
全球知名巧克力品牌:Godiva
2016/07/22 全球购物
生物化工专业个人自荐信
2013/09/26 职场文书
计算机应届毕业生自荐信范文
2014/02/23 职场文书
电焊工岗位职责
2014/03/06 职场文书
2015初中政教处工作总结
2015/07/21 职场文书
高中班主任培训心得体会
2016/01/07 职场文书