php動態(tài)網(wǎng)站怎么做商旅100網(wǎng)頁版
前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站。
簡介
隨著您的網(wǎng)站的增長和流量的增加,最快顯示壓力的組件之一是后端數(shù)據(jù)庫。如果您的數(shù)據(jù)庫沒有分布式和配置來處理高負(fù)載,它很容易就會被相對較小的流量增加所壓倒。
處理這個問題的一種方法是利用內(nèi)存對象緩存系統(tǒng),比如 memcached。Memcached 是一種緩存系統(tǒng),通過臨時將通常從數(shù)據(jù)庫中檢索的信息存儲在內(nèi)存中。然后對內(nèi)存中的信息的下一個請求將變得非???#xff0c;而不會給后端數(shù)據(jù)庫帶來壓力。
在本指南中,我們將討論如何在 Ubuntu 14.04 服務(wù)器上安裝和使用 memcached。
先決條件
在開始之前,您應(yīng)該在服務(wù)器上擁有一個常規(guī)的非根用戶,該用戶具有 sudo
權(quán)限。如果您還沒有創(chuàng)建這樣的用戶,可以按照我們的 Ubuntu 14.04 初始設(shè)置指南中的步驟 1-4 進(jìn)行創(chuàng)建。
當(dāng)您配置好常規(guī)用戶后,可以繼續(xù)進(jìn)行本指南。
安裝 Memcached 和相關(guān)組件
要開始,我們應(yīng)該從 Ubuntu 的存儲庫中獲取我們需要的所有組件。幸運(yùn)的是,我們需要的一切都是可用的。
由于這是我們在本次會話中使用 apt
的第一個操作,我們應(yīng)該更新本地軟件包索引。然后我們可以安裝我們的程序。
我們將安裝 memcached 以及一個 MySQL 數(shù)據(jù)庫后端和 PHP 來處理交互。我們還將安裝處理 memcached 交互的 PHP 擴(kuò)展。您可以通過輸入以下命令獲取所需的所有內(nèi)容:
sudo apt-get update
sudo apt-get install mysql-server php5-mysql php5 php5-memcached memcached
請注意,有兩個 PHP memcache 擴(kuò)展可用。一個稱為 php5-memcache
,另一個稱為 php5-memcached
(請注意第二個示例末尾的 “d”)。我們使用后者,因?yàn)樗欠€(wěn)定的并實(shí)現(xiàn)了更廣泛的功能范圍。
如果您還沒有安裝 MySQL,安裝過程將提示您選擇并確認(rèn)管理員密碼。
這應(yīng)該安裝并配置您所需的一切。
檢查安裝
信不信由你,memcached 已經(jīng)完全安裝并準(zhǔn)備就緒。我們可以通過多種方式來測試這一點(diǎn)。
第一種方式非常簡單。我們可以詢問 PHP 是否知道我們的 memcached 擴(kuò)展以及它是否已啟用。我們可以通過創(chuàng)建普遍存在的 PHP 信息頁面來實(shí)現(xiàn)這一點(diǎn)。
這很容易通過在我們的文檔根目錄中創(chuàng)建一個名為 info.php
的文件來實(shí)現(xiàn)。在 Ubuntu 14.04 上的 Apache 中,我們的默認(rèn)文檔根目錄是 /var/www/html
。以 root 權(quán)限在此處打開文件:
sudo nano /var/www/html/info.php
在此文件中,輸入以下內(nèi)容。這基本上只是調(diào)用一個 PHP 函數(shù),該函數(shù)會收集并以網(wǎng)頁友好的布局打印有關(guān)我們服務(wù)器的信息。
<?php
phpinfo();
?>
現(xiàn)在,您可以訪問您服務(wù)器的域名或公共 IP 地址,后面跟著 /info.php
,您應(yīng)該會看到一個信息頁面。
http://<span class="highlight">server_domain_name_or_IP</span>/info.php
如果您向下滾動或搜索 “memcached” 部分標(biāo)題,您應(yīng)該會找到類似以下內(nèi)容的內(nèi)容:
!Memcache PHP info section
這意味著 memcached 擴(kuò)展已啟用并被 Web 服務(wù)器找到。
我們還可以通過輸入以下命令來檢查 memcached 服務(wù)是否正在運(yùn)行:
ps aux | grep memcached
memcache 6584 0.0 0.0 327448 3004 ? Sl 14:07 0:00 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1
demouser 6636 0.0 0.0 11744 904 pts/0 S+ 14:29 0:00 grep --color=auto memcached
您可以通過輸入以下命令查詢服務(wù)的統(tǒng)計信息:
echo "stats settings" | nc localhost 11211
如果您需要停止、啟動或重新啟動 memcached 服務(wù),可以通過輸入以下類似的命令來執(zhí)行:
sudo service memcached <span class="highlight">restart</span>
測試 Memcached 是否可以緩存數(shù)據(jù)
現(xiàn)在我們已經(jīng)驗(yàn)證了 memcached 是否正在運(yùn)行,并且我們的 PHP 擴(kuò)展是否已啟用,我們可以嘗試讓它存儲數(shù)據(jù)。
我們將通過創(chuàng)建另一個 PHP 腳本來實(shí)現(xiàn)這一點(diǎn)。這次,它將更加復(fù)雜。
在我們的文檔根目錄中打開一個名為 cache_test.php
的文件:
sudo nano /var/www/html/cache_test.php
在文件中,首先創(chuàng)建 PHP 包裝標(biāo)簽:
<?php
?>
在其中,我們將創(chuàng)建一個 PHP Memcached 對象的新實(shí)例,并將其存儲在一個變量中。我們將定義此 PHP 對象可以連接到運(yùn)行在我們服務(wù)器上的實(shí)際 memcached 服務(wù)的位置。Memcached 默認(rèn)運(yùn)行在端口 11211
上:
<?php
<span class="highlight">$mem = new Memcached();</span>
<span class="highlight">$mem->addServer("127.0.0.1", 11211);</span>
?>
接下來,我們將告訴我們的 Memcached 實(shí)例從我們的緩存中查詢一個鍵。這個鍵可以被稱為任何東西,因?yàn)槲覀冞€沒有創(chuàng)建它。我們將使用 “blah”。此請求的結(jié)果將存儲在一個 $result
變量中:
<?php
$mem = new Memcached();
$mem->addServer("127.0.0.1", 11211);<span class="highlight">$result = $mem->get("blah");</span>
?>
接下來,我們只需要測試是否返回了任何內(nèi)容。如果 memcached 找到一個名為 “blah” 的鍵,我們希望它打印與該鍵關(guān)聯(lián)的值。如果 memcached 無法找到匹配的鍵,我們應(yīng)該打印出一條消息說明情況。
然后,我們應(yīng)該設(shè)置一個帶有值的鍵,這樣下次我們請求該值時,memcached 將找到我們給它的值:
<?php
$mem = new Memcached();
$mem->addServer("127.0.0.1", 11211);$result = $mem->get("blah");<span class="highlight">if ($result) {</span><span class="highlight">echo $result;</span>
<span class="highlight">} else {</span><span class="highlight">echo "No matching key found. I'll add that now!";</span><span class="highlight">$mem->set("blah", "I am data! I am held in memcached!") or die("Couldn't save anything to memcached...");</span>
<span class="highlight">}</span>
?>
此時,我們的腳本已經(jīng)完成。如果我們在 Web 瀏覽器中訪問此頁面,我們可以看到它是如何工作的:
http://<span class="highlight">server_domain_name_or_IP</span>/cache_test.php
您應(yīng)該最初會看到一個如下的頁面:
!Memcached uncached message
然而,如果我們刷新頁面,我們應(yīng)該會看到一個不同的消息:
!Memcached cached message
正如您所看到的,我們的 memcached 服務(wù)現(xiàn)在正在緩存我們的腳本設(shè)置的數(shù)據(jù)。
測試臨時緩存數(shù)據(jù)庫值
現(xiàn)在我們已經(jīng)測試了在 memcached 中存儲數(shù)據(jù)的能力,我們可以演示一個更加現(xiàn)實(shí)的場景:臨時緩存數(shù)據(jù)庫查詢結(jié)果。
在 MySQL 中創(chuàng)建示例數(shù)據(jù)
首先,我們需要在數(shù)據(jù)庫中存儲一些信息。
通過以下命令以管理員用戶身份連接到 MySQL 實(shí)例。您需要輸入在安裝過程中設(shè)置的 MySQL root 密碼:
mysql -u root -p
之后,您將進(jìn)入 MySQL 提示符。
首先,我們要創(chuàng)建一個用于測試的數(shù)據(jù)庫。然后選擇該數(shù)據(jù)庫:
CREATE DATABASE mem_test;
USE mem_test;
讓我們創(chuàng)建一個名為 test
,密碼為 testing123
的用戶,并賦予其對我們創(chuàng)建的數(shù)據(jù)庫的訪問權(quán)限:
GRANT ALL ON mem_test.* TO test@localhost IDENTIFIED BY 'testing123';
現(xiàn)在,我們將創(chuàng)建一個非?;镜谋?#xff0c;并向其中插入一條記錄。該表將被命名為 sample_data
,并且只包含一個索引和一個字符串字段:
CREATE TABLE sample_data (id int, name varchar(30));
INSERT INTO sample_data VALUES (1, "some_data");
現(xiàn)在,我們已經(jīng)創(chuàng)建了結(jié)構(gòu)并插入了數(shù)據(jù)。我們可以退出 MySQL:
exit
創(chuàng)建用于緩存 MySQL 數(shù)據(jù)的 PHP 腳本
現(xiàn)在我們的數(shù)據(jù)已經(jīng)存儲在 MySQL 中,我們可以創(chuàng)建另一個 PHP 腳本,其操作方式類似于生產(chǎn)環(huán)境中的 PHP 應(yīng)用程序。
它將在 memcached 中查找數(shù)據(jù),如果找到數(shù)據(jù),則返回數(shù)據(jù)。如果沒有找到數(shù)據(jù),則將從數(shù)據(jù)庫中查詢,然后將結(jié)果存儲在 memcached 中以供將來查詢使用。
首先,在我們的文檔根目錄中創(chuàng)建另一個 PHP 腳本。我們將這個腳本命名為 database_test.php
:
sudo nano /var/www/html/database_test.php
從我們上一個腳本開始。我們將創(chuàng)建一個 PHP memcached 實(shí)例,然后告訴它我們服務(wù)器上運(yùn)行的 memcached 服務(wù)的位置,就像我們上次做的那樣:
<?php
$mem = new Memcached();
$mem->addServer("127.0.0.1", 11211);
?>
接下來,與我們上一個腳本有所不同,我們需要定義 PHP 如何連接到我們的 MySQL 數(shù)據(jù)庫。我們需要指定我們創(chuàng)建的用戶的登錄憑據(jù),然后告訴它要使用哪個數(shù)據(jù)庫:
<?php
$mem = new Memcached();
$mem->addServer("127.0.0.1", 11211);mysql_connect("localhost", "test", "testing123") or die(mysql_error());
mysql_select_db("mem_test") or die(mysql_error());
?>
接下來,我們需要設(shè)計查詢,以獲取我們插入到表中的數(shù)據(jù)。我們將把這個查詢存儲到一個 $query
變量中。
然后,我們將創(chuàng)建一個 $querykey
變量,用于存儲 memcached 將用來引用我們信息的鍵。
我們通過使用字符串 “KEY”,然后將我們查詢的 md5(一種哈希方法)校驗(yàn)和附加到末尾來創(chuàng)建此鍵。這將確保如果我們在更大的數(shù)據(jù)集上使用此技術(shù),每個鍵都是唯一的。它還確保匹配的查詢將為后續(xù)請求產(chǎn)生相同的鍵。
<?php
$mem = new Memcached();
$mem->addServer("127.0.0.1", 11211);mysql_connect("localhost", "test", "testing123") or die(mysql_error());
mysql_select_db("mem_test") or die(mysql_error());$query = "SELECT ID FROM sample_data WHERE name = 'some_data'";
$querykey = "KEY" . md5($query);
?>
接下來,我們將創(chuàng)建一個 $result
變量,就像我們上一個腳本一樣。這將保存我們的 memcached 查詢結(jié)果,就像以前一樣。我們要求 memcached 返回我們生成的查詢鍵,以查看它是否在其系統(tǒng)中標(biāo)識了一個記錄。
<?php
$mem = new Memcached();
$mem->addServer("127.0.0.1", 11211);mysql_connect("localhost", "test", "testing123") or die(mysql_error());
mysql_select_db("mem_test") or die(mysql_error());$query = "SELECT name FROM sample_data WHERE id = 1";
$querykey = "KEY" . md5($query);$result = $mem->get($querykey);
?>
現(xiàn)在,我們準(zhǔn)備進(jìn)行實(shí)際的測試邏輯,以確定在 memcached 中找到結(jié)果時會發(fā)生什么。如果找到結(jié)果,我們希望打印我們提取的數(shù)據(jù),并告訴用戶我們能夠直接從 memcached 中檢索到它:
<?php
$mem = new Memcached();
$mem->addServer("127.0.0.1", 11211);mysql_connect("localhost", "test", "testing123") or die(mysql_error());
mysql_select_db("mem_test") or die(mysql_error());$query = "SELECT name FROM sample_data WHERE id = 1";
$querykey = "KEY" . md5($query);$result = $mem->get($querykey);if ($result) {print "<p>Data was: " . $result[0] . "</p>";print "<p>Caching success!</p><p>Retrieved data from memcached!</p>";
}
?>
現(xiàn)在,讓我們?yōu)榱硪环N情況添加邏輯。如果未找到結(jié)果,我們希望使用我們創(chuàng)建的查詢來直接向 MySQL 請求數(shù)據(jù)。我們將把這個結(jié)果存儲到我們創(chuàng)建的 $result
變量中,這將是一個數(shù)組形式的結(jié)果。
在獲得查詢結(jié)果后,我們需要將該結(jié)果添加到 memcached 中,以便下次使用。我們可以通過向 memcached 提供我們要用來引用數(shù)據(jù)的鍵(我們已經(jīng)使用 $querykey
變量創(chuàng)建了這個鍵)、來自 MySQL 查詢的數(shù)據(jù)本身(存儲在 $result
變量中),以及以秒為單位的緩存數(shù)據(jù)的時間。
我們將緩存我們的內(nèi)容 10 秒。在現(xiàn)實(shí)世界中,緩存內(nèi)容更長可能更有益。也許如果您的內(nèi)容不經(jīng)常更改,那么更接近 10 分鐘(600 秒)的時間會更好。對于測試來說,較小的值讓我們更快地看到發(fā)生的事情,而無需重新啟動我們的 memcached 服務(wù)。
之后,我們將打印出一個類似的消息與查詢結(jié)果,并告訴用戶發(fā)生了什么。我們應(yīng)該將整個塊作為前面 if
的 else
添加:
<?php
$mem = new Memcached();
$mem->addServer("127.0.0.1", 11211);mysql_connect("localhost", "test", "testing123") or die(mysql_error());
mysql_select_db("mem_test") or die(mysql_error());$query = "SELECT name FROM sample_data WHERE id = 1";
$querykey = "KEY" . md5($query);$result = $mem->get($querykey);if ($result) {print "<p>Data was: " . $result[0] . "</p>";print "<p>Caching success!</p><p>Retrieved data from memcached!</p>";
} else {$result = mysql_fetch_array(mysql_query($query)) or die(mysql_error());$mem->set($querykey, $result, 10);print "<p>Data was: " . $result[0] . "</p>";print "<p>Data not found in memcached.</p><p>Data retrieved from MySQL and stored in memcached for next time.</p>";
}
?>
這是我們完成的腳本。它將嘗試從 memcached 獲取數(shù)據(jù)并返回它。如果失敗,它將直接從 MySQL 查詢并將結(jié)果緩存 10 秒。
測試腳本
現(xiàn)在我們已經(jīng)編寫了腳本,可以通過在網(wǎng)頁瀏覽器中轉(zhuǎn)到文件位置來運(yùn)行它:
http://<span class="highlight">server_domain_name_or_IP</span>/database_test.php
第一次訪問頁面時,我們應(yīng)該看到以下輸出:
Memcached uncached database query
如果我們在上次訪問后的 10 秒內(nèi)刷新頁面,現(xiàn)在頁面應(yīng)該顯示不同的消息:
Memcached cached database query
如果再等一會兒,緩存的內(nèi)容將會過期并從 memcached 中移除。此時我們可以刷新頁面以再次獲得第一條消息,因?yàn)榉?wù)器必須重新訪問數(shù)據(jù)庫以獲取適當(dāng)?shù)闹怠?/p>
結(jié)論
到目前為止,您應(yīng)該已經(jīng)對 memcached 的工作原理有了相當(dāng)好的理解,以及如何利用它來避免 Web 服務(wù)器重復(fù)訪問數(shù)據(jù)庫以獲取相同的內(nèi)容。
雖然本指南中創(chuàng)建的 PHP 腳本只是示例,但它們應(yīng)該讓您對系統(tǒng)的工作原理有了很好的了解。它還應(yīng)該讓您對如何構(gòu)建代碼結(jié)構(gòu)有了很好的理解,以便您可以檢查 memcached,并在必要時返回數(shù)據(jù)庫。