Maison  >  Article  >  développement back-end  >  PHP+redis implémente un système de mise en cache pleine page

PHP+redis implémente un système de mise en cache pleine page

藏色散人
藏色散人avant
2020-09-11 13:31:435903parcourir

Recommandé : "Tutoriel vidéo PHP" "Tutoriel redis

php redis implémente un système de mise en cache de page complète

Une fonction mentionnée dans un projet précédent nécessite des informations de page pré-stockées en arrière-plan Mettre dans la base de données, comme le contrat d'enregistrement de l'application, le contrat d'utilisation, etc. Ensuite, écrivez-le dans une page php, et l'application accède à cette page lors de l'appel de l'interface. À ce moment-là, j'ai découvert un problème. Ces accords sont souvent modifiés. seulement une fois tous les quelques mois, et chaque fois que l'utilisateur consulte ces protocoles, nginx relira le fichier de la base de données, et la vitesse sera très lente

Comme indiqué ci-dessous, m_about.php est le. page de données que j'ai générée,

PHP+redis implémente un système de mise en cache pleine page

Il faut 2,4 secondes pour charger le fichier à partir de la base de données et le régénérer dans l'environnement de la machine virtuelle (bien sûr, l'environnement de test réel sera plus rapide) .

Puisque ce type de données de page est moins mis à jour, pourquoi ne pas les mettre en cache ? J'ai pensé à un système de cache pleine page (cache pleine page) dans les applications Redis courantes que j'ai examinées auparavant et. essayez-le.

Idées de code

Redis utilise l'extension phpredis Bien sûr, vous pouvez également utiliser l'extension predis. Il vous suffit de modifier quelques lectures. fonctions.

Concernant l'interface du système de cache, je fais référence au cache dans laravel ici Système. Je pense que l'interface de conception de ce système est très claire. Elle inclut non seulement Redis, mais peut également utiliser des fichiers. , mysql, memcache.

Bien sûr, le cache pleine page n'utilise pas beaucoup de choses. J'ai juste emprunté sa conception de fonction. La première est la fonction getUrlText, qui consiste à obtenir les données de la page entière. Je n'ai pas trop réfléchi ici, utilisez simplement file_get_contents directement. Bien sûr, vous pouvez également le réécrire dans la fonction curl

/**
     * 获取对应的url的信息
     * @param string $url 对应的地址
     * @return boolean|string
     */
    public function getUrlText($url)
    {
        if (empty($url)) {
            return false;
        }
        return  file_get_contents($url);

    }

. Deuxièmement, il existe plusieurs fonctions qui tirent des leçons du système de cache, rappelez-vous la fonction. , cache mémoire, c'est l'interface la plus importante avec le monde extérieur, utilisez-la généralement directement dans le système de cache

/**
   * 记录对应的缓存,如果之前存在则返回原本的缓存
   * @param string $cacheName 缓存名
   * @param string | callback $urlOrCallback 需要缓存的数据地址.可以是一个 网页地址也一个可回调类型,如果不是可回调类型,则判定是一个网址
   * @param null | int $ttl 缓存过期时间,如果不过期就是用默认值null
   * @throws \Exception 如果无法访问地址
   * @return boolean|string 缓存成功返回获取到的页面地址
   */
  public function remember($cacheName, $urlOrCallback, $ttl = null)
  {
      $value = $this->get($cacheName);//检查缓存是否存在
      if (!$value) {
          //之前没有使用键
          if (is_callable($urlOrCallback)) {
              $text = $urlOrCallback();
          } else {
              //如果不是回调类型,则尝试读取网址
              $text = $this->getUrlText($urlOrCallback);
          }

          if (empty($text)) {
              throw new \Exception('can not get value:' . $urlOrCallback);
          }
          $this->put($cacheName, $text, $ttl);
          return $text;
      } else {
          return $value;
      }

  }

fonction de rafraîchissement, fonction de rafraîchissement du cache, si la page de cache a été mise à jour, allez la rafraîchir.

/**
 * 更新缓存,并返回当前的缓存
 * @param string $cacheName 缓存名
 * @param string | callback $urlOrCallback 需要缓存的数据地址.可以是一个 网页地址也一个可回调类型,如果不是可回调类型,则判定是一个网址
 * @param null | int $ttl 过期时间,如果不过期就是用默认值null
 * @return boolean|string 缓存成功返回获取到的页面地址
 */
public function refresh($cacheName, $urlOrCallback, $ttl = null)
{
    $this->delete($cacheName);
    return $this->remember($cacheName, $urlOrCallback, $ttl);
}

Les deux fichiers de code restants L'un est redisFPC.php, qui est une démo de cache pleine page, et l'autre est un fichier de test
fpcTest.php
Voici C'est github. , connecté à mon propre blog git. S'il y a un problème de connexion à github, vous pouvez voir le code complet donné à la fin de cet article

Test

. Nous sommes ici Test, le premier chargement est plus lent car il doit lire les informations m_ahout correspondantes

PHP+redis implémente un système de mise en cache pleine page

Le deuxième chargement est beaucoup plus rapide car il est lu depuis redislimian
PHP+redis implémente un système de mise en cache pleine page

Suggestions d'utilisation

Je pense que le code a donné suffisamment d'interfaces. Utilisez la fonction de mémorisation pour enregistrer le cache lorsqu'il est mis en cache pour la première fois. si le cache change, utilisez la fonction d'actualisation pour mettre à jour le cache. Si possible, essayez d'utiliser ttl pour définir le délai d'expiration du cache

Code complet

redisFPC. php

<?php
namespace RedisFPC;
class RedisFPC
{
    /**
     * php redis的访问类
     * @var unknown
     */
    private $redis;

    /**
     * 构造函数
     * @param array $redis 使用phpredis的类
     * @param 是否连接成功
     */
    public function __construct($redis = [])
    {
    
        //$this->redis = $redis;
        $this->redis = new \Redis();
        return $this->redis->connect(&#39;127.0.0.1&#39;);
    }
    /**
     * 记录对应的缓存,如果之前存在则返回原本的缓存
     * @param string $cacheName 缓存名
     * @param string | callback $urlOrCallback 需要缓存的数据地址.可以是一个 网页地址也一个可回调类型,如果不是可回调类型,则判定是一个网址
     * @param null | int $ttl 缓存过期时间,如果不过期就是用默认值null
     * @throws \Exception 如果无法访问地址
     * @return boolean|string 缓存成功返回获取到的页面地址
     */
    public function remember($cacheName, $urlOrCallback, $ttl = null) 
    {
        $value = $this->get($cacheName);//检查缓存是否存在
        if (!$value) {
            //之前没有使用键
            if (is_callable($urlOrCallback)) {
                $text = $urlOrCallback();
            } else {
                //如果不是回调类型,则尝试读取网址
                $text = $this->getUrlText($urlOrCallback);
            }
            
            if (empty($text)) {
                throw new \Exception(&#39;can not get value:&#39; . $urlOrCallback);
            }
            $this->put($cacheName, $text, $ttl);
            return $text;
        } else {
            return $value;
        }
        
    }
    /**
     * 获取对应的缓存值
     * @param string $cacheName 缓存名
     * @return String | Bool,如果不存在返回false,否则返回对应的缓存页信息
     */
    public function get($cacheName)
    {
        return $this->redis->get($this->getKey($cacheName));
    }
    /**
     * 将对应的全页缓存保存到对应redis中
     * @param string $cacheName 缓存名
     * @param string $value
     * @param null | int $ttl 过期时间,如果不过期就是用默认值null
     * @return boolean 保存成功返回true
     */
    public function put($cacheName, $value, $ttl = null)    
    {
        if (is_null($ttl)) {
            return $this->redis->set($this->getKey($cacheName), $value);
        } else {
            return $this->redis->set($this->getKey($cacheName), $value, $ttl);
        }
        
    }
    /**
     * 删除对应缓存
     * @param string $cacheName 缓存名
     */
    public function delete($cacheName)
    {
        return $this->redis->delete($this->getKey($cacheName));
    }
    
    /**
     * 更新缓存,并返回当前的缓存
     * @param string $cacheName 缓存名
     * @param string | callback $urlOrCallback 需要缓存的数据地址.可以是一个 网页地址也一个可回调类型,如果不是可回调类型,则判定是一个网址
     * @param null | int $ttl 过期时间,如果不过期就是用默认值null
     * @return boolean|string 缓存成功返回获取到的页面地址
     */
    public function refresh($cacheName, $urlOrCallback, $ttl = null)
    {
        $this->delete($cacheName);
        return $this->remember($cacheName, $urlOrCallback, $ttl);
    }
    /**
     * 获取对应的url的信息
     * @param string $url 对应的地址
     * @return boolean|string
     */
    public function getUrlText($url)
    {
        if (empty($url)) {
            return false;
        } 
        return  file_get_contents($url);
        
    }
    /**
     * 生成全页缓存键名
     * @param string $cacheName 需要缓存的名称
     * @return string 对应的在redis中的键名
     */
    private function getKey($cacheName)
    {
        return &#39;FPC:&#39;. $cacheName;
    }
}

Code de test pour les tests
Notez que l'url ici est l'url du cache local

<?php 
use RedisFPC\RedisFPC;

require_once &#39;redisFPC.php&#39;;
/* $text = file_get_contents(&#39;http://localhost:1002/m_about.php&#39;);
var_dump($text); */
$url = &#39;http://localhost:1002/m_about.php&#39;;

$fpc = new RedisFPC();
echo $fpc->remember(&#39;服务协议&#39;, $url, 60*60*24);

                                        

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer