2011-12-02 21 views
0

我正在編寫將具有每日/每週/每月報告數據的視圖。我認爲只有定期運行查詢才能更新數據,而不是在有人加載頁面時觸擊數據庫。這可以完全在PHP和MySQL中完成嗎?有什麼強大的方法來處理這個問題?定期使用查詢填充查看數據

回答

1

使用支持緩存的模板引擎Smarty,可以爲這些頁面設置較長的緩存時間。然後,您需要對PHP進行編碼以測試日期約束是否已更改,以及數據是否已緩存,並且如果其中任何一個條件爲真,請執行查詢。否則,Smarty將只加載緩存頁面,代碼將不會查詢數據庫。

$smarty = new Smarty(); 
if (!$smarty->isCached('yourtemplate.tpl')) { 
    // Run your query and populate template variables 
} 
$smarty->display('yourtemplate.tpl'); 

Further documentation on Smarty caching

+0

如何笨? –

+0

@amiawizard我沒有使用Codeigniter的經驗,但這裏是文檔http://codeigniter.com/user_guide/general/caching.html –

+0

爲什麼要在CRON作業上使用頁面緩存? –

1

是的,但不是很好。你想看看Cron作業,大多數Web主機提供一個服務來設置Crons。他們只是一種運行腳本,任何腳本,PHP,Javascript,整個頁面等的方法。

搜索谷歌的cron作業,你應該找到你要找的。

如果您的Web主機不提供cron作業,並且您不知道Unix命令如何工作,那麼有些網站會爲您提供cron作業。

退房

http://www.cronjobs.org/

+0

是否有任何理由給用戶Cron作業,而不是由Michael建議的頁面緩存?你的意思不是很好嗎? –

1

我想是有道理的只是定期運行查詢更新數據,而不是每當有人加載頁面訪問數據庫

就我個人而言,我會一起去。例如

SELECT customer, COUNT(orders.id), SUM(order_lines.value) 
FROM orders, order_lines 
WHERE orders.id=order_lines.order_id 
AND orders.placed>@last_time_data_snapshotted 
AND [email protected]_user 
GROUP BY customer 
UNION 
SELECT user, SUM(rollup.orders), SUM(rollup.order_value) 
FROM rollup 
WHERE rollup.last_order_date<@last_time_data_snapshotted 
AND [email protected]_user 
GROUP BY customer 

每當有人加載頁面

事實上,而不是訪問數據庫,根據使用的模式,這可能會讓很多的感覺。但是,這並不需要排除上述方法 - 只需設置何時將聚合數據推送到預先統一表中並在每個請求上測試閾值的閾值。

1

我會親自將緩存的數據存儲在一個文件中,然後只是讀取該文件,如果它已經在一定的時間範圍內更新,如果沒有,然後做你的更新(例如從數據庫獲取信息,寫入文件)。

一些示例代碼:

$cacheTime = 900; // 15 minutes 
$useCache = false; 
$cacheFile = './cache/twitter.cachefile'; 
// check time 
if(file_exists($cacheFile)){ 
    $cacheContents = file_get_contents($cacheFile); 
    if((date('U')-filemtime($cacheFile))<$cacheTime || filesize($cacheFile)==0){ 
    $useCache = true; 
    } 
} 
if(!$useCache){ 
    // get all your update data setting $cacheContents to the file output. I'd imagine using a buffer here would be a good idea. 

    // update cache file contents 
    $fh = fopen($cacheFile, 'w+'); 
    fwrite($fh, $cacheContents); 
    fclose($fh); 
} 

echo $cacheContents;