Heim  >  Artikel  >  Backend-Entwicklung  >  PHP+Redis implementiert ein Ganzseiten-Caching-System

PHP+Redis implementiert ein Ganzseiten-Caching-System

藏色散人
藏色散人nach vorne
2020-09-11 13:31:435904Durchsuche

Empfohlen: „PHP-Video-Tutorial“ „redis-Tutorial

php redis implementiert ein Ganzseiten-Caching-System

Eine in einem früheren Projekt erwähnte Funktion muss sein Der Hintergrund speichert bestimmte Seiteninformationen vorab in der Datenbank, z. B. die Registrierungsvereinbarung, die Benutzervereinbarung usw. Dann wird sie in eine PHP-Seite geschrieben, und die App greift auf diese Seite zu, wenn sie die Schnittstelle aufruft Ich habe ein Problem entdeckt, diese Vereinbarungen werden normalerweise nur alle paar Monate geändert, und jedes Mal, wenn ein Benutzer diese Protokolle anzeigt, liest Nginx die Datei erneut aus der Datenbank und die Geschwindigkeit ist sehr langsam

Das folgende Bild m_about .php ist die Datenseite, die ich generiert habe.

PHP+Redis implementiert ein Ganzseiten-Caching-System

Das Laden und Neugenerieren der Datei aus der Datenbank in einer virtuellen Maschinenumgebung dauert 2,4 Sekunden (natürlich ist die tatsächliche Testumgebung schneller).

Da diese Art von Seitendaten werden selten aktualisiert. Warum nicht zwischengespeichert werden? Es gibt ein Ganzseiten-Cache-System (Ganzseiten-Cache) in den häufig verwendeten Redis-Anwendungen. Warum nicht eines schreiben und es ausprobieren?

redis verwendet die phpredis-Erweiterung. Natürlich können Sie auch die predis-Erweiterung verwenden, aber Sie müssen nur ein paar Lesefunktionen darin ändern.

Bezüglich der Schnittstelle des Cache-Systems verweise ich auf das Cache-System in Laravel Die Designoberfläche dieses Systems ist sehr übersichtlich. Es enthält nicht nur Redis, sondern kann auch Dateien, MySQL und Memcache verwenden. Natürlich verwendet der Vollseiten-Cache nicht so viele Dinge Erstens gibt es die Funktion getUrlText, mit der die Daten der gesamten Seite abgerufen werden sollen. Sie können einfach file_get_contents direkt verwenden. Natürlich können Sie sie auch in die Curl-Funktion umschreiben

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

    }

Dann gibt es mehrere Funktionen Aus dem Cache-System entlehnt, ist die Erinnerungsfunktion und der Speicher-Cache die wichtigste Schnittstelle zur Außenwelt. Sie wird im Allgemeinen direkt im Cache-System verwendet Seite ist aktualisiert, aktualisieren Sie sie.

/**
   * 记录对应的缓存,如果之前存在则返回原本的缓存
   * @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;
      }

  }

Die verbleibenden zwei Codedateien sind redisFPC.php, die Demo des vollständigen Seitencachings, und die andere ist die Datei zum Testen

fpcTest.php

Dies ist mit Github verbunden zu meinem eigenen Git-Blog. Wenn beim Herstellen einer Verbindung zu Github ein Problem auftritt, können Sie den vollständigen Code am Ende dieses Artikels sehen die entsprechenden m_ahout-Informationen, sodass es langsamer wird. Das zweite Laden wird viel schneller sein, da es von Redislimian gelesen wird Funktion zum Aufzeichnen des Caches beim ersten Caching und anschließende Aktualisierung des Caches, wenn möglich, versuchen Sie, die Cache-Ablaufzeit mit ttl festzulegen.

RedisFPC .php

/**
 * 更新缓存,并返回当前的缓存
 * @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);
}

Testcode zum Testen

Beachten Sie, dass die URL hier die lokale Cache-URL ist

<?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;
    }
}

                                                              

Das obige ist der detaillierte Inhalt vonPHP+Redis implementiert ein Ganzseiten-Caching-System. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen