分类 网页与编程 中的文章

在线人数统计BUG

http://www.vgot.net/echo/?action=show&id=175
当在线访问者并未关闭浏览器但超时没有更新页面,当其它访问者访问时因为前访问者的数据超时而被程序丢弃,导致前访问者的数据丢失,当前访问者更新页面时,因为已经有通信ID,数据不会被存储,所以会丢失一些在线的人。

此BUG修复方法为将 38 行改为

PHP代码

if(isset($_COOKIE[$cookiename]) and array_key_exists($_COOKIE[$cookiename],$nowonline)) {

这样如果前访问者再次更新页面,如果他的数据不存在,将会为他更新通信ID,这样便不会造成统计丢失。


以下是更改后带有IP数据的在线人数统计,此版本BUG修复在第 45 行

PHP代码

<?php   
/*  
    @ PHP 在线人数统计程序  
    Copyright (c) www.vgot.cn by Pader 1:25 2009年1月7日  
    Version: 1.0.2  
    Homepage:http://www.vgot.cn  
    QQ: 270075658  
    How to use it: <script src="online.php"></script>  
    note: 一般独立在线人数统计程序都是统计在线的IP数,而这并不准确  
    例如局域网的访问者,比如公司,学校机房和网吧,虽然内网IP不同,但是外网IP都是一样  
    如果同一个局域网的无论多少人人访问你的网站则只被认为是一个人  
    这个小巧的程序解决了此问题,它以电脑为单为,每台电脑便算一个访问者  
    当然因为使用的是COOKIE,如果你在同一台电脑上使用两种不同核心的浏览器访问那就别当别论了  
*/  
$filename = 'online.txt';  //数据文件   
$cookiename = 'VGOTCN_OnLineCount';  //cookie名称   
$onlinetime = 600;  //在线有效时间,单位:秒 (即600等于10分钟)   
  
$online = file($filename);    
$nowtime = time();    
$nowonline = array();   
/*  
    @ 获取当前访问者IP  
        虽然并不以 IP 来统计,但这里需要获取 IP 存储以方便其它程序统计  
*/  
$ipx = $_SERVER['HTTP_X_FORWARDED_FOR'];    
$ip = (($ipx != '') && ($ipx != 'unknown')) ? $ipx : $_SERVER['REMOTE_ADDR'];   
  
/*  
    @ 得到仍然有效的数据  
*/  
foreach($online as $line) {   
    $row = explode('|',trim($line));   
    $sesstime = trim($row[1]);   
    if(($nowtime - $sesstime) <= $onlinetime) {  //如果仍在有效时间内,则数据继续保存,否则被放弃不再统计   
        $nowonline[$row[0]] = $sesstime.'|'.$row[2];  //获取在线列表到数组,会话ID为键名,最后通信时间与IP为键值   
    }   
}   
  
/*  
    @ 创建访问者通信状态  
        使用cookie通信  
        COOKIE 将在关闭浏览器时失效,但如果不关闭浏览器,此 COOKIE 将一直有效,直到程序设置的在线时间超时  
*/  
if(isset($_COOKIE[$cookiename]) and array_key_exists($_COOKIE[$cookiename],$nowonline)) {  //如果有COOKIE即并非初次访问则不添加人数并更新通信时间   
    $uid = $_COOKIE[$cookiename];   
} else {  //如果没有COOKIE即是初次访问   
    $vid = 0;  //初始化访问者ID   
    do {  //给用户一个新ID   
        $vid++;   
        $uid = 'U'.$vid;   
    } while (array_key_exists($uid,$nowonline));   
    setcookie($cookiename,$uid);   
}   
$nowonline[$uid] = $nowtime.'|'.$ip;  //更新现在的时间状态   
  
/*  
    @ 统计现在在线人数  
*/  
$total_online = count($nowonline);   
  
/*  
    @ 写入数据  
*/  
if($fp = @fopen($filename,'w')) {   
    if(flock($fp,LOCK_EX)) {   
        rewind($fp);   
        foreach($nowonline as $fuid => $finfo) {   
            $fline = $fuid.'|'.$finfo."\n";   
            @fputs($fp,$fline);    
        }   
        flock($fp,LOCK_UN);   
        fclose($fp);   
    }   
}   
    echo 'document.write("'.$total_online.'");';   
?>


Pader 2009-1-30 1

PHP 在线人数统计程序

突然想给网站搞个在线人数统计(当然,不是我自己的网站,自己的网站在线人数手指头一伸就数出来了),于是想到很早前收集的一个在线人数统计小程序,但是那个在线统计是以IP来算的,如果我们公司那么一大堆人访问不是只算一个么,于是自己写了一个在线人数统计程序,有多少电脑正打开你的网站就有多少人访问,It's Okay!

看代码:

 

PHP代码
  1. <?php   
  2. /*  
  3.     @ PHP 在线人数统计程序  
  4.     Copyright (c) www.vgot.cn by Pader 1:25 2009年1月7日  
  5.     Homepage:http://www.vgot.cn  
  6.     QQ: 270075658  
  7.     How to use it: <script src="online.php"></script>  
  8.     note: 一般独立在线人数统计程序都是统计在线的IP数,而这并不准确  
  9.     例如局域网的访问者,比如公司,学校机房和网吧,虽然内网IP不同,但是外网IP都是一样  
  10.     如果同一个局域网的无论多少人人访问你的网站则只被认为是一个人  
  11.     这个小巧的程序解决了此问题,它以电脑为单为,每台电脑便算一个访问者  
  12.     当然因为使用的是COOKIE,如果你在同一台电脑上使用两种不同核心的浏览器访问那就别当别论了  
  13. */  
  14. $filename = 'online.txt';  //数据文件   
  15. $cookiename = 'VGOTCN_OnLineCount';  //cookie名称   
  16. $onlinetime = 600;  //在线有效时间,单位:秒 (即600等于10分钟)   
  17.   
  18. $online = file($filename);    
  19. $nowtime = time();    
  20. $nowonline = array();   
  21.   
  22. /*  
  23.     @ 得到仍然有效的数据  
  24. */  
  25. foreach($online as $line) {   
  26.     $row = explode('|',$line);   
  27.     $sesstime = trim($row[1]);   
  28.     if(($nowtime - $sesstime) <= $onlinetime) {  //如果仍在有效时间内,则数据继续保存,否则被放弃不再统计   
  29.         $nowonline[$row[0]] = $sesstime;  //获取在线列表到数组,会话ID为键名,最后通信时间为键值   
  30.     }   
  31. }   
  32.   
  33. /*  
  34.     @ 创建访问者通信状态  
  35.         使用cookie通信  
  36.         COOKIE 将在关闭浏览器时失效,但如果不关闭浏览器,此 COOKIE 将一直有效,直到程序设置的在线时间超时  
  37. */  
  38. if(isset($_COOKIE[$cookiename])) {  //如果有COOKIE即并非初次访问则不添加人数并更新通信时间   
  39.     $uid = $_COOKIE[$cookiename];   
  40. else {  //如果没有COOKIE即是初次访问   
  41.     $vid = 0;  //初始化访问者ID   
  42.     do {  //给用户一个新ID   
  43.         $vid++;   
  44.         $uid = 'U'.$vid;   
  45.     } while (array_key_exists($uid,$nowonline));   
  46.     setcookie($cookiename,$uid);   
  47. }   
  48. $nowonline[$uid] = $nowtime;  //更新现在的时间状态   
  49.   
  50. /*  
  51.     @ 统计现在在线人数  
  52. */  
  53. $total_online = count($nowonline);   
  54.   
  55. /*  
  56.     @ 写入数据  
  57. */  
  58. if($fp = @fopen($filename,'w')) {   
  59.     if(flock($fp,LOCK_EX)) {   
  60.         rewind($fp);   
  61.         foreach($nowonline as $fuid => $ftime) {   
  62.             $fline = $fuid.'|'.$ftime."\n";   
  63.             @fputs($fp,$fline);    
  64.         }   
  65.         flock($fp,LOCK_UN);   
  66.         fclose($fp);   
  67.     }   
  68. }   
  69.     echo 'document.write("'.$total_online.'");';    
  70. ?>  

代码里可能插入的时候带了一些空格程序不能正常运行,可以点附件下载。

Pader 2009-1-7 0

One Explorer V1.1.1 FT beta

在功能上没有什么大的改进,毕竟只是用来在本地 localhost 测试方便打开链接的而已。

[attach=131]

/*
 One Explorer V1.1.1 beta PHP
 Copyright (c) 2008
www.vgot.cn
 
## History ##
1.0.0 ~ 2008-11-23
 诞生
1.0.1 ~ 2008-12-?
 [访问目录]功能,版本使用 "VERSION" 常量定义
1.0.2 ~ 2008-12-28
 取消 getDirList() 函数,取消整体一半循环
1.1.0 ~ 2008-12-29~30
 增加多动作模式
 重新将获取目录改为函数读取,但不增加循环次数
 读目录函数对文件读取多属性,文件大小和创建时间
 增加 图片 Base64 Code ,内置多种图标
 更改整体排序
 代码位置和逻辑优化,由中间 1.0.5 到 1.1.0
 去除无缓存语句
1.1.1 ~ 2008-12-30
 修改一些页面上的显示错误
 添加字符串截取函数
*/

这次最有趣的地方就是你可以看到的页面里的图标,其实这个程序只有一个PHP文件,这些文件夹和文件名前面的小图片图标全都是用 base64 编码嵌入在 PHP 源码里面了,我觉得这个将会在以后很多程序里得到大的应用

 

PHP代码
  1. $types = array(         //已知文件的类型对应的内嵌图标   
  2.     'dir' => 'dir.gif','txt' => 'txt.gif','gif' => 'img.gif','jpg' => 'img.gif','png' => 'img.gif','bmp' => 'img.gif',   
  3.     'htm' => 'html.gif','html' => 'html.gif','css' => 'css.gif','js' => 'js.gif','swf' => 'swf.gif',   
  4.     'php' => 'php.gif','asp' => 'code.gif','mdb' => 'mdb.gif','exe' => 'exe.gif',   
  5.     'zip' => 'zip.gif','rar' => 'rar.gif','mp3' => 'mp3.gif','wma' => 'mp3.gif',   
  6.     'unknow' => 'unknow.gif'  
  7. );  

这是其中一个图标,img.gif 文件

PHP代码
  1. $images['img.gif'] = <<<EOF   
  2. R0lGODlhEAAQANU/AJWr0PD0+JnJZuvu8IGITsnT5IjBWGCSjaa304i8Zpq/93eoTH+vcajQg56y0YC1pKTH/O3x9+zy9/Lz9b7a/   
  3. 6DE5ujw9pHGXrPV8WqYpJTCin+9VYG+U9KfVKHMk4e1t2SXPa3N/6TQebbV/7rY/4/FY6+GP8nInHiqn8Hd/5Srz3q6T5O948XTr+   
  4. /095p7NdGvbou7g7LB2u7z92memq3U8I7CcWeaQO/z9+bu9vT195qw0Zmv0ZWs0MLcv////yH5BAEAAD8ALAAAAAAQABAAAAaiwJ9   
  5. wSCwKC4hdb7kEOAG8ghAxmOiu2Ktk4BDuJqPaw9NoaGgshWQn7OlGH49IQI9lFBb2z016NAQXBgY2B3h6PQF9IoEcGwkHEDmHLhQf   
  6. GiUcKxsMGZGHMxQYKAwJCQwHFZ5tEimhBK8EFSEhkm0RC7gvHR0mNyAgtT8qET7FLScwxcU5PEIAxMrRy80/VBMB2Dja21xHMjs84   
  7. eLiDlJG50NBADs=   
  8. EOF;  

怎么把图片变成 base64 编码放到PHP里呢,你可以看看这篇文章:http://www.vgot.net/echo/?action=show&id=171

Pader 2008-12-31 0

把图片转换为Base64编码字符串

无意中碰到,原来可以将图片变成字符串放在脚本里,就好像 exe 里的资源一样。

找了半天只有一个在 .netframework 环境下的软件能够转换文件编码,无奈。

于是自己用 php 写了一个在线转换的,限制了文件大小为 200KB.地址:

http://www.vgot.net/test/image2base64.php

至于如何输出图片,看示例

PHP代码

<?php
//把编码了的 BASE64 字符串赋于 $image 变量   
$image = <<<EOF   
R0lGODlhNAATAJEDAOtlL////99AAP///yH5BAEAAAMALAAAAAA0ABMAAAKMnI+py90Co5y02hsPBLz7D4biCECGUGLqupYnC8fVKwWQfQX6fuOyOZjYdAIfhdgrGmU0pbNoQTqRO191KaDhtrfKlQjeDsfYJheKrlnHz3By0kSDu+qIm8p+SuJQKv09lXcnlRF09Lb0hcjTw7hneDj3g0EIlPM3qeb4mNmpwucZmgUqOulwiprKUAAAOw==   
EOF;   
header("Content-Type: image/gif");  //这里根据图片类型修改   
header("Content-Disposition: inline");   
echo base64_decode($image);  //解码并输出   
exit;

具体怎么使用和扩展就看你自己的啦

Pader 2008-12-29 5

我强悍的便签2功能

昨晚研究了一下以前无意碰到的一个HTML编辑器,经过两个多小时的修改和努力,加上最近研究 jQuery 的自定动画效果,于是又对便签进行了一番改造。

看录像,因为是GIF的,所以色彩不好:

Pader 2008-12-21 0