Andy's Blog » PHP优化的点击数统计代码 修改, $last_update = intval($last_update); if (($last_update $update_time) < time(, @chmod( /log/last_update txt, @chmod( /log/last_update txt 0777);, php刷新统计代码, php点击数优化, php统计优化, HAJ5, meat2me, imagine942, additionwk3, itkfn, pond1qw, armybrt, principleoai, worthkqj, stage3qh, IHZD, behind4rl, scientificovx, section12k, stairs62q » PHP优化的点击数统计代码

PHP优化的点击数统计代码

PHP优化的点击数统计代码

来源:http://www.feibao.net

click.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,所以就想了这种缓存更新的方式

Incoming search terms:

Tags: PHP, 统计, 优化, 点击计数

本文地址: http://www.21andy.com/new/20070114/540.html

3 评论 to “PHP开源CMS之MODx”

  1. cos 于 2007-01-26 16:56:59 发表:

    文件操作的时候不file lock是要出问题的!

  2. Andy 于 2007-01-26 18:26:41 发表:

    感谢提醒,已经加上flock,呵,这段计数的程序我正准备用上呢
    我现在喜欢file_put_contents一句搞定比较爽

  3. test 于 2008-08-25 19:22:22 发表:

    if (($last_update + $update_time) < time()) {
    上面一行“”吧?