php中adodbzip类实例

这篇文章主要介绍了php中adodbzip类,以实例形式详细讲述了adodbzip类文件的实现方法与使用技巧,注释中包含详尽的功能说明,非常具有实用价值,需要的朋友可以参考下

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

  1. <?php
  2. /**
  3. * AdodbZip 1.1
  4. *
  5. * 代码示例:
  6. * include_once 'AdodbZip.php';
  7. * $db = AdodbZip::init(NewADOConnection('mysql教程t'));
  8. * echo $db->GetOne('SELECT NOW()');
  9. *
  10. * 流程说明:
  11. * 1. 如果$extract_dir里的Adodb程序文件存在,并且$zip_file不存在;则使用$extract_dir里的Adodb程序文件。
  12. * 2. 如果$extract_dir里的Adodb程序文件存在,并且$zip_file存在;则比较修改时间,$extract_dir里的Adodb程序文件更新为较新的。
  13. * 3. 如果$extract_dir里的Adodb程序文件不存在,并且$zip_file存在;则$extract_dir里的Adodb程序文件从$zip_file解压获得。
  14. * 4. 如果 $extract_dir里的Adodb程序文件不存在,并且$zip_file不存在;则从$zip_url下载Adodb的Zip文件,并解压Adodb的程序文件。
  15. * 其他说明:
  16. * 1. $extract_dir可自定义。如果将Adodb的Zip包完全解压到此目录,则可忽略$zip_url和$zip_file设置项,这和传统使用Adodb一样。
  17. * 2. $zip_file可自定义。如果$zip_file存在,则可忽略$zip_url,这样可整站统一使用$zip_file。
  18. * 3. $zip_url可自定义。可随时修改Adodb版本,此时$zip_file和$extract_dir最好使用默认值,各版本互不干扰。
  19. * 4. $server、$user、$pwd、$db可自定义。默认是mysql默认值,此项只有调用AdodbZip::init方法后才起效果。
  20. * 5. $charset可自定义。默认不改变编码,此项只有调用AdodbZip::init方法后才起效果。
  21. * 6. AdodbZip::init方法里可增加Adodb初始化值。
  22. */
  23. /**
  24. * AdodbZip启动项
  25. */
  26. // 设定参数
  27. 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文件下载地址,文件比较大建议先下载或者解压
  28. AdodbZip::$zip_file = sys_get_temp_dir () . preg_replace ( '/^.*/(adodb.*?.zip)$/i', 'adodb/$1', AdodbZip::$zip_url ); //[设置项]Adodb的Zip文件缓存位置
  29. AdodbZip::$entry_dir = 'adodb5';
  30. AdodbZip::$extract_dir = sys_get_temp_dir () . 'adodb/' . AdodbZip::$entry_dir; //[设置项]Adodb程序文件缓存位置
  31. AdodbZip::$server = 'localhost'; //[设置项]服务器
  32. AdodbZip::$user = 'root'; //[设置项]用户名
  33. AdodbZip::$pwd = ''; //[设置项]密码
  34. AdodbZip::$db = 'test'; //[设置项]数据库教程
  35. AdodbZip::$charset = ''; //[设置项]编码
  36. // 注册协议
  37. if (! in_array ( 'AdodbZip', stream_get_wrappers () )) {
  38. stream_wrapper_register ( 'AdodbZip', 'AdodbZip' );
  39. }
  40. // 定义常量
  41. if (! defined ( 'ADODB_DIR' )) {
  42. define ( 'ADODB_DIR', 'AdodbZip:/' );
  43. }
  44. // 包含程序
  45. require_once (ADODB_DIR . '/adodb.inc.php');
  46. // $db = AdodbZip::init(NewADOConnection('mysqlt')); // [选择项]引用即定义$db
  47. // return AdodbZip::init(NewADOConnection('mysqlt')); // [选择项]引用即返回$db,注意只可引用一次。
  48. /**
  49. * AdodbZip类定义
  50. */
  51. class AdodbZip {
  52. /**
  53. * Adodb变量
  54. */
  55. public static $zip_url;
  56. public static $zip_file;
  57. public static $entry_dir;
  58. public static $extract_dir;
  59. public static $server;
  60. public static $user;
  61. public static $pwd;
  62. public static $db;
  63. public static $charset;
  64. /**
  65. * Stream变量
  66. */
  67. private $handle;
  68. public $context;
  69. /**
  70. * Adodb函数组
  71. */
  72. /**
  73. * init
  74. * @param adodb &$adodb
  75. * @return adodb
  76. */
  77. public static function init(&$adodb) {
  78. $adodb->Connect ( self::$server, self::$user, self::$pwd, self::$db );
  79. if(self::$charset!=''){
  80. $adodb->Execute('SET NAMES '.self::$charset.';');
  81. }
  82. return $adodb;
  83. }
  84. /**
  85. * Stream函数组
  86. */
  87. /**
  88. * __construct
  89. */
  90. public function __construct() {
  91. }
  92. /**
  93. * stream_cast
  94. * @param int $cast_as
  95. * @return resource
  96. */
  97. public function stream_cast($cast_as) {
  98. return false;
  99. }
  100. /**
  101. * stream_close
  102. */
  103. public function stream_close() {
  104. fclose ( $this->handle );
  105. }
  106. /**
  107. * stream_eof
  108. * @return bool
  109. */
  110. public function stream_eof() {
  111. return feof ( $this->handle );
  112. }
  113. /**
  114. * stream_flush
  115. * @return bool
  116. */
  117. public function stream_flush() {
  118. return fflush ( $this->handle );
  119. }
  120. /**
  121. * stream_lock
  122. * @param mode $options
  123. * @return bool
  124. */
  125. public function stream_lock($options) {
  126. return flock ( $this->handle, $options );
  127. }
  128. /**
  129. * stream_open
  130. * @param string $path
  131. * @param string $mode
  132. * @param int $options
  133. * @param string &$opend_path
  134. * @return bool
  135. */
  136. public function stream_open($path, $mode, $options, &$opend_path) {
  137. // 验证文件地址
  138. if (! preg_match ( '/^.*?://(.*)$/', $path, $matches )) {
  139. return false;
  140. }
  141. $tmp_file = self::$extract_dir . DIRECTORY_SEPARATOR . $matches [1];
  142. $entry_file = self::$entry_dir . '/' . str_replace ( '\', '/', $matches [1] );
  143. $zip_file = self::$zip_file;
  144. // 验证程序文件
  145. if (! file_exists ( $tmp_file ) || file_exists ( $zip_file ) && filectime ( $tmp_file ) < filectime ( $zip_file )) {
  146. // 下载文件
  147. if (! file_exists ( $zip_file )) {
  148. // 目录处理
  149. if (! is_dir ( dirname ( self::$zip_file ) )) {
  150. if (mkdir ( dirname ( self::$zip_file ), 0777, true ) === false) {
  151. header ( 'Content-type: text/html;charset=utf-8' );
  152. die ( '请创建目录 ' . $zip_dir );
  153. }
  154. }
  155. // 下载文件
  156. if (! file_exists ( self::$zip_file )) {
  157. $break = true;
  158. do {
  159. $url_arr = parse_url ( self::$zip_url );
  160. $fp = fsockopen ( $url_arr ['host'], isset ( $url_arr ['port'] ) ? ( int ) $url_arr ['port'] : 80, $errno, $errstr, 10 );
  161. if ($fp === false) {
  162. break;
  163. }
  164. $out = "GET " . $url_arr ['path'] . " HTTP/1.0rnHost: " . $url_arr ['host'] . " rnConnection: closernrn";
  165. fputs ( $fp, $out );
  166. if (feof ( $fp )) {
  167. break;
  168. }
  169. $buffer = fgets ( $fp, 1024 );
  170. if (! preg_match ( '/^HTTP/1.d 200 /i', $buffer )) {
  171. break;
  172. }
  173. $content_length = false;
  174. $content_start = false;
  175. while ( ! feof ( $fp ) ) {
  176. $buffer = fgets ( $fp, 1024 );
  177. if ($buffer === "rn") {
  178. $content_start = true;
  179. break;
  180. }
  181. if (preg_match ( '/^Content-Length:s*(d+)/i', $buffer, $matches )) {
  182. $content_length = ( int ) $matches [1];
  183. }
  184. }
  185. if ($content_length === false || $content_start === false) {
  186. break;
  187. }
  188. $content = stream_get_contents ( $fp );
  189. if ($content === false) {
  190. break;
  191. }
  192. $result = file_put_contents ( self::$zip_file, $content );
  193. unset ( $content );
  194. if ($result === false) {
  195. break;
  196. }
  197. fclose ( $fp );
  198. } while ( $break = false );
  199. if ($break) {
  200. header ( 'Content-type: text/html;charset=utf-8' );
  201. die ( '请下载文件 <a href="' . self::$zip_url . '">' . self::$zip_url . '.zip</a > 保存为 ' . self::$zip_file );
  202. }
  203. }
  204. }
  205. // 创建目录
  206. $tmp_dir = dirname ( $tmp_file );
  207. if (! is_dir ( $tmp_dir )) {
  208. if (mkdir ( $tmp_dir, 0777, true ) === false) {
  209. header ( 'Content-type: text/html;charset=utf-8' );
  210. die ( '请创建目录 ' . $tmp_dir );
  211. }
  212. }
  213. // 打开压缩文件
  214. $zip = zip_open ( $zip_file );
  215. if (! is_resource ( $zip )) {
  216. return false;
  217. }
  218. // 寻找解压文件
  219. do {
  220. $entry = zip_read ( $zip );
  221. if (! is_resource ( $entry )) {
  222. return false;
  223. }
  224. if (zip_entry_name ( $entry ) == $entry_file) {
  225. break;
  226. }
  227. } while ( true );
  228. // 转存压缩文件
  229. zip_entry_open ( $zip, $entry );
  230. file_put_contents ( $tmp_file, zip_entry_read ( $entry, zip_entry_filesize ( $entry ) ) );
  231. zip_entry_close ( $entry );
  232. zip_close ( $zip );
  233. }
  234. // 打开文件
  235. $this->handle = fopen ( $tmp_file, $mode );
  236. if (! is_resource ( $this->handle )) {
  237. return false;
  238. }
  239. return true;
  240. }
  241. /**
  242. * stream_read
  243. * @param int $count
  244. * @return string
  245. */
  246. public function stream_read($count) {
  247. return fread ( $this->handle, $count );
  248. }
  249. /**
  250. * stream_seek
  251. * @param int $offset
  252. * @param int $whence=SEEK_SET
  253. * @return bool
  254. */
  255. public function stream_seek($offset, $whence = SEEK_SET) {
  256. return fseek ( $this->handle, $offset, $whence );
  257. }
  258. /**
  259. * stream_set_option
  260. * @param int $option
  261. * @param int $arg1
  262. * @param int $arg2
  263. * @return bool
  264. */
  265. public function stream_set_option($option, $arg1, $arg2) {
  266. return false;
  267. }
  268. /**
  269. * stream_stat
  270. * @return array
  271. */
  272. public function stream_stat() {
  273. return fstat ( $this->handle );
  274. }
  275. /**
  276. * stream_tell
  277. * @return int
  278. */
  279. public function stream_tell() {
  280. return ftell ( $this->handle );
  281. }
  282. /**
  283. * stream_write
  284. * @param string $data
  285. * @return int
  286. */
  287. public function stream_write($data) {
  288. return fwrite ( $this->handle, $data );
  289. }
  290. /**
  291. * url_stat
  292. * @param string $path
  293. * @param int $flag
  294. * @return array
  295. */
  296. public function url_stat($path, $flag) {
  297. if (! preg_match ( '/^.*?://(.*)$/', $path, $matches )) {
  298. return false;
  299. }
  300. $tmp_file = self::$extract_dir . DIRECTORY_SEPARATOR . $matches [1];
  301. if (file_exists ( $tmp_file )) {
  302. if ($flag & STREAM_URL_STAT_LINK) {
  303. return lstat ( $tmp_file );
  304. } else {
  305. return stat ( $tmp_file );
  306. }
  307. }
  308. if ($flag & STREAM_URL_STAT_QUIET) {
  309. $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 );
  310. return array_merge ( array_values ( $arr ), $arr );
  311. }
  312. return false;
  313. }
  314. }
  315. ?>

使用实例代码如下:

  1. <?php
  2. include_once 'AdodbZip.php';
  3. $db = AdodbZip::init(NewADOConnection('mysqlt'));
  4. echo $db->GetOne('SELECT NOW()');
  5. ?>

也是两步.

1. 包含AdodbZip.php文件

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

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