- <?php
- /**
- * AdodbZip 1.1
- *
- * 作者:
- * Z(QQ號602000 QQ群5193883)
- *
- * 代碼示例:
- * 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的程序文件。
- * //開源Vevb.com
- * 其他說明:
- * 1. $extract_dir可自定義。如果將Adodb的Zip包完全解壓到此目錄,則可忽略$zip_url和$zip_file設置項,這和傳統使用Adodb一樣。
- * 2. $zip_file可自定義。如果$zip_file存在,則可忽略$zip_url,這樣可整站統一使用$zip_file。
- * 3. $zip_url可自定義??呻S時修改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連接類進行初始化
新聞熱點
疑難解答