2012-12-27 74 views
1

我正在運行一個從MySQL表中提取數據的php腳本。我將在經常訪問的服務器上運行此操作,並希望將數據保存在緩存中X時間。所以,一旦你拉它,數據被保存在服務器上,而時間還沒有過去。這裏的腳本:爲php mysql查詢創建緩存

<?php 
include('mysql_connection.php'); 

$c = mysqlConnect(); 

$locale = $_GET['locale']; 
$last_news_id = $_GET['news_id']; 

sendQuery ("set character_set_results='utf8'"); 
sendQuery ("set collation_connection='utf8_general_ci'"); 

if(strcmp($locale,"ru") != 0) 
    $locale = "en"; 
$result = sendQuery("SELECT * FROM news WHERE id > ".$last_news_id." and locale = '".$locale."' ORDER BY id DESC LIMIT 10"); 
echo '<table width=\"100%\">'; 
while($row = mysqli_fetch_array($result, MYSQL_NUM)) 
{ 
    echo '<tr><td width=\"100%\"><b>Date: </b>'.$row[2].'</td></tr>'; 
    echo '<tr><td width=\"100%\">'.preg_replace('/#([^#]*)#(.*)/', ' <a href="$2" target="_blank">$1</a>', $row[3]).'</td></tr>'; 
    echo '<tr><td width=\"100%\"><hr style="height: 2px; border: none; background: #515151;"></td></tr>'; 
} 
echo '</table>'; 

mysqliClose($c); 

>

什麼PHP函數使用緩存中的數據?什麼是最好的方法?謝謝!

+1

你可以使用APC http://php.net/manual/en/book.apc.php – m02ph3u5

+1

爲什麼要逃避你的雙引號? –

回答

2

您可以使用PHP的內存緩存: 就在你的腳本在緩存中添加此代碼後「sendQuery()」功能可按並將其存儲象下面這樣:

$memcache_obj = memcache_connect('memcache_host', 11211); 
memcache_set($memcache_obj, 'var_key', $result, 0, 30); 
echo memcache_get($memcache_obj, 'var_key'); 
+0

你可以得到更多的幫助:http://php.net/manual/en/book.memcached.php –

0

兩個去到解決方案APC和memcache 。前者也是一個opcache,後者可以分發。選擇最適合你的東西。

0

事實上,您的數據已經保存在服務器上。
而這樣的查詢應該是相當快的。

所以,這裏似乎沒有必要緩存。特別是如果你遇到沒有負載問題,但爲了以防萬一。

0

Apc/Memcached可以使用,並且通常用於這種類型的東西。您必須瞭解這種方法可能產生的問題:管理新的插入/更新等。只要你不關心這些信息,你可以設置數據到期的任意時間間隔,但是如果這些信息與你的應用程序真正相關,那麼這種方法將不起作用。

另外,mysql已經緩存了兩個請求之間沒有修改的選擇,所以基本上,如果你現在做一個選擇,並且在10分鐘內完成同樣的查詢,如果表中沒有任何變化,你將得到來自mysql的查詢緩存。發佈數據請求和接收數據仍然存在開銷,但速度非常快。這種方法在更新/刪除問題時默認工作,因爲無論表格中的記錄何時修改,關聯的查詢緩存都會被擦除,因此您將按原樣進行所有修改。

+0

所以這個腳本我在技術上不應該把太多的負載放在服務器上,即使我每天大約有1000次訪問? –

+0

對於每天1000次訪問,肯定不會。這是低的方式導致任何潛在的問題。通常問題出現在高併發率和高流量的情況下。緩存系統的理念不是緩存所有內容。考慮到這些缺點(因爲存在上述缺點),我們需要發現緩存可以改進的地方。 – Xnoise