Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in die PHP-Caching-Technologie und den Implementierungscode von PHP-Caching

Detaillierte Einführung in die PHP-Caching-Technologie und den Implementierungscode von PHP-Caching

高洛峰
高洛峰Original
2016-11-29 10:18:47971Durchsuche

Einige Informationen, wie z. B. Informationen, die oft konstant sind, sich aber dennoch ändern können, werden im Cache abgelegt, um die Anzeige zu beschleunigen. Unter dem sogenannten Cache werden im Allgemeinen einige gemeinsam genutzte Informationen verstanden Serverseitig. Es lebt und stirbt mit dem Server. Beim Speichern des Caches können wir den Zeitpunkt des nächsten Updates angeben.

Datencache Der hier erwähnte PHP-Caching-Mechanismus für Datenbankabfragen erkennt bei jedem Zugriff auf eine Seite zunächst, ob die entsprechenden zwischengespeicherten Daten vorhanden sind. Wenn sie nicht vorhanden sind, stellt er eine Verbindung zur Datenbank her, ruft die Daten ab und serialisiert die Abfrageergebnisse und speichern Sie sie in einer Datei. In Zukunft werden dieselben Abfrageergebnisse direkt aus der Cache-Tabelle oder -Datei abgerufen.

Das am weitesten verbreitete Beispiel ist die Suchfunktion von Discuz, die die Ergebnis-ID in einer Tabelle zwischenspeichert und bei der nächsten Suche nach demselben Schlüsselwort zuerst die Cache-Tabelle durchsucht.

Wenn mehrere Tabellen verknüpft sind, ist es eine übliche Methode, ein Array zu generieren und den Inhalt der angehängten Tabelle in einem Feld in der Haupttabelle zu speichern. Der Vorteil dieser Methode besteht darin Der Nachteil besteht darin, dass zum Synchronisieren der beiden Daten immer ein Engpass besteht.

Seiten-Cache:

Jedes Mal, wenn Sie auf eine Seite zugreifen, wird zunächst erkannt, ob die entsprechende zwischengespeicherte Seitendatei vorhanden ist. Wenn sie nicht vorhanden ist, stellen Sie eine Verbindung zur Datenbank her, rufen Sie die Daten ab und zeigen Sie sie an Laden Sie die Seite herunter und generieren Sie gleichzeitig eine Cache-Seitendatei, sodass die Seitendatei beim nächsten Besuch aktiviert wird. (Template-Engines und einige gängige PHP-Caching-Mechanismusklassen im Internet verfügen normalerweise über diese Funktion)

Zeitgesteuerter Cache:

Überprüfen Sie, ob die Datei vorhanden ist und der Zeitstempel kleiner als die festgelegte Ablaufzeit ist . Wenn die Datei geändert wird. Wenn der Zeitstempel größer als der aktuelle Zeitstempel abzüglich des Ablaufzeitstempels ist, verwenden Sie den Cache, andernfalls aktualisieren Sie den Cache.

Inhaltsgesteuertes Caching:

Erzwingt die Aktualisierung des PHP-Cache-Mechanismus, wenn Daten eingefügt oder aktualisiert werden.

Statischer Cache:

Der hier erwähnte statische Cache bezieht sich auf statische, direkt generierte Textdateien wie HTML oder XML und deren Neugenerierung bei Aktualisierungen, was für Seiten geeignet ist, bei denen dies nicht der Fall ist viel ändern, lasst uns nicht mehr darüber reden.

Der obige Inhalt ist eine Lösung auf Codeebene. Ich bin zu faul, ihn zu ändern. Der Inhalt ist ähnlich, er ist einfach zu machen und kann auf verschiedene Arten verwendet werden, aber wie folgt Der Inhalt ist für den Server bestimmt. End-End-Caching-Lösungen, nicht auf Codeebene, erfordern die Zusammenarbeit mehrerer Parteien, um

Speicher-Caching zu erreichen:

Memcached ist ein leistungsstarkes, verteiltes Speicherobjekt PHP Caching-Mechanismus-System zur Reduzierung der Datenbanklast und Verbesserung der Zugriffsgeschwindigkeit in dynamischen Anwendungen.

PHP-Puffer:

Es gibt Eaccelerator, APC, PHPA, Xcache. Ich werde nicht viele davon durchsuchen und selbst sehen Sache, OK

MYSQL-Cache:

Dies wird auch als Nicht-Code-Ebene angesehen. Schauen Sie sich die Laufzeit unten an, 0,09xxx und dergleichen
Ich werde Veröffentlichen Laut dem vom Mann in Blau geänderten Teil von my.ini kann die 2G-MYISAM-Tabelle etwa 0,05 S betragen. Es wird gesagt, dass er sie fast ein Jahr lang geändert hat

Web-Cache basierend auf Reverse Proxy:

Wie Nginx, SQUID, mod_proxy (Apache2 und höher sind in mod_proxy und mod_cache unterteilt)
Beispiele für NGINX

Verwenden Sie Google, um einige Methoden der PHP-Caching-Technologie zu finden

Senden Sie mir eine PHP-Caching-Implementierung, implementiert APC- und Datei-Caching und erbt Cache_Abstract, um Caching-Tools von Drittanbietern aufzurufen.

Siehe Shindigs Cache-Klasse und APC.

<?php   
class CacheException extends Exception {}   
/**  
 * <a href="http://www.php.cn/category/79.html">缓存</a>抽象类  
 */  
abstract class Cache_Abstract {   
    /**  
     * 读<a href="http://www.php1.cn/category/79.html">缓存</a>变量  
     *  
     * @param string $key <a href="http://www.php.cn/category/79.html">缓存</a>下标  
     * @return mixed  
     */  
    abstract public function fetch($key);   
        
    /**  
     * <a href="http://www.php.cn/category/79.html">缓存</a>变量  
     *  
     * @param string $key <a href="http://www.php.cn/category/79.html">缓存</a>变量下标  
     * @param string $value <a href="http://www.php.cn/category/79.html">缓存</a>变量的值  
     * @return bool  
     */  
    abstract public function store($key, $value);   
        
    /**  
     * 删除<a href="http://www.php.cn/category/79.html">缓存</a>变量  
     *  
     * @param string $key <a href="http://www.php.cn/category/79.html">缓存</a>下标  
     * @return Cache_Abstract  
     */  
    abstract public function delete($key);   
        
    /**  
     * 清(删)除所有<a href="http://www.php.cn/category/79.html">缓存</a>  
     *  
     * @return Cache_Abstract  
     */  
    abstract public function clear();   
        
    /**  
     * 锁定<a href="http://www.php.cn/category/79.html">缓存</a>变量  
     *  
     * @param string $key <a href="http://www.php.cn/category/79.html">缓存</a>下标  
     * @return Cache_Abstract  
     */  
    abstract public function lock($key);   
    
    /**  
     * <a href="http://www.php.cn/category/79.html">缓存</a>变量解锁  
     *  
     * @param string $key <a href="http://www.php.cn/category/79.html">缓存</a>下标  
     * @return Cache_Abstract  
     */  
    abstract public function unlock($key);   
    
    /**  
     * 取得<a href="http://www.php.cn/category/79.html">缓存</a>变量是否被锁定  
     *  
     * @param string $key <a href="http://www.php.cn/category/79.html">缓存</a>下标  
     * @return bool  
     */  
    abstract public function isLocked($key);   
    
    /**  
     * 确保不是锁定状态  
     * 最多做$tries次睡眠等待解锁,超时则跳过并解锁  
     *  
     * @param string $key <a href="http://www.php.cn/category/79.html">缓存</a>下标  
     */  
    public function checkLock($key) {   
        if (!$this->isLocked($key)) {   
            return $this;   
        }   
            
        $tries = 10;   
        $count = 0;   
        do {   
            usleep(200);   
            $count ++;   
        } while ($count <= $tries && $this->isLocked($key));  // 最多做十次睡眠等待解锁,超时则跳过并解锁   
    
        $this->isLocked($key) && $this->unlock($key);   
            
        return $this;   
    }   
}   
    
    
/**  
 * APC扩展<a href="http://www.php.cn/category/79.html">缓存</a>实现  
 *   
 *   
 * @category   Mjie  
 * @package    Cache  
 * @author     流水孟春  
 * @copyright  Copyright (c) 2008- <cmpan(at)qq.com>  
 * @license    New BSD License  
 * @version    $Id: Cache/Apc.php 版本号 2010-04-18 23:02 cmpan $  
 */  
class Cache_Apc extends Cache_Abstract {   
        
    protected $_prefix = &#39;cache.mjie.net&#39;;   
        
    public function __construct() {   
        if (!function_exists(&#39;apc_cache_info&#39;)) {   
            throw new CacheException(&#39;apc extension didn&#39;t installed&#39;);   
        }   
    }   
        
    /**  
     * 保存<a href="http://www.php.cn/category/79.html">缓存</a>变量  
     *  
     * @param string $key  
     * @param mixed $value  
     * @return bool  
     */  
    public function store($key, $value) {   
        return apc_store($this->_storageKey($key), $value);   
    }   
        
    /**  
     * 读取<a href="http://www.php.cn/category/79.html">缓存</a>  
     *  
     * @param string $key  
     * @return mixed  
     */  
    public function fetch($key) {   
        return apc_fetch($this->_storageKey($key));   
    }   
        
    /**  
     * 清除<a href="http://www.php.cn/category/79.html">缓存</a>  
     *  
     * @return Cache_Apc  
     */  
    public function clear() {   
        apc_clear_cache();   
        return $this;   
    }   
        
    /**  
     * 删除<a href="http://www.php.cn/category/79.html">缓存</a>单元  
     *  
     * @return Cache_Apc  
     */  
    public function delete($key) {   
        apc_delete($this->_storageKey($key));   
        return $this;   
    }   
        
    /**  
     * <a href="http://www.php.cn/category/79.html">缓存</a>单元是否被锁定  
     *  
     * @param string $key  
     * @return bool  
     */  
    public function isLocked($key) {   
        if ((apc_fetch($this->_storageKey($key) . &#39;.lock&#39;)) === false) {   
            return false;   
        }   
            
        return true;   
    }   
        
    /**  
     * 锁定<a href="http://www.php.cn/category/79.html">缓存</a>单元  
     *  
     * @param string $key  
     * @return Cache_Apc  
     */  
    public function lock($key) {   
        apc_store($this->_storageKey($key) . &#39;.lock&#39;, &#39;&#39;, 5);   
        return $this;   
    }   
        
    /**  
     * <a href="http://www.php.cn/category/79.html">缓存</a>单元解锁  
     *  
     * @param string $key  
     * @return Cache_Apc  
     */  
    public function unlock($key) {   
        apc_delete($this->_storageKey($key) . &#39;.lock&#39;);   
        return $this;   
    }   
        
    /**  
     * 完整<a href="http://www.php.cn/category/79.html">缓存</a>名  
     *  
     * @param string $key  
     * @return string  
     */  
    private function _storageKey($key) {   
        return $this->_prefix . &#39;_&#39; . $key;   
    }   
}   
    
/**  
 * 文件<a href="http://www.php.cn/category/79.html">缓存</a>实现  
 *   
 *   
 * @category   Mjie  
 * @package    Cache  
 * @author     流水孟春  
 * @copyright  Copyright (c) 2008- <cmpan(at)qq.com>  
 * @license    New BSD License  
 * @version    $Id: Cache/File.php 版本号 2010-04-18 16:46 cmpan $  
 */  
class Cache_File extends Cache_Abstract {   
    public $useSubdir     = false;   
        
    protected $_cachesDir = &#39;cache&#39;;   
        
    public function __construct() {   
        if (defined(&#39;DATA_DIR&#39;)) {   
            $this->_setCacheDir(DATA_DIR . &#39;/cache&#39;);   
        }   
    }   
        
    /**  
     * 获取<a href="http://www.php.cn/category/79.html">缓存</a>文件  
     *  
     * @param string $key  
     * @return string  
     */  
    protected function _getCacheFile($key) {   
        $subdir = $this->useSubdir ? substr($key, 0, 2) . &#39;/&#39; : &#39;&#39;;   
        return $this->_cachesDir . &#39;/&#39; . $subdir . $key . &#39;.php&#39;;   
    }   
    
    /**  
     * 读取<a href="http://www.php.cn/category/79.html">缓存</a>变量  
     * 为防止信息泄露,<a href="http://www.php.cn/category/79.html">缓存</a>文件格式为php文件,并以"<?php exit;?>"开头  
     *   
     * @param string $key <a href="http://www.php.cn/category/79.html">缓存</a>下标  
     * @return mixed  
     */  
    public function fetch($key) {   
        $cacheFile = self::_getCacheFile($key);   
        if (file_exists($cacheFile) && is_readable($cacheFile)) {   
            // include 方式   
            //return include $cacheFile;   
            // 系列化方式   
    
            return unserialize(@file_get_contents($cacheFile, false, NULL, 13));   
        }   
    
        return false;   
    }   
    
    /**  
     * <a href="http://www.php.cn/category/79.html">缓存</a>变量  
     * 为防止信息泄露,<a href="http://www.php.cn/category/79.html">缓存</a>文件格式为php文件,并以"<?php exit;?>"开头  
     *  
     * @param string $key <a href="http://www.php.cn/category/79.html">缓存</a>变量下标  
     * @param string $value <a href="http://www.php.cn/category/79.html">缓存</a>变量的值  
     * @return bool  
     */  
    public function store($key, $value) {   
        $cacheFile = self::_getCacheFile($key);   
        $cacheDir  = dirname($cacheFile);   
    
        if(!is_dir($cacheDir)) {   
            if(!@mkdir($cacheDir, 0755, true)) {   
                throw new CacheException("Could not make cache directory");   
            }   
        }   
    // 用include方式   
        //return @file_put_contents($cacheFile, &#39;<?php return &#39; . var_export($value, true). &#39;;&#39;);   
    
        return @file_put_contents($cacheFile, &#39;<?php exit;?>&#39; . serialize($value));   
    }   
    
    /**  
     * 删除<a href="http://www.php.cn/category/79.html">缓存</a>变量  
     *  
     * @param string $key <a href="http://www.php.cn/category/79.html">缓存</a>下标  
     * @return Cache_File  
     */  
    public function delete($key) {   
        if(emptyempty($key)) {   
            throw new CacheException("Missing argument 1 for Cache_File::delete()");   
        }   
            
        $cacheFile = self::_getCacheFile($key);   
        if(!@unlink($cacheFile)) {   
            throw new CacheException("Cache file could not be deleted");   
        }   
    
        return $this;   
    }   
    
    /**  
     * <a href="http://www.php.cn/category/79.html">缓存</a>单元是否已经锁定  
     *  
     * @param string $key  
     * @return bool  
     */  
    public function isLocked($key) {   
        $cacheFile = self::_getCacheFile($key);   
        clearstatcache();   
        return file_exists($cacheFile . &#39;.lock&#39;);   
    }   
    
    /**  
     * 锁定  
     *  
     * @param string $key  
     * @return Cache_File  
     */  
    public function lock($key) {   
        $cacheFile = self::_getCacheFile($key);   
        $cacheDir  = dirname($cacheFile);   
        if(!is_dir($cacheDir)) {   
            if(!@mkdir($cacheDir, 0755, true)) {   
                if(!is_dir($cacheDir)) {   
                    throw new CacheException("Could not make cache directory");   
                }   
            }   
        }   
    
        // 设定<a href="http://www.php.cn/category/79.html">缓存</a>锁文件的访问和修改时间   
        @touch($cacheFile . &#39;.lock&#39;);   
        return $this;   
    }   
      
    /**  
     * 解锁  
     *  
     * @param string $key  
     * @return Cache_File  
     */  
    public function unlock($key) {   
        $cacheFile = self::_getCacheFile($key);   
        @unlink($cacheFile . &#39;.lock&#39;);   
        return


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn