程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP給文章點擊統計加個緩存

PHP給文章點擊統計加個緩存

編輯:關於PHP編程

<?php
error_reporting(E_ALL);
$ROOT_PATH = '../';
include_once($ROOT_PATH . "include/config.php");
$update_time = 1800;//多長時間更新一次,單位是秒
$article_id = (isset($_GET['article_id']) && is_numeric($_GET['article_id']) && $_GET['article_id'] > 0) ? intval($_GET['article_id']) : 0;//文章的ID
if ($article_id > 0) {
    $filename = $ROOT_PATH . 'log/click_log.txt';
    $s = '';
    if (file_exists($filename)) {
        $content = file_get_contents($filename);
        $d_ary = array();
        if ($content) {
            $ary = explode("\n", $content);
            foreach ($ary as $line) {
                $data_ary = explode('|', $line);
                if (is_numeric($data_ary[0]) && is_numeric($data_ary[1])) {
                    $d_ary[$data_ary[0]] = $data_ary[1];
                }
            }
        }
        if (array_key_exists($article_id, $d_ary)) {
            $d_ary[$article_id] = $d_ary[$article_id]+1;//將當前的文章的點擊數加1
        } else {
            $d_ary[$article_id] = 1;
        }
        foreach ($d_ary as $key => $val) {
            $s .= $key . '|' . $val . "\n";
        }
    } else {
        $s .= $article_id . '|1' . "\n";//這個是初始化記錄文件
    }
    //寫記錄文件
    $fp = fopen($filename, "w");
//加入鎖定
if (flock($fp, LOCK_EX)) { // 進行排它型鎖定
    fwrite($fp, $s);
    flock($fp, LOCK_UN); // 釋放鎖定
} 
    //fwrite($fp, $s);
    fclose($fp);
    @chmod($filename, 0777);
    $last_update = file_get_contents('../log/last_update.txt');//取上一次更新的時間
    $last_update = intval($last_update);
    if (($last_update + $update_time) < time()) {
        //以下是數據庫連接操作,我用的是ADODB,你可以改成你自己的
        require_once("adodb.inc.php");
        $db = NewADOConnection("$DB_TYPE");
        $db->debug = true;
        $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
        if (!$db->Connect("$DB_HOST", "$DB_USER", "$DB_PASS", "$DB_DATABASE")) {
            exit('<a href="/">服務器忙,請稍候再訪問</a>');
        }
        $content = file_get_contents($filename);
        $d_ary = array();
        if ($content) {
            $ary = explode("\n", $content);
            foreach ($ary as $line) {
                $data_ary = explode('|', $line);
                if (is_numeric($data_ary[0]) && is_numeric($data_ary[1])) {
                    $sql = "UPDATE article SET hits=hits+" . $data_ary[1] . " WHERE id=" . $data_ary[0];
                    $db->Execute($sql);
                }
            }
        }
        //點擊數更新完了,將這個記錄文件清空
        $fp = fopen($filename, "w");
        fwrite($fp, '');
        fclose($fp);
        @chmod($filename, 0777);
        //將最後一次更新時間改為當前時間
        $fp = fopen('../log/last_update.txt', "w");
        fwrite($fp, time());
        fclose($fp);
        @chmod('../log/last_update.txt', 0777);
    
        $db->Close();//關閉數據庫連接
    }
    exit();
}
?>  

首先在log目錄下創建last_update.txt, 內容是 1155163400,(這是time()函數生成的時間)。

click_log文件的內容是像下面這樣的:

13136|44
13104|31
23509|32
11407|5
12141|29  

第一個數字代表文章的ID,第二個數字代表累積的點擊數。

這樣做,會提高程序的執行效率,無論是動態的PHP頁面還是html裡,以

<script src="click.php?article_id=333"></script>  

這種方法的頁面,都很有效。

這個一般用於統計文章等內容的點擊數的, 一般靜態頁裡,像上面這樣用的(可以把我上面的程序存成click.php)。 動態頁裡的話,可以把上面的代碼做成一個包含文件,然後在你的文章中include進來,不過,要改一下這個PHP的代碼,把article_id傳進去。不多說了,PHP程序員都會知道怎麼做,不懂程序的話,我講太多也沒用。

前些日子因為我服務器上的mysql進程裡,經常看見一大堆的update,所以就想了這種緩存更新的方式。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved