php中adodbzip类实例

  本文实例讲述了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程序设计有所帮助。