<article><h1>Laravel 的緩存系統</h1><ul><li><a href="#configuration">配置信息</a><ul><li><a href="#driver-prerequisites">驅動前提條件</a></li></ul></li><li><a href="#cache-usage">緩存的使用</a><ul><li><a href="#obtaining-a-cache-instance">獲取一個緩存實例</a></li><li><a href="#retrieving-items-from-the-cache">從緩存中獲取項目</a></li><li><a href="#storing-items-in-the-cache">存放項目到緩存中</a></li><li><a href="#removing-items-from-the-cache">刪除緩存中的項目</a></li><li><a href="#the-cache-helper">Cache 幫助函數</a></li></ul></li><li><a href="#cache-tags">緩存標簽</a><ul><li><a href="#storing-tagged-cache-items">寫入被標記的緩存項</a></li><li><a href="#accessing-tagged-cache-items">訪問被標記的緩存項</a></li><li><a href="#removing-tagged-cache-items">移除被標記的緩存項</a></li></ul></li><li><a href="#adding-custom-cache-drivers">增加自定義的緩存驅動</a><ul><li><a href="#writing-the-driver">寫驅動</a></li><li><a href="#registering-the-driver">注冊驅動</a></li></ul></li><li><a href="#events">緩存事件</a></li></ul><p><a name="configuration"></a></p><h2><a href="#configuration">配置信息</a></h2><p>Laravel 給多種緩存系統提供豐富而統一的 API,緩存配置信息位于 <code class=" language-php">config<span class="token operator">/</span>cache<span class="token punctuation">.</span>php</code>,在這個文件中你可以為你的應用程序指定默認的緩存驅動,Laravel 支持當前流行的緩存系統,如非常棒的 <a href="http://memcached.org">Memcached</a> 和 <a href="http://redis.io">Redis</a> 。</p><p>緩存配置信息文件中也包括很多其他選項,你可以在文件中找到這些選項,請確保你看過這些選項說明。Laravel 默認使用將序列化緩存對象保存在文件系統中的 <code class=" language-php">file</code> 緩存驅動,對于大型應用程序而言,推薦你使用如 Memcached 或者 Redis 這樣更強大的緩存驅動。你甚至可以為一個驅動配置多個緩存配置信息。</p><p><a name="driver-prerequisites"></a></p><h3>驅動前提條件</h3><h4>數據庫</h4><p>當使用 <code class=" language-php">database</code> 緩存驅動時,你需要配置一個用來存放緩存項的數據庫表,下面是一個 <code class=" language-php">Schema</code> 數據表結構聲明的示例:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Schema<span class="token punctuation">::</span></span><span class="token function">create<span class="token punctuation">(</span></span><span class="token string">'cache'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$table</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$table</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">string<span class="token punctuation">(</span></span><span class="token string">'key'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">unique<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$table</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">text<span class="token punctuation">(</span></span><span class="token string">'value'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$table</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">integer<span class="token punctuation">(</span></span><span class="token string">'expiration'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> 你也可以使用 <code class=" language-php">php artisan cache<span class="token punctuation">:</span>table</code> 這個 Artisan 命令生成一個有合適數據表結構的 migration 。</p></blockquote><h4>Memcached</h4><p>使用 Memcached 驅動需要安裝 <a href="https://pecl.php.net/package/memcached">Memcached PECL 擴展包</a> 。你可以把所有 Memcached 服務器都列在 <code class=" language-php">config<span class="token operator">/</span>cache<span class="token punctuation">.</span>php</code> 這個配置信息文件中:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'memcached'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token punctuation">[</span>
<span class="token string">'host'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'127.0.0.1'</span><span class="token punctuation">,</span>
<span class="token string">'port'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">11211</span><span class="token punctuation">,</span>
<span class="token string">'weight'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">100</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span></code></pre><p>你也可以把 <code class=" language-php">host</code> 選項配置到 UNIX 的 socket 路徑中。如果你這樣配置了,<code class=" language-php">port</code> 選項應該設置為 <code class=" language-php"><span class="token number">0</span></code> :</p><pre class=" language-php"><code class=" language-php"><span class="token string">'memcached'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token punctuation">[</span>
<span class="token string">'host'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'/var/run/memcached/memcached.sock'</span><span class="token punctuation">,</span>
<span class="token string">'port'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">,</span>
<span class="token string">'weight'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">100</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span></code></pre><h4>Redis</h4><p>在使用 Redis 作為 Laravel 的緩存驅動前,你需要通過 Composer 安裝 <code class=" language-php">predis<span class="token operator">/</span>predis</code> 擴展包 (~1.0) 或者使用 PECL 安裝 PhpRedis PHP 拓展。</p><p>關于配置 Redis 的更多信息,請參考 <a href="/docs/5.4/redis#configuration">Laravel 文檔頁面</a> 。</p><p><a name="cache-usage"></a></p><h2><a href="#cache-usage">緩存的使用</a></h2><p><a name="obtaining-a-cache-instance"></a></p><h3>獲取一個緩存實例</h3><p><code class=" language-php">Illuminate\<span class="token package">Contracts<span class="token punctuation">\</span>Cache<span class="token punctuation">\</span>Factory</span></code> 和 <code class=" language-php">Illuminate\<span class="token package">Contracts<span class="token punctuation">\</span>Cache<span class="token punctuation">\</span>Repository</span></code> <a href="/docs/5.4/contracts">contracts</a> 提供了訪問 Laravel 緩存服務的機制。<code class=" language-php">Factory</code> contract 則為你的應用程序定義了訪問所有緩存驅動的機制。<code class=" language-php">Repository</code> contract 是典型的用 <code class=" language-php">cache</code> 配置信息文件指定你的應用程序默認緩存驅動的實現。</p><p>然而,你也可以使用 <code class=" language-php">Cache</code> facade,我們將在文檔的后續中介紹。<code class=" language-php">Cache</code> facade 提供了方便又簡潔的方法訪問緩存實例:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Http<span class="token punctuation">\</span>Controllers</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Support<span class="token punctuation">\</span>Facades<span class="token punctuation">\</span>Cache</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">UserController</span> <span class="token keyword">extends</span> <span class="token class-name">Controller</span>
<span class="token punctuation">{</span>
<span class="token comment" spellcheck="true">/**
* Show a list of all users of the application.
*
* @return Response
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">index<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$value</span> <span class="token operator">=</span> <span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">get<span class="token punctuation">(</span></span><span class="token string">'key'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true"> //
</span> <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><h4>訪問多個緩存倉庫</h4><p>使用<code class=" language-php">Cache</code> facade,可通過 <code class=" language-php">store</code> 方法來訪問緩存倉庫,傳入 <code class=" language-php">store</code> 方法的鍵應該對應一個緩存配置信息文件中的 <code class=" language-php">stores</code> 配置信息數組中列出的配置值:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$value</span> <span class="token operator">=</span> <span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">store<span class="token punctuation">(</span></span><span class="token string">'file'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">get<span class="token punctuation">(</span></span><span class="token string">'foo'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">store<span class="token punctuation">(</span></span><span class="token string">'redis'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">put<span class="token punctuation">(</span></span><span class="token string">'bar'</span><span class="token punctuation">,</span> <span class="token string">'baz'</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><a name="retrieving-items-from-the-cache"></a></p><h3>從緩存中獲取項目</h3><p><code class=" language-php">Cache</code> facade 中的 <code class=" language-php">get</code> 方法用來從緩存中獲取緩存項,如果緩存中不存在該緩存項,返回 <code class=" language-php"><span class="token keyword">null</span></code> 。你也可以向 <code class=" language-php">get</code> 方法傳遞第二個參數,用來指定緩存項不存在時返回的默認值:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$value</span> <span class="token operator">=</span> <span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">get<span class="token punctuation">(</span></span><span class="token string">'key'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$value</span> <span class="token operator">=</span> <span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">get<span class="token punctuation">(</span></span><span class="token string">'key'</span><span class="token punctuation">,</span> <span class="token string">'default'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>你甚至可以將 <code class=" language-php">閉包</code> 作為默認值傳遞。如果指定的緩存項在緩存中不存在,<code class=" language-php">閉包</code> 的結果將被返回。傳遞一個閉包允許你延遲從數據庫或外部服務中取出默認值:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$value</span> <span class="token operator">=</span> <span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">get<span class="token punctuation">(</span></span><span class="token string">'key'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token scope">DB<span class="token punctuation">::</span></span><span class="token function">table<span class="token punctuation">(</span></span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">get<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><h4>確認項目是否存在</h4><p><code class=" language-php">has</code> 方法可以用來檢查一個項目是否存在于緩存中:</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">has<span class="token punctuation">(</span></span><span class="token string">'key'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment" spellcheck="true"> //
</span><span class="token punctuation">}</span></code></pre><h4>遞增與遞減值</h4><p><code class=" language-php">遞增</code> 和 <code class=" language-php">遞減</code> 方法可以用來調整緩存中整數項目值。這兩個方法都可以傳入一個可選的第二個參數,用來指示要遞增或遞減多少值:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">increment<span class="token punctuation">(</span></span><span class="token string">'key'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">increment<span class="token punctuation">(</span></span><span class="token string">'key'</span><span class="token punctuation">,</span> <span class="token variable">$amount</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">decrement<span class="token punctuation">(</span></span><span class="token string">'key'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">decrement<span class="token punctuation">(</span></span><span class="token string">'key'</span><span class="token punctuation">,</span> <span class="token variable">$amount</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><h4>獲取和更新</h4><p>有時你可能會想從緩存中取出一個項目,但也想在取出的項目不存在時存入一個默認值,例如,你可能會想從緩存中取出所有用戶,或者當用戶不存在時,從數據庫中將這些用戶取出并放入緩存中,你可以使用 Cache::remember 方法實現:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$value</span> <span class="token operator">=</span> <span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">remember<span class="token punctuation">(</span></span><span class="token string">'users'</span><span class="token punctuation">,</span> <span class="token variable">$minutes</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token scope">DB<span class="token punctuation">::</span></span><span class="token function">table<span class="token punctuation">(</span></span><span class="token string">'users'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">get<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>如果緩存項在緩存中不存在,則返回給 <code class=" language-php">remember</code> 方法的閉包將會被運行,而且閉包的運行結果將會被存放在緩存中。</p><h4>獲取和刪除</h4><p>如果你需要從緩存中獲取一個緩存項然后刪除它,你可以使用 <code class=" language-php">pull</code> 方法。像 <code class=" language-php">get</code> 方法一樣,如果緩存項在緩存中不存在,<code class=" language-php"><span class="token keyword">null</span></code> 將被返回:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$value</span> <span class="token operator">=</span> <span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">pull<span class="token punctuation">(</span></span><span class="token string">'key'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><a name="storing-items-in-the-cache"></a></p><h3>存儲項目到緩存中</h3><p>你可以使用 <code class=" language-php">Cache</code> facade 的 <code class=" language-php">put</code> 方法來存放緩存項到緩存中,當你在緩存中存放緩存項時,你需要使用第三個參數來設定緩存的存放時間:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">put<span class="token punctuation">(</span></span><span class="token string">'key'</span><span class="token punctuation">,</span> <span class="token string">'value'</span><span class="token punctuation">,</span> <span class="token variable">$minutes</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>如果要指定一個緩存項過期的分鐘數,你也可以傳遞一個 <code class=" language-php">DateTime</code> 實例來表示該緩存項過期的時間點:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$expiresAt</span> <span class="token operator">=</span> <span class="token scope">Carbon<span class="token punctuation">::</span></span><span class="token function">now<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">addMinutes<span class="token punctuation">(</span></span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">put<span class="token punctuation">(</span></span><span class="token string">'key'</span><span class="token punctuation">,</span> <span class="token string">'value'</span><span class="token punctuation">,</span> <span class="token variable">$expiresAt</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><h4>寫入目前不存在的項目</h4><p><code class=" language-php">add</code> 方法只會把暫時不存在于緩存中的緩存項放入緩存,如果存放成功將返回 <code class=" language-php"><span class="token boolean">true</span></code> ,否則返回 <code class=" language-php"><span class="token boolean">false</span></code>:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">add<span class="token punctuation">(</span></span><span class="token string">'key'</span><span class="token punctuation">,</span> <span class="token string">'value'</span><span class="token punctuation">,</span> <span class="token variable">$minutes</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><h4>永久寫入項目</h4><p><code class=" language-php">forever</code> 方法可以用來將緩存項永久存入緩存中,因為這些緩存項不會過期,所以必須通過 <code class=" language-php">forget</code> 方法手動刪除:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">forever<span class="token punctuation">(</span></span><span class="token string">'key'</span><span class="token punctuation">,</span> <span class="token string">'value'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> 如果你在使用 Memcached 驅動,那么當緩存達到大小限制時,那些「永久」保存的緩存項可能被移除。</p></blockquote><p><a name="removing-items-from-the-cache"></a></p><h3>從緩存中移除項目</h3><p>你可以使用 <code class=" language-php">forget</code> 方法從緩存中移除一個項目:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">forget<span class="token punctuation">(</span></span><span class="token string">'key'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>也可以使用 <code class=" language-php">flush</code> 方法清空所有緩存:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">flush<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><blockquote class="has-icon note"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="90px" height="90px" viewBox="0 0 90 90" enable-background="new 0 0 90 90" xml:space="preserve"><path fill="#FFFFFF" d="M45 0C20.1 0 0 20.1 0 45s20.1 45 45 45 45-20.1 45-45S69.9 0 45 0zM45 74.5c-3.6 0-6.5-2.9-6.5-6.5s2.9-6.5 6.5-6.5 6.5 2.9 6.5 6.5S48.6 74.5 45 74.5zM52.1 23.9l-2.5 29.6c0 2.5-2.1 4.6-4.6 4.6 -2.5 0-4.6-2.1-4.6-4.6l-2.5-29.6c-0.1-0.4-0.1-0.7-0.1-1.1 0-4 3.2-7.2 7.2-7.2 4 0 7.2 3.2 7.2 7.2C52.2 23.1 52.2 23.5 52.1 23.9z"></path></svg></span></div> 清空緩存并不會遵從緩存的前綴,并且會將緩存中所有的緩存項刪除。在清除與其它應用程序共享的緩存時應謹慎考慮這一點。</p></blockquote><p><a name="the-cache-helper"></a></p><h3>Cache 幫助函數</h3><p>除了可以使用 <code class=" language-php">Cache</code> facade 或者 <a href="/docs/5.4/contracts">cache contract</a>之外,你也可以使用全局幫助函數 <code class=" language-php">cache</code> 來獲取和保存緩存數據。當 <code class=" language-php">cache</code> 只接收一個字符串參數的時候,它將會返回給定鍵對應的值:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$value</span> <span class="token operator">=</span> <span class="token function">cache<span class="token punctuation">(</span></span><span class="token string">'key'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>如果你傳給函數一個鍵值對數組和過期時間,它將會把值和過期時間保存在緩存中:</p><pre class=" language-php"><code class=" language-php"><span class="token function">cache<span class="token punctuation">(</span></span><span class="token punctuation">[</span><span class="token string">'key'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'value'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token variable">$minutes</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">cache<span class="token punctuation">(</span></span><span class="token punctuation">[</span><span class="token string">'key'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'value'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token scope">Carbon<span class="token punctuation">::</span></span><span class="token function">now<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">addSeconds<span class="token punctuation">(</span></span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> 如果在測試中使用全局函數 <code class=" language-php">cache</code>,你應該使用 <code class=" language-php"><span class="token scope">Cache<span class="token punctuation">::</span></span>shouldReceive</code> 方法,就好像你在<a href="/docs/5.4/mocking#mocking-facades">測試 facade</a>一樣。</p></blockquote><p><a name="cache-tags"></a></p><h2><a href="#cache-tags">緩存標簽</a></h2><blockquote class="has-icon note"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="90px" height="90px" viewBox="0 0 90 90" enable-background="new 0 0 90 90" xml:space="preserve"><path fill="#FFFFFF" d="M45 0C20.1 0 0 20.1 0 45s20.1 45 45 45 45-20.1 45-45S69.9 0 45 0zM45 74.5c-3.6 0-6.5-2.9-6.5-6.5s2.9-6.5 6.5-6.5 6.5 2.9 6.5 6.5S48.6 74.5 45 74.5zM52.1 23.9l-2.5 29.6c0 2.5-2.1 4.6-4.6 4.6 -2.5 0-4.6-2.1-4.6-4.6l-2.5-29.6c-0.1-0.4-0.1-0.7-0.1-1.1 0-4 3.2-7.2 7.2-7.2 4 0 7.2 3.2 7.2 7.2C52.2 23.1 52.2 23.5 52.1 23.9z"></path></svg></span></div> 緩存標簽并不支持使用 <code class=" language-php">file</code> 或 <code class=" language-php">dababase</code> 的緩存驅動。此外,當在緩存使用多個標簽并「永久」寫入時,類似 <code class=" language-php">memcached</code> 的驅動性能會是最佳的,且會自動清除舊的紀錄。</p></blockquote><p><a name="storing-tagged-cache-items"></a></p><h3>寫入被標記的緩存項</h3><p>緩存標簽允許你在緩存中標記關聯的項目,并清空所有已分配指定標簽的緩存值。你可以通過傳入一組標簽名稱的有序數組,以訪問被標記的緩存。舉例來說,讓我們訪問一個被標記的緩存并 <code class=" language-php">put</code> 值給它:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">tags<span class="token punctuation">(</span></span><span class="token punctuation">[</span><span class="token string">'people'</span><span class="token punctuation">,</span> <span class="token string">'artists'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">put<span class="token punctuation">(</span></span><span class="token string">'John'</span><span class="token punctuation">,</span> <span class="token variable">$john</span><span class="token punctuation">,</span> <span class="token variable">$minutes</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">tags<span class="token punctuation">(</span></span><span class="token punctuation">[</span><span class="token string">'people'</span><span class="token punctuation">,</span> <span class="token string">'authors'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">put<span class="token punctuation">(</span></span><span class="token string">'Anne'</span><span class="token punctuation">,</span> <span class="token variable">$anne</span><span class="token punctuation">,</span> <span class="token variable">$minutes</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><a name="accessing-tagged-cache-items"></a></p><h3>訪問被標記的緩存項</h3><p>若要獲取一個被標記的緩存項,只要傳遞一樣的有序標簽列表至 <code class=" language-php">tags</code> 方法,然后通過你希望獲取的值對應的鍵來調用 <code class=" language-php">get</code> 方法:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$john</span> <span class="token operator">=</span> <span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">tags<span class="token punctuation">(</span></span><span class="token punctuation">[</span><span class="token string">'people'</span><span class="token punctuation">,</span> <span class="token string">'artists'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">get<span class="token punctuation">(</span></span><span class="token string">'John'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$anne</span> <span class="token operator">=</span> <span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">tags<span class="token punctuation">(</span></span><span class="token punctuation">[</span><span class="token string">'people'</span><span class="token punctuation">,</span> <span class="token string">'authors'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">get<span class="token punctuation">(</span></span><span class="token string">'Anne'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><a name="removing-tagged-cache-items"></a></p><h3>移除被標記的緩存項</h3><p>你可以清空已分配的單個標簽或是一組標簽列表中的所有緩存項。例如,下方的語句會把被標記為 <code class=" language-php">people</code>、<code class=" language-php">authors</code>,或兩者都標記了的緩存都移除。所以,<code class=" language-php">Anne</code> 與 <code class=" language-php">John</code> 都會被從緩存中移除:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">tags<span class="token punctuation">(</span></span><span class="token punctuation">[</span><span class="token string">'people'</span><span class="token punctuation">,</span> <span class="token string">'authors'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">flush<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>相反的,下方的語句只會刪除被標示為 <code class=" language-php">authors</code> 的緩存,所以 <code class=" language-php">Anne</code> 會被移除,但 <code class=" language-php">John</code> 不會:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">tags<span class="token punctuation">(</span></span><span class="token string">'authors'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">flush<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><a name="adding-custom-cache-drivers"></a></p><h2><a href="#adding-custom-cache-drivers">增加自定義的緩存驅動</a></h2><p><a name="writing-the-driver"></a></p><h3>寫驅動</h3><p>為了創建自定義的緩存驅動,首先我們需要部署 <code class=" language-php">Illuminate\<span class="token package">Contracts<span class="token punctuation">\</span>Cache<span class="token punctuation">\</span>Store</span></code> <a href="/docs/5.4/contracts">contract</a> 。所以 MongoDB 緩存實現看起來會像這樣:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Extensions</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Contracts<span class="token punctuation">\</span>Cache<span class="token punctuation">\</span>Store</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">MongoStore</span> <span class="token keyword">implements</span> <span class="token class-name">Store</span>
<span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">get<span class="token punctuation">(</span></span><span class="token variable">$key</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">many<span class="token punctuation">(</span></span><span class="token keyword">array</span> <span class="token variable">$keys</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">put<span class="token punctuation">(</span></span><span class="token variable">$key</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">,</span> <span class="token variable">$minutes</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">putMany<span class="token punctuation">(</span></span><span class="token keyword">array</span> <span class="token variable">$values</span><span class="token punctuation">,</span> <span class="token variable">$minutes</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">increment<span class="token punctuation">(</span></span><span class="token variable">$key</span><span class="token punctuation">,</span> <span class="token variable">$value</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">decrement<span class="token punctuation">(</span></span><span class="token variable">$key</span><span class="token punctuation">,</span> <span class="token variable">$value</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">forever<span class="token punctuation">(</span></span><span class="token variable">$key</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">forget<span class="token punctuation">(</span></span><span class="token variable">$key</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">flush<span class="token punctuation">(</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">getPrefix<span class="token punctuation">(</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><p>我們只需要通過一個 MongoDB 的連接來實現這些方法。關于如何實現這些方法,可以查看框架源代碼中的 <code class=" language-php">Illuminate\<span class="token package">Cache<span class="token punctuation">\</span>MemcachedStore</span></code> 。一旦我們的部署完成,我們就可以完成自定義驅動的注冊了。</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">extend<span class="token punctuation">(</span></span><span class="token string">'mongo'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$app</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">repository<span class="token punctuation">(</span></span><span class="token keyword">new</span> <span class="token class-name">MongoStore</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> 如果你想知道把自定義的緩存驅動代碼放置在哪里,你可以在 <code class=" language-php">app</code> 目錄下創建一個 <code class=" language-php">Extensions</code> 命名空間。Laravel 沒有硬性規定應用程序的結構,你可以依照你的喜好任意組織你的應用程序。</p></blockquote><p><a name="registering-the-driver"></a></p><h3>注冊驅動</h3><p>通過 Laravel 注冊自定義緩存驅動,我們將用到 <code class=" language-php">Cache</code> facade 的 <code class=" language-php">extend</code> 方法。<code class=" language-php"><span class="token scope">Cache<span class="token punctuation">::</span></span>extend</code> 的調用會在最新的 Laravel 應用程序默認的 <code class=" language-php">App\<span class="token package">Providers<span class="token punctuation">\</span>AppServiceProvider</span></code> 的 <code class=" language-php">boot</code> 方法中完成。或者你可以創建你自己的服務提供者來放置這些擴展 - 不要忘記在 <code class=" language-php">config<span class="token operator">/</span>app<span class="token punctuation">.</span>php</code> 提供者數組中注冊提供者:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Providers</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Extensions<span class="token punctuation">\</span>MongoStore</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Support<span class="token punctuation">\</span>Facades<span class="token punctuation">\</span>Cache</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Support<span class="token punctuation">\</span>ServiceProvider</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">CacheServiceProvider</span> <span class="token keyword">extends</span> <span class="token class-name">ServiceProvider</span>
<span class="token punctuation">{</span>
<span class="token comment" spellcheck="true">/**
* Perform post-registration booting of services.
*
* @return void
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">boot<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">extend<span class="token punctuation">(</span></span><span class="token string">'mongo'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$app</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token scope">Cache<span class="token punctuation">::</span></span><span class="token function">repository<span class="token punctuation">(</span></span><span class="token keyword">new</span> <span class="token class-name">MongoStore</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment" spellcheck="true">/**
* Register bindings in the container.
*
* @return void
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">register<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token comment" spellcheck="true"> //
</span> <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><p>傳遞給 <code class=" language-php">extend</code> 方法的第一個參數是驅動名稱。這取決于你的 <code class=" language-php">config<span class="token operator">/</span>cache<span class="token punctuation">.</span>php</code> 配置信息文件的 <code class=" language-php">driver</code> 選項。第二個參數為一個應該返回 <code class=" language-php">Illuminate\<span class="token package">Cache<span class="token punctuation">\</span>Repository</span></code> 實例的閉包。這個閉包將傳遞一個 <a href="/docs/5.4/container">service container</a> 的 <code class=" language-php"><span class="token variable">$app</span></code> 實例。</p><p>一旦你的擴展被注冊,就可以輕松的更新 <code class=" language-php">config<span class="token operator">/</span>cache<span class="token punctuation">.</span>php</code> 配置信息文件的 <code class=" language-php">driver</code> 選項為你的擴展名稱。</p><p><a name="events"></a></p><h2><a href="#events">緩存事件</a></h2><p>為了在每一次緩存操作時執行代碼,你可以監聽緩存觸發的事件 <a href="/docs/5.4/events">事件</a> 。一般來說,你必須將這些事件監聽器放置在 <code class=" language-php">EventServiceProvider</code> :</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* The event listener mappings for the application.
*
* @var array
*/</span>
<span class="token keyword">protected</span> <span class="token variable">$listen</span> <span class="token operator">=</span> <span class="token punctuation">[</span>
<span class="token string">'Illuminate\Cache\Events\CacheHit'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'App\Listeners\LogCacheHit'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token string">'Illuminate\Cache\Events\CacheMissed'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'App\Listeners\LogCacheMissed'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token string">'Illuminate\Cache\Events\KeyForgotten'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'App\Listeners\LogKeyForgotten'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token string">'Illuminate\Cache\Events\KeyWritten'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'App\Listeners\LogKeyWritten'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">;</span></code></pre></article>
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- 請求周期
- 開發環境部署
- Valet
- Homestead
- 核心概念
- 服務提供者
- Facades
- Contracts
- 服務容器
- HTTP 層
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- Session
- 表單驗證
- 前端
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全
- API 認證
- 用戶認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- Redis
- 數據填充
- Eloquent ORM
- Eloquent ORM快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- 序列化
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 錯誤與日志
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度