html5中文学习网

您的位置: 首页 > 网络编程 > PHP编程 » 正文

PHP缓存技术实现_PHP教程_编程技术

[ ] 已经帮助:人解决问题

  发个PHP缓存实现,实现了apc和文件缓存,继承Cache_Abstract即可实现调用第三方的缓存工具。sxjHTML5中文学习网 - HTML5先行者学习网

  参考shindig的缓存类和apc。sxjHTML5中文学习网 - HTML5先行者学习网

  Php代码sxjHTML5中文学习网 - HTML5先行者学习网

  <?phpsxjHTML5中文学习网 - HTML5先行者学习网

  class CacheException extends Exception {}sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 缓存抽象类sxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  abstract class Cache_Abstract {sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 读缓存变量sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $key 缓存下标sxjHTML5中文学习网 - HTML5先行者学习网

  * @return mixedsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  abstract public function fetch($key);sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 缓存变量sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $key 缓存变量下标sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $value 缓存变量的值sxjHTML5中文学习网 - HTML5先行者学习网

  * @return boolsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  abstract public function store($key, $value);sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 删除缓存变量sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $key 缓存下标sxjHTML5中文学习网 - HTML5先行者学习网

  * @return Cache_AbstractsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  abstract public function delete($key);sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 清(删)除所有缓存sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @return Cache_AbstractsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  abstract public function clear();sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 锁定缓存变量sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $key 缓存下标sxjHTML5中文学习网 - HTML5先行者学习网

  * @return Cache_AbstractsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  abstract public function lock($key);sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 缓存变量解锁sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $key 缓存下标sxjHTML5中文学习网 - HTML5先行者学习网

  * @return Cache_AbstractsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  abstract public function unlock($key);sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 取得缓存变量是否被锁定sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $key 缓存下标sxjHTML5中文学习网 - HTML5先行者学习网

  * @return boolsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  abstract public function isLocked($key);sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 确保不是锁定状态sxjHTML5中文学习网 - HTML5先行者学习网

  * 最多做$tries次睡眠等待解锁,超时则跳过并解锁sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $key 缓存下标sxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  public function checkLock($key) {sxjHTML5中文学习网 - HTML5先行者学习网

  if (!$this->isLocked($key)) {sxjHTML5中文学习网 - HTML5先行者学习网

  return $this;sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  $tries = 10;sxjHTML5中文学习网 - HTML5先行者学习网

  $count = 0;sxjHTML5中文学习网 - HTML5先行者学习网

  do {sxjHTML5中文学习网 - HTML5先行者学习网

  usleep(200);sxjHTML5中文学习网 - HTML5先行者学习网

  $count ++;sxjHTML5中文学习网 - HTML5先行者学习网

  } while ($count <= $tries && $this->isLocked($key)); // 最多做十次睡眠等待解锁,超时则跳过并解锁sxjHTML5中文学习网 - HTML5先行者学习网

  $this->isLocked($key) && $this->unlock($key);sxjHTML5中文学习网 - HTML5先行者学习网

  return $this;sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * APC扩展缓存实现sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @category MjiesxjHTML5中文学习网 - HTML5先行者学习网

  * @package CachesxjHTML5中文学习网 - HTML5先行者学习网

  * @author 流水孟春sxjHTML5中文学习网 - HTML5先行者学习网

  * @copyright Copyright (c) 2008- sxjHTML5中文学习网 - HTML5先行者学习网

  * @license New BSD LicensesxjHTML5中文学习网 - HTML5先行者学习网

  * @version $Id: Cache/Apc.php 版本号 2010-04-18 23:02 cmpan $sxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  class Cache_Apc extends Cache_Abstract {sxjHTML5中文学习网 - HTML5先行者学习网

  protected $_prefix = 'cache.mjie.net';sxjHTML5中文学习网 - HTML5先行者学习网

  public function __construct() {sxjHTML5中文学习网 - HTML5先行者学习网

  if (!function_exists('apc_cache_info')) {sxjHTML5中文学习网 - HTML5先行者学习网

  throw new CacheException('apc extension didn/'t installed');sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 保存缓存变量sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $keysxjHTML5中文学习网 - HTML5先行者学习网

  * @param mixed $valuesxjHTML5中文学习网 - HTML5先行者学习网

  * @return boolsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  public function store($key, $value) {sxjHTML5中文学习网 - HTML5先行者学习网

  return apc_store($this->_storageKey($key), $value);sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 读取缓存sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $keysxjHTML5中文学习网 - HTML5先行者学习网

  * @return mixedsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  public function fetch($key) {sxjHTML5中文学习网 - HTML5先行者学习网

  return apc_fetch($this->_storageKey($key));sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 清除缓存sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @return Cache_ApcsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  public function clear() {sxjHTML5中文学习网 - HTML5先行者学习网

  apc_clear_cache();sxjHTML5中文学习网 - HTML5先行者学习网

  return $this;sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 删除缓存单元sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @return Cache_ApcsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  public function delete($key) {sxjHTML5中文学习网 - HTML5先行者学习网

  apc_delete($this->_storageKey($key));sxjHTML5中文学习网 - HTML5先行者学习网

  return $this;sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 缓存单元是否被锁定sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $keysxjHTML5中文学习网 - HTML5先行者学习网

  * @return boolsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  public function isLocked($key) {sxjHTML5中文学习网 - HTML5先行者学习网

  if ((apc_fetch($this->_storageKey($key) . '.lock')) === false) {sxjHTML5中文学习网 - HTML5先行者学习网

  return false;sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  return true;sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 锁定缓存单元sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $keysxjHTML5中文学习网 - HTML5先行者学习网

  * @return Cache_ApcsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  public function lock($key) {sxjHTML5中文学习网 - HTML5先行者学习网

  apc_store($this->_storageKey($key) . '.lock', '', 5);sxjHTML5中文学习网 - HTML5先行者学习网

  return $this;sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 缓存单元解锁sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $keysxjHTML5中文学习网 - HTML5先行者学习网

  * @return Cache_ApcsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  public function unlock($key) {sxjHTML5中文学习网 - HTML5先行者学习网

  apc_delete($this->_storageKey($key) . '.lock');sxjHTML5中文学习网 - HTML5先行者学习网

  return $this;sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 完整缓存名sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $keysxjHTML5中文学习网 - HTML5先行者学习网

  * @return stringsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  private function _storageKey($key) {sxjHTML5中文学习网 - HTML5先行者学习网

  return $this->_prefix . '_' . $key;sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 文件缓存实现sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @category MjiesxjHTML5中文学习网 - HTML5先行者学习网

  * @package CachesxjHTML5中文学习网 - HTML5先行者学习网

  * @author 流水孟春sxjHTML5中文学习网 - HTML5先行者学习网

  * @copyright Copyright (c) 2008- sxjHTML5中文学习网 - HTML5先行者学习网

  * @license New BSD LicensesxjHTML5中文学习网 - HTML5先行者学习网

  * @version $Id: Cache/File.php 版本号 2010-04-18 16:46 cmpan $sxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  class Cache_File extends Cache_Abstract {sxjHTML5中文学习网 - HTML5先行者学习网

  public $useSubdir = false;sxjHTML5中文学习网 - HTML5先行者学习网

  protected $_cachesDir = 'cache';sxjHTML5中文学习网 - HTML5先行者学习网

  public function __construct() {sxjHTML5中文学习网 - HTML5先行者学习网

  if (defined('DATA_DIR')) {sxjHTML5中文学习网 - HTML5先行者学习网

  $this->_setCacheDir(DATA_DIR . '/cache');sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 获取缓存文件sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $keysxjHTML5中文学习网 - HTML5先行者学习网

  * @return stringsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  protected function _getCacheFile($key) {sxjHTML5中文学习网 - HTML5先行者学习网

  $subdir = $this->useSubdir ? substr($key, 0, 2) . '/' : '';sxjHTML5中文学习网 - HTML5先行者学习网

  return $this->_cachesDir . '/' . $subdir . $key . '.php';sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 读取缓存变量sxjHTML5中文学习网 - HTML5先行者学习网

  * 为防止信息泄露,缓存文件格式为php文件,并以""开头sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $key 缓存下标sxjHTML5中文学习网 - HTML5先行者学习网

  * @return mixedsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  public function fetch($key) {sxjHTML5中文学习网 - HTML5先行者学习网

  $cacheFile = self::_getCacheFile($key);sxjHTML5中文学习网 - HTML5先行者学习网

  if (file_exists($cacheFile) && is_readable($cacheFile)) {sxjHTML5中文学习网 - HTML5先行者学习网

  // include 方式sxjHTML5中文学习网 - HTML5先行者学习网

  //return include $cacheFile;sxjHTML5中文学习网 - HTML5先行者学习网

  // 系列化方式sxjHTML5中文学习网 - HTML5先行者学习网

  return unserialize(@file_get_contents($cacheFile, false, NULL, 13));sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  return false;sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 缓存变量sxjHTML5中文学习网 - HTML5先行者学习网

  * 为防止信息泄露,缓存文件格式为php文件,并以""开头sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $key 缓存变量下标sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $value 缓存变量的值sxjHTML5中文学习网 - HTML5先行者学习网

  * @return boolsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  public function store($key, $value) {sxjHTML5中文学习网 - HTML5先行者学习网

  $cacheFile = self::_getCacheFile($key);sxjHTML5中文学习网 - HTML5先行者学习网

  $cacheDir = dirname($cacheFile);sxjHTML5中文学习网 - HTML5先行者学习网

  if(!is_dir($cacheDir)) {sxjHTML5中文学习网 - HTML5先行者学习网

  if(!@mkdir($cacheDir, 0755, true)) {sxjHTML5中文学习网 - HTML5先行者学习网

  throw new CacheException("Could not make cache directory");sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  // 用include方式sxjHTML5中文学习网 - HTML5先行者学习网

  //return @file_put_contents($cacheFile, 'sxjHTML5中文学习网 - HTML5先行者学习网

  return @file_put_contents($cacheFile, '' . serialize($value));sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 删除缓存变量sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $key 缓存下标sxjHTML5中文学习网 - HTML5先行者学习网

  * @return Cache_FilesxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  public function delete($key) {sxjHTML5中文学习网 - HTML5先行者学习网

  if(emptyempty($key)) {sxjHTML5中文学习网 - HTML5先行者学习网

  throw new CacheException("Missing argument 1 for Cache_File::delete()");sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  $cacheFile = self::_getCacheFile($key);sxjHTML5中文学习网 - HTML5先行者学习网

  if(!@unlink($cacheFile)) {sxjHTML5中文学习网 - HTML5先行者学习网

  throw new CacheException("Cache file could not be deleted");sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  return $this;sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 缓存单元是否已经锁定sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $keysxjHTML5中文学习网 - HTML5先行者学习网

  * @return boolsxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  public function isLocked($key) {sxjHTML5中文学习网 - HTML5先行者学习网

  $cacheFile = self::_getCacheFile($key);sxjHTML5中文学习网 - HTML5先行者学习网

  clearstatcache();sxjHTML5中文学习网 - HTML5先行者学习网

  return file_exists($cacheFile . '.lock');sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 锁定sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $keysxjHTML5中文学习网 - HTML5先行者学习网

  * @return Cache_FilesxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  public function lock($key) {sxjHTML5中文学习网 - HTML5先行者学习网

  $cacheFile = self::_getCacheFile($key);sxjHTML5中文学习网 - HTML5先行者学习网

  $cacheDir = dirname($cacheFile);sxjHTML5中文学习网 - HTML5先行者学习网

  if(!is_dir($cacheDir)) {sxjHTML5中文学习网 - HTML5先行者学习网

  if(!@mkdir($cacheDir, 0755, true)) {sxjHTML5中文学习网 - HTML5先行者学习网

  if(!is_dir($cacheDir)) {sxjHTML5中文学习网 - HTML5先行者学习网

  throw new CacheException("Could not make cache directory");sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  // 设定缓存锁文件的访问和修改时间sxjHTML5中文学习网 - HTML5先行者学习网

  @touch($cacheFile . '.lock');sxjHTML5中文学习网 - HTML5先行者学习网

  return $this;sxjHTML5中文学习网 - HTML5先行者学习网

  }sxjHTML5中文学习网 - HTML5先行者学习网

  /**sxjHTML5中文学习网 - HTML5先行者学习网

  * 解锁sxjHTML5中文学习网 - HTML5先行者学习网

  *sxjHTML5中文学习网 - HTML5先行者学习网

  * @param string $keysxjHTML5中文学习网 - HTML5先行者学习网

  * @return Cache_FilesxjHTML5中文学习网 - HTML5先行者学习网

  */sxjHTML5中文学习网 - HTML5先行者学习网

  public function unlock($key) {sxjHTML5中文学习网 - HTML5先行者学习网

  $cacheFile = self::_getCacheFile($key);sxjHTML5中文学习网 - HTML5先行者学习网

  @unlink($cacheFile . '.lock');sxjHTML5中文学习网 - HTML5先行者学习网

  returnsxjHTML5中文学习网 - HTML5先行者学习网

sxjHTML5中文学习网 - HTML5先行者学习网
sxjHTML5中文学习网 - HTML5先行者学习网
(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助