首页 php教程 php手册 php文件缓存类实例整理

php文件缓存类实例整理

Jun 13, 2016 am 09:49 AM
php 下面 功能 实例 常用 应用 开发 我们 整理 文件 缓存

缓存类是我们开发应用中会常用使用到的功能,下面我来给大家整理几个php文件缓存类了,各个文件缓存类写法不同,但在性能上会有区别,有兴趣测试的朋友可测试一下这些缓存类吧。

例1

 代码如下 复制代码

$fzz = new fzz_cache;
$fzz->kk = $_SERVER; //写入缓存
//$fzz->set("kk",$_SERVER,10000); //此方法不与类属性想冲突,可以用任意缓存名;
print_r($fzz->kk);  //读取缓存
//print_r($fzz->get("kk"));
//unset($fzz->kk); //删除缓存
//$fzz->_unset("kk");
var_dump(isset($fzz->kk)); //判断缓存是否存在
//$fzz->_isset("kk");
//$fzz->clear(); //清理过期缓存
//$fzz->clear_all(); //清理所有缓存文件
class fzz_cache{
 public $limit_time = 20000; //缓存过期时间
 public $cache_dir = "data"; //缓存文件保存目录

 //写入缓存
 function __set($key , $val){
  $this->_set($key ,$val);
 }
 //第三个参数为过期时间
 function _set($key ,$val,$limit_time=null){  
  $limit_time = $limit_time ? $limit_time : $this->limit_time;
  $file = $this->cache_dir."/".$key.".cache";
  $val = serialize($val);
  @file_put_contents($file,$val) or $this->error(__line__,"fail to write in file");
  @chmod($file,0777);
  @touch($file,time()+$limit_time) or $this->error(__line__,"fail to change time");
 }


 //读取缓存
 function __get($key){
  return $this->_get($key);
 }
 function _get($key){
  $file = $this->cache_dir."/".$key.".cache";
  if (@filemtime($file)>=time()){
   return unserialize(file_get_contents($file));
  }else{
   @unlink($file) or $this->error(__line__,"fail to unlink");
   return false;
  }
 }


 //删除缓存文件
 function __unset($key){
  return $this->_unset($key);
 }
 function _unset($key){
  if (@unlink($this->cache_dir."/".$key.".cache")){
   return true;
  }else{
   return false;
  }
 }


 //检查缓存是否存在,过期则认为不存在
 function __isset($key){
  return $this->_isset($key);
 }
 function _isset($key){
  $file = $this->cache_dir."/".$key.".cache";
  if (@filemtime($file)>=time()){
   return true;
  }else{
   @unlink($file) ;
   return false;
  }
 }


 //清除过期缓存文件
 function clear(){
  $files = scandir($this->cache_dir);
  foreach ($files as $val){
   if (filemtime($this->cache_dir."/".$val)     @unlink($this->cache_dir."/".$val);
   }
  }
 }


 //清除所有缓存文件
 function clear_all(){
  $files = scandir($this->cache_dir);
  foreach ($files as $val){
   @unlink($this->cache_dir."/".$val);
  }
 }
 
 function error($msg,$debug = false) {
  $err = new Exception($msg);
  $str = "

<br>
<span style="color:red">error:</span><br>
".print_r($err->getTrace(),1)."<br>
登录后复制
";
  if($debug == true) {
   file_put_contents(date('Y-m-d H_i_s').".log",$str);
   return $str;
  }else{
   die($str);
  }
 }
}
?>

例2.从CI社区的stblog和CI的file_helper类中提取出来的php文件缓存类,一个简单的基于文件的key->value缓存类。

这个类可以用来缓存一些基本信息,比如博客的header,footer,sidebar中的一些不经常变化,从数据库中取出的

内容,取数据前先判断文件缓存中的内容是否过期,如果没过期取出来,过期了则连接数据库查询,并将结果重新

写入文件缓存,更新过期时间。跟memcache使用类似,不过更方便。用在一些小的应用上足够了...代码如下

 代码如下 复制代码

define('DIRECTORY_SEPARATOR','/');
define('FOPEN_WRITE_CREATE_DESTRUCTIVE','wb');
define('FOPEN_WRITE_CREATE','ab');
define('DIR_WRITE_MODE', 0777);
class FileCache {

 /**
     * 缓存路径
     *
     * @access private
     * @var string
     */
 private $_cache_path;

 /**
     * 缓存过期时间,单位是秒second
     *
     * @access private
     * @var int
     */
 private $_cache_expire;
 
 /**
     * 解析函数,设置缓存过期实践和存储路径
     *
     * @access public
     * @return void
     */
 public function __construct($expire, $cache_path)
 {
  $this->_cache_expire = $expire;
  $this->_cache_path = $cache_path;
 }
 
 /**
     * 缓存文件名
     *
     * @access public
     * @param  string $key
     * @return void
     */
 private function _file($key)
 {
  return $this->_cache_path . md5($key);
 }
 
 /**
     * 设置缓存
     *
     * @access public
     * @param  string $key 缓存的唯一键
     * @param  string $data 缓存的内容
     * @return bool
     */
 public function set($key, $data)
 {
  $value = serialize($data);
 
  $file = $this->_file($key);
 
     return $this->write_file($file, $value);
 }
 
 /**
     * 获取缓存
     *
     * @access public
     * @param  string $key 缓存的唯一键
     * @return mixed
     */
 public function get($key)
 {
  $file = $this->_file($key);
 
  /** 文件不存在或目录不可写 */
  if (!file_exists($file) || !$this->is_really_writable($file))
  {
   return false;
  }
 
  /** 缓存没有过期,仍然可用 */
  if ( time() _cache_expire) )
  {
  
   $data = $this->read_file($file);
  
   if(FALSE !== $data)
   {
    return unserialize($data);
   }
  
   return FALSE;
  }
 
  /** 缓存过期,删除之 */
  @unlink($file);
  return FALSE;
  }
 
  function read_file($file)
 {
  if ( ! file_exists($file))
  {
   return FALSE;
  }
 
  if (function_exists('file_get_contents'))
  {
   return file_get_contents($file); 
  }

  if ( ! $fp = @fopen($file, FOPEN_READ))
  {
   return FALSE;
  }
 
  flock($fp, LOCK_SH);//读取之前加上共享锁
 
  $data = '';
  if (filesize($file) > 0)
  {
   $data =& fread($fp, filesize($file));
  }

  flock($fp, LOCK_UN);//释放锁
  fclose($fp);

  return $data;
 }
 
  function write_file($path, $data, $mode = FOPEN_WRITE_CREATE_DESTRUCTIVE)
 {
  if ( ! $fp = @fopen($path, $mode))
  {
   return FALSE;
  }
 
  flock($fp, LOCK_EX);
  fwrite($fp, $data);
  flock($fp, LOCK_UN);
  fclose($fp);
 
  return TRUE;
 }
 function is_really_writable($file)//兼容各平台判断文件是否有写入权限
 {
  // If we're on a Unix server with safe_mode off we call is_writable
  if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE)
  {
   return is_writable($file);
  }
 
  // For windows servers and safe_mode "on" installations we'll actually
  // write a file then read it.  Bah...
  if (is_dir($file))
  {
   $file = rtrim($file, '/').'/'.md5(rand(1,100));
 
   if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
   {
    return FALSE;
   }
 
   fclose($fp);
   @chmod($file, DIR_WRITE_MODE);
   @unlink($file);
   return TRUE;
  }
  elseif (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
  {
   return FALSE;
  }
 
  fclose($fp);
  return TRUE;
 }
}
$cache = new FileCache(30,'cache/');
$cache->set('test','this is a test.');
print $cache->get('test');
/* End of file FlieCache.php */


 

例3.自己觉得很好用的php文件缓存

 代码如下 复制代码

class cache

 private static $_instance = null;

    protected $_options = array(
        'cache_dir'        => "./",
        'file_name_prefix' => 'cache',
     'mode'            => '1', //mode 1 为serialize model 2为保存为可执行文件
    ); 
 
 /**
  * 得到本类实例
  *
  * @return Ambiguous
  */
 public static function getInstance()
 {
  if(self::$_instance === null)
  {
   self::$_instance = new self();
  }
  return self::$_instance;
 }
 
 /**
  * 得到缓存信息
  *
  * @param string $id
  * @return boolean|array
  */
 public static function get($id)
 {
  $instance = self::getInstance();
  
  //缓存文件不存在
  if(!$instance->has($id))
  {
   return false;
  }
  
  $file = $instance->_file($id);
  
  $data = $instance->_fileGetContents($file);
  
  if($data['expire'] == 0 || time()   {
   return $data['contents'];
  }
  return false;
 }
 
 /**
  * 设置一个缓存
  *
  * @param string $id   缓存id
  * @param array  $data 缓存内容
  * @param int    $cacheLife 缓存生命 默认为0无限生命
  */
 public static function set($id, $data, $cacheLife = 0)
 {
  $instance = self::getInstance();
  
  $time = time();
  $cache      = array();
  $cache['contents'] = $data;
  $cache['expire']   = $cacheLife === 0 ? 0 : $time + $cacheLife;
  $cache['mtime']    = $time;
  
  $file = $instance->_file($id);
  
  return $instance->_filePutContents($file, $cache);
 }
 
    /**
     * 清除一条缓存
     *
     * @param string cache id 
     * @return void
     */  
 public static function delete($id)
 {
  $instance = self::getInstance();
  
  if(!$instance->has($id))
  {
   return false;
  }
     $file = $instance->_file($id);
     //删除该缓存
     return unlink($file);
 }
 
 /**
  * 判断缓存是否存在
  *
  * @param string $id cache_id
  * @return boolean true 缓存存在 false 缓存不存在
  */
 public static function has($id)
 {
  $instance = self::getInstance();
  $file     = $instance->_file($id);
  
  if(!is_file($file))
  {
   return false;
  }
  return true;
 }
 
 /**
  * 通过缓存id得到缓存信息路径
  * @param string $id
  * @return string 缓存文件路径
  */
 protected function _file($id)
 {
  $instance  = self::getInstance();
  $fileNmae  = $instance->_idToFileName($id);
  return $instance->_options['cache_dir'] . $fileNmae;
 } 
 
 /**
  * 通过id得到缓存信息存储文件名
  *
  * @param  $id
  * @return string 缓存文件名
  */
 protected function _idToFileName($id)
 {
  $instance  = self::getInstance();
  $prefix    = $instance->_options['file_name_prefix'];
  return $prefix . '---' . $id;
 }
 
 /**
  * 通过filename得到缓存id
  *
  * @param  $id
  * @return string 缓存id
  */
 protected function _fileNameToId($fileName)
 {
  $instance  = self::getInstance();
  $prefix    = $instance->_options['file_name_prefix'];
  return preg_replace('/^' . $prefix . '---(.*)$/', '$1', $fileName);
 }
 
 /**
  * 把数据写入文件
  *
  * @param string $file 文件名称
  * @param array  $contents 数据内容
  * @return bool
  */
 protected function _filePutContents($file, $contents)
 {
  if($this->_options['mode'] == 1)
  {
   $contents = serialize($contents);
  }
  else
  {
   $time = time(); 
         $contents = "                  " // mktime: ". $time. "n".
                 " return ".
                 var_export($contents, true).
                 "n?>";
  }
  
  $result = false;
     $f = @fopen($file, 'w');
        if ($f) {
            @flock($f, LOCK_EX);
            fseek($f, 0);
            ftruncate($f, 0);
            $tmp = @fwrite($f, $contents);
            if (!($tmp === false)) {
                $result = true;
            }
            @fclose($f);
        }
  @chmod($file,0777);
  return $result;    
 }
 
 /**
  * 从文件得到数据
  *
  * @param  sring $file
  * @return boolean|array
  */
 protected function _fileGetContents($file)
 {
  if(!is_file($file))
  {
   return false;
  }
  
  if($this->_options['mode'] == 1)
  {
   $f = @fopen($file, 'r');
   @$data = fread($f,filesize($file));
   @fclose($f);
   return unserialize($data);
  }
  else
  {
   return include $file;
  }
 }
 
 /**
  * 构造函数
  */
 protected function __construct()
 {
 
 }
 
 /**
  * 设置缓存路径
  *
  * @param string $path
  * @return self
  */
 public static function setCacheDir($path)
 {
  $instance  = self::getInstance();
        if (!is_dir($path)) {
            exit('file_cache: ' . $path.' 不是一个有效路径 ');
        }
        if (!is_writable($path)) {
            exit('file_cache: 路径 "'.$path.'" 不可写');
        }
   
        $path = rtrim($path,'/') . '/';
        $instance->_options['cache_dir'] = $path;
       
        return $instance;
 }
 
 /**
  * 设置缓存文件前缀
  *
  * @param srting $prefix
  * @return self
  */
 public static function setCachePrefix($prefix)
 {
  $instance  = self::getInstance();
  $instance->_options['file_name_prefix'] = $prefix;
  return $instance;
 }
 
 /**
  * 设置缓存存储类型
  *
  * @param int $mode
  * @return self
  */
 public static function setCacheMode($mode = 1)
 {
  $instance  = self::getInstance();
  if($mode == 1)
  {
   $instance->_options['mode'] = 1;
  }
  else
  {
   $instance->_options['mode'] = 2;
  }
  
  return $instance;
 }
 
 /**
  * 删除所有缓存
  * @return boolean
  */
 public static function flush()
 {
  $instance  = self::getInstance();
  $glob = @glob($instance->_options['cache_dir'] . $instance->_options['file_name_prefix'] . '--*');
  
  if(empty($glob))
  {
   return false;
  }
  
  foreach ($glob as $v)
  {
   $fileName = basename($v);
   $id =  $instance->_fileNameToId($fileName);
   $instance->delete($id);
  }
  return true;
 }
}

/* 初始化设置cache的配置信息什么的 */
cache::setCachePrefix('core'); //设置缓存文件前缀
cache::setCacheDir('./cache'); //设置存放缓存文件夹路径

//模式1 缓存存储方式
//a:3:{s:8:"contents";a:7:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:34;i:4;i:5;i:5;i:6;i:6;i:6;}s:6:"expire";i:0;s:5:"mtime";i:1318218422;}
//模式2 缓存存储方式
/*
   // mktime: 1318224645
 return array (
  'contents' =>
  array (
    0 => 1,
    1 => 2,
    2 => 3,
    3 => 34,
    4 => 5,
    5 => 6,
    6 => 6,
  ),
  'expire' => 0,
  'mtime' => 1318224645,
)
?>
 *
 *
 */
cache::setCacheMode('2');

if(!$row = cache::get('zj2'))
{
 
 $array = array(1,2,3,34,5,6,6);
 $row = cache::set('zj2',$array);
}
// cache::flush(); 清空所有缓存

print_r($row);
 
件缓存 class    

/**
 * 文件缓存类
 * @author  xiaojiong & 290747680@qq.com
 * @date 2011-08-17
 */
class cache
{
 const FILE_LIFE_KEY = 'FILE_LIFE_KEY';
 
 const CLEAR_ALL_KEY = 'CLEAR_ALL';
 
    static $_instance = null;
 
    protected $_options = array(
        'cache_dir' => './cache',
        'file_locking' => true,
        'file_name_prefix' => 'cache',
        'cache_file_umask' => 0777,
     'file_life'  => 100000
    );
   
    static function &getInstance($options = array())
    {
     if(self::$_instance === null)
     {
      self::$_instance = new self($options);
     } 
     return self::$_instance;
    }
   
    /**
     * 设置参数
     * @param  array $options 缓存参数
     * @return void
     */
 static function &setOptions($options = array())
 {
         return self::getInstance($options);
 }
 
    /**
     * 构造函数
     * @param  array $options 缓存参数
     * @return void
     */
    private function __construct($options = array())
    {  
        if ($this->_options['cache_dir'] !== null) {
   
   $dir = rtrim($this->_options['cache_dir'],'/') . '/';
         $this->_options['cache_dir'] = $dir;
        
   if (!is_dir($this->_options['cache_dir'])) {
             mkdir($this->_options['cache_dir'],0777,TRUE);
         }
         if (!is_writable($this->_options['cache_dir'])) {
             exit('file_cache: 路径 "'. $this->_options['cache_dir'] .'" 不可写');
         }
     
        } else {
           exit('file_cache: "options" cache_dir 不能为空 ');
        }
    }

    /**
     * 设置缓存路径
     * @param  string  $value
     * @return void
     */
    static function setCacheDir($value)
    {
     $self = & self::getInstance();
     
        if (!is_dir($value)) {
            exit('file_cache: ' . $value.' 不是一个有效路径 ');
        }
        if (!is_writable($value)) {
            exit('file_cache: 路径 "'.$value.'" 不可写');
        }
   
        $value = rtrim($this->_options['cache_dir'],'/') . '/';
       
        $self->_options['cache_dir'] = $value;
    }
   
    /**
     * 存入缓存数据
     * @param  array  $data          放入缓存的数据
     * @param  string $id            缓存id(又名缓存识别码)
     * @param  cache_life            缓存时间
     * @return boolean True if no problem
     */
    static function save($data, $id = null, $cache_life = null)
    {
     $self = & self::getInstance();
        if (!$id) {
            if ($self->_id) {
                $id = $self->_id;
            } else {
                exit('file_cache:save() id 不能为空!');
            }
        }
        $time = time();
       
        if($cache_life) {
         $data[self::FILE_LIFE_KEY] = $time + $cache_life;
        }
  elseif
  ($cache_life != 0){
         $data[self::FILE_LIFE_KEY] = $time + $self->_options['file_life'];
        }
       
        $file = $self->_file($id);
       
        $data = "                 " // mktime: ". $time. "n".
                " return ".
                var_export($data, true).
                "n?>"
                ;
       
        $res = $self->_filePutContents($file, $data);
        return $res;
    }
   
   
    /**
     * 得到缓存信息
     *
     * @param  string  $id  缓存id
     * @return string|array 缓存数据
     */
    static function load($id)
    {
        $self = & self::getInstance();
     $time = time();
     //检测缓存是否存在
     if (!$self->test($id)) {
            // The cache is not hit !
            return false;
        }
       
  //全部清空识别文件
        $clearFile = $self->_file(self::CLEAR_ALL_KEY);
  
  $file = $self->_file($id);
  
        //判断缓存是否已被全部清除
     if(is_file($clearFile) && filemtime($clearFile) > filemtime($file))
     {
      return false;
     }
      
        $data = $self->_fileGetContents($file);
      if(empty($data[self::FILE_LIFE_KEY]) || $time             unset($data[self::FILE_LIFE_KEY]);
       return $data;   
      }
      return false;
    }   
   
    /**
     * 写入缓存文件
     *
     * @param  string $file   缓存路径
     * @param  string $string 缓存信息
     * @return boolean true 成功
     */
    protected function _filePutContents($file, $string)
    {
     $self = & self::getInstance();
        $result = false;
        $f = @fopen($file, 'ab+');
        if ($f) {
            if ($self->_options['file_locking']) @flock($f, LOCK_EX);
            fseek($f, 0);
            ftruncate($f, 0);
            $tmp = @fwrite($f, $string);
            if (!($tmp === false)) {
                $result = true;
            }
            @fclose($f);
        }
        @chmod($file, $self->_options['cache_file_umask']);
        return $result;
    }
   
    /**
     * 格式化后的缓存文件路径
     *
     * @param  string $id 缓存id
     * @return string 缓存文件名(包括路径)
     */
    protected function _file($id)
    {
     $self = & self::getInstance();
        $fileName = $self->_idToFileName($id);
        return $self->_options['cache_dir'] . $fileName;
    }   
   
    /**
     * 格式化后的缓存文件名字
     *
     * @param  string $id 缓存id
     * @return string 缓存文件名
     */
    protected function _idToFileName($id)
    {
     $self = & self::getInstance();
        $self->_id = $id;
        $prefix = $self->_options['file_name_prefix'];
        $result = $prefix . '---' . $id;
        return $result;
    }  
   
    /**
     * 判断缓存是否存在
     *
     * @param  string $id Cache id
     * @return boolean True 缓存存在 False 缓存不存在
     */
    static function test($id)
    {
     $self = & self::getInstance();
        $file = $self->_file($id);
       
        if (!is_file($file)) {
            return false;
        }
       
        return true;
    }
   
    /**
     * 得到缓存信息
     *
     * @param  string $file 缓存路径
     * @return string 缓存内容
     */
    protected function _fileGetContents($file)
    {
        if (!is_file($file)) {
            return false;
        }
        return include $file;
    }    
   
    /**
     * 清除所有缓存
     *
     * @return void
     */   
    static function clear()
    {
     $self = & self::getInstance();
     $self->save('CLEAR_ALL',self::CLEAR_ALL_KEY); 
    }  
 
    /**
     * 清除一条缓存
     *
     * @param string cache id 
     * @return void
     */  
    static function del($id)
    {
  $self = & self::getInstance();
     if(!$self->test($id)){
      // 该缓存不存在
      return false;
     }
     $file = $self->_file($id);
     return unlink($file);
    } 
}

存入数据

$config = array(
 'name' => 'xiaojiong',
 'qq'   => '290747680',
 'age'  => '20',
);

//第一个参数 缓存data
//第二个参数 缓存id
//第三个参数 cache_life 0 永不过期(cache::clear()清空所有除外) 默认cache_life 为option_cache_life
cache::save($config,'config',0);

载入数据

//只有一个参数 cache_id
$config = cache::load('config');

清空缓存

//清空指定缓存
cache::del('config');
//清空所有缓存
cache::clear();

cache信息配置

//在执行所有cache_func前调用

$_options = array(
    'cache_dir' => './cache', //缓存文件目录
    'file_name_prefix' => 'cache',//缓存文件前缀
    'file_life'  => 100000, //缓存文件生命
);
cache::setOptions($options);

//再执行 就会按着新配置信息执行,否则是默认信息
cache::save($arr,'arr');


//就是这个方法 貌似不合理 望大家指点

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

CakePHP 项目配置 CakePHP 项目配置 Sep 10, 2024 pm 05:25 PM

在本章中,我们将了解CakePHP中的环境变量、常规配置、数据库配置和电子邮件配置。

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

CakePHP 日期和时间 CakePHP 日期和时间 Sep 10, 2024 pm 05:27 PM

为了在 cakephp4 中处理日期和时间,我们将使用可用的 FrozenTime 类。

CakePHP 文件上传 CakePHP 文件上传 Sep 10, 2024 pm 05:27 PM

为了进行文件上传,我们将使用表单助手。这是文件上传的示例。

CakePHP 路由 CakePHP 路由 Sep 10, 2024 pm 05:25 PM

在本章中,我们将学习以下与路由相关的主题?

讨论 CakePHP 讨论 CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP 是 PHP 的开源框架。它的目的是使应用程序的开发、部署和维护变得更加容易。 CakePHP 基于类似 MVC 的架构,功能强大且易于掌握。模型、视图和控制器 gu

如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

CakePHP 创建验证器 CakePHP 创建验证器 Sep 10, 2024 pm 05:26 PM

可以通过在控制器中添加以下两行来创建验证器。

See all articles