Maison > développement back-end > tutoriel php > Code et utilisation de la classe d'outils pour PHP pour implémenter la mise en cache des pages Web

Code et utilisation de la classe d'outils pour PHP pour implémenter la mise en cache des pages Web

墨辰丷
Libérer: 2023-03-30 21:34:02
original
2453 Les gens l'ont consulté

Ce que cet article partage avec vous, c'est le code et l'utilisation de la classe d'outils pour implémenter la mise en cache des pages Web en PHP. C'est très pratique et les amis dans le besoin peuvent s'y référer.

Lorsque les programmes PHP résistent à un accès à un trafic important, les sites Web dynamiques sont souvent difficiles à supporter, un mécanisme de mise en cache doit donc être introduit. Généralement, il existe deux types de caches

1. >

2. Mise en cache des résultats des requêtes de données, utilisation de la mémoire pour implémenter le cache

Cet exemple utilise principalement la mise en cache de fichiers.

Le principe principal est d'utiliser la fonction cache pour stocker les résultats d'affichage de la page Web. S'il est rappelé dans le délai spécifié, le fichier cache peut être chargé.

Code de l'outil :

// 文件缓存类
class Cache {
  /**
   * $dir : 缓存文件存放目录
   * $lifetime : 缓存文件有效期,单位为秒
   * $cacheid : 缓存文件路径,包含文件名
   * $ext : 缓存文件扩展名(可以不用),这里使用是为了查看文件方便
   */
  private $dir;
  private $lifetime;
  private $cacheid;
  private $ext;
  /**
   * 析构函数,检查缓存目录是否有效,默认赋值
   */
  function __construct($dir = '', $lifetime = 1800) {
    if ($this->dir_isvalid ( $dir )) {
      $this->dir = $dir;
      $this->lifetime = $lifetime;
      $this->ext = '.Php';
      $this->cacheid = $this->getcacheid ();
    }
  }
  /**
   * 检查缓存是否有效
   */
  private function isvalid() {
    if (! file_exists ( $this->cacheid ))
      return false;
    if (! (@$mtime = filemtime ( $this->cacheid )))
      return false;
    if (mktime () - $mtime > $this->lifetime)
      return false;
    return true;
  }
  /**
   * 写入缓存
   * $mode == 0 , 以浏览器缓存的方式取得页面内容
   * $mode == 1 , 以直接赋值(通过$content参数接收)的方式取得页面内容
   * $mode == 2 , 以本地读取(fopen ile_get_contents)的方式取得页面内容(似乎这种方式没什么必要)
   */
  public function write($mode = 0, $content = '') {
    switch ($mode) {
      case 0 :
        $content = ob_get_contents ();
        break;
      default :
        break;
    }
    ob_end_flush ();
    try {
      file_put_contents ( $this->cacheid, $content );
    } catch ( Exception $e ) {
      $this->error ( '写入缓存失败!请检查目录权限!' );
    }
  }
  /**
   * 加载缓存
   * exit() 载入缓存后终止原页面程序的执行,缓存无效则运行原页面程序生成缓存
   * ob_start() 开启浏览器缓存用于在页面结尾处取得页面内容
   */
  public function load() {
    if ($this->isvalid ()) {
      // 以下两种方式,哪种方式好?????
      require_once ($this->cacheid);
      echo "<!--缓存-->";
      // echo file_get_contents($this->cacheid);
      exit ();
    } else {
      ob_start ();
    }
  }
  /**
   * 清除缓存
   */
  public function clean() {
    try {
      unlink ( $this->cacheid );
    } catch ( Exception $e ) {
      $this->error ( &#39;清除缓存文件失败!请检查目录权限!&#39; );
    }
  }
  /**
   * 取得缓存文件路径
   */
  private function getcacheid() {
    return $this->dir . md5 ( $this->geturl () ) . $this->ext;
  }
  /**
   * 检查目录是否存在或是否可创建
   */
  private function dir_isvalid($dir) {
    if (is_dir ( $dir ))
      return true;
    try {
      mkdir ( $dir, 0777 );
    } catch ( Exception $e ) {
      $this->error ( &#39;所设定缓存目录不存在并且创建失败!请检查目录权限!&#39; );
      return false;
    }
    return true;
  }
  /**
   * 取得当前页面完整url
   */
  private function geturl() {
    $url = &#39;&#39;;
    if (isset ( $_SERVER [&#39;REQUEST_URI&#39;] )) {
      $url = $_SERVER [&#39;REQUEST_URI&#39;];
    } else {
      $url = $_SERVER [&#39;Php_SELF&#39;];
      $url .= empty ( $_SERVER [&#39;QUERY_STRING&#39;] ) ? &#39;&#39; : &#39;?&#39; . $_SERVER [&#39;QUERY_STRING&#39;];
    }
    return $url;
  }
  /**
   * 输出错误信息
   */
  private function error($str) {
    echo &#39;<p style="color:red;">&#39; . $str . &#39;</p>&#39;;
  }
}
Copier après la connexion
Méthode d'utilisation :

La méthode d'utilisation est la suivante :

Une partie du code est placée devant la logique code à mettre en cache :

$cachedir = &#39;./Cache/&#39;; // 设定缓存目录
    $cache = new Cache ( $cachedir, 33 ); // 省略参数即采用缺省设置, $cache = new Cache($cachedir);
    if (@$_GET [&#39;cacheact&#39;] != &#39;rewrite&#39; || @$_GET [&#39;clearCache&#39;] == &#39;ok&#39;) // 此处为一技巧,通过xx.Php?cacheact=rewrite更新缓存,以此类推,还可以设定一些其它操作
      $cache->load (); // 装载缓存,缓存有效则不执行以下页面代码
    // 页面代码开始
Copier après la connexion
Une partie est placée derrière le code logique mis en cache :

// 页面代码结束
    $cache->write (); // 首次运行或缓存过期,生成缓存
Copier après la connexion

Résumé : Ce qui précède est tout le contenu de ce article, j'espère qu'il pourra être utile à l'apprentissage de chacun.

Recommandations associées :

Programmation d'algorithmes de loterie PHP

Utilisation des statistiques de résultats du questionnaire PHP

Application des variables, tableaux, expressions régulières et modèles PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal