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 相关文章推荐
PHP的宝库目录--PEAR
Oct 09 PHP
PHP 模拟$_PUT实现代码
Mar 15 PHP
php面向对象中的魔术方法中文说明
Mar 04 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
Nov 19 PHP
php图片处理函数获取类型及扩展名实例
Nov 19 PHP
php更新mysql后获取改变行数的方法
Dec 25 PHP
php随机生成数字字母组合的方法
Mar 18 PHP
PHP数组相关函数汇总
Mar 24 PHP
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
Jun 03 PHP
ecshop适应在PHP7的修改方法解决报错的实现
Nov 01 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
Jul 27 PHP
Laravel框架自定义公共函数的引入操作示例
Apr 16 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中传统验证与thinkphp框架(必看篇)
2017/06/10 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
jquery的index方法实现tab效果
2011/02/16 Javascript
修改js Calendar日历控件 兼容IE9/谷歌/火狐
2013/01/04 Javascript
JS案例分享之金额小写转大写
2014/05/15 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
2020/08/11 Javascript
JavaScript中的类(Class)详细介绍
2014/12/30 Javascript
jQuery实现灰蓝风格标准二级下拉菜单效果代码
2015/08/31 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
详细分析Javascript中创建对象的四种方式
2016/08/17 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
微信小程序 WebSocket详解及应用
2017/01/21 Javascript
微信小程序开发之toast提示插件使用示例
2017/06/08 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
js处理包含中文的字符串实例
2017/10/11 Javascript
详解vue使用插槽分发内容slot的用法
2019/03/28 Javascript
详解vue-cli3多环境打包配置
2019/03/28 Javascript
[01:31]完美与DOTA2历程
2014/07/31 DOTA
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
Python中基础的socket编程实战攻略
2016/06/01 Python
详解Python中使用base64模块来处理base64编码的方法
2016/07/01 Python
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
python绘制条形图方法代码详解
2017/12/19 Python
Python文件循环写入行时防止覆盖的解决方法
2018/11/09 Python
python代码实现逻辑回归logistic原理
2019/08/07 Python
wxpython绘制圆角窗体
2019/11/18 Python
HTML5的语法变化介绍
2013/08/13 HTML / CSS
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/11/24 面试题
大学感恩节活动策划方案
2014/10/11 职场文书
2014年科普工作总结
2014/12/06 职场文书
邀请函样本
2015/02/02 职场文书
2019最新激励员工口号大全!
2019/06/28 职场文书
教你用Python爬取英雄联盟皮肤原画
2021/06/13 Python