Board logo

标题: 刚用PHP写了一个网站在线人数的程序,请大家进来指点下! [打印本页]

作者: lilcy88    时间: 2008-5-28 10:40     标题: 刚用PHP写了一个网站在线人数的程序,请大家进来指点下!

刚用PHP写了一个网站在线人数的程序,请大家进来指点下!) n6 W% _. y  d+ o" D
我是用PHP+MYSQL来写的,原理:网站在线人数的程序代码+后台有MYSQL数据库支持,可以直接统计出网站当前的在线人数。
' M- ^, H( ]: X5 @  g: J首先我创建MYSQL数据库表。
/ L6 f" t' T- j% v2 ECREATE TABLE tablename (
: P# h$ N, ?% W+ x- {4 Qfield type(max_length) DEFAULT 'default_value' (NOT) NULL
7 Q5 x3 o& `6 D* e3 L- H}可以使用的SQL语句。
+ w7 v5 A; y+ g! @  k* YCREATE TABLE useronline (
4 i. S0 F' A4 k0 `. a3 W6 Y4 G+ ttimestamp int(15) DEFAULT '0' NOT NULL,
3 d9 K9 X2 ^2 k' P2 X& j; cip varchar(40) NOT NULL,
8 Z( s& l) t1 Y/ nfile varchar(100) NOT NULL,3 r! v# v8 W9 |% l# L" E! d
PRIMARY KEY (timestamp),
* z8 B/ c$ o  QKEY ip (ip),: L# ^  G. `) n6 c" Y  v0 b
KEY file (file)$ G* i! ^% D" e
);下面我们是PHP脚本,首先我定义MYSQL的信息。
" V: ~; Z6 m8 W  {- m$server = "localhost"; //你的服务器( |7 `' a8 c0 A0 q* j) u0 U' b, ^
$db_user = "root"; //你的mysql的用户名2 F$ h$ M- V% b, H) ^
$db_pass = "password"; //你的mysql的密码; ^$ f) O' ?" J* U7 r% s1 B- T5 Z6 Z2 M
$database = "users"; //表的名字设置统计的时间(多少秒内在线人数)8 }3 U4 q* Z; g( a4 ^, k! s; j! Q
$timeoutseconds = 300;取当前时间。
. J5 {& U% K: B4 z% u; r$timestamp = time();上面的完整代码:6 }; m' v# t, s: g
<?php
: I6 K9 D: ^4 T2 Y) \* r$server = "localhost"; //your server
8 j! [2 J$ N/ g. w) s2 u$db_user = "root"; //your mysql database username! f) v  r3 n9 J
$db_pass = "password"; //your mysql database password if any, |" J4 z  o, ]
$database = "users"; //the db name. v& V6 D/ E5 a, G5 {
$timeoutseconds = 300;//timeoutseconds limit. O$ ~; y: {5 U$ U6 ]
//get the current time
0 E; j/ f- V3 T5 T$timestamp = time();5 S5 {& G5 I+ Y. E
//calculate the lowest timestamp allowed. O5 l  \7 e, G0 {+ i
$timeout = $timestamp-$timeoutseconds;/ p; S8 j2 [% U9 g) @0 X) F
?>连接mysql
  A1 {( @0 f  Umysql_connect('localhost', 'username', 'password');也允许使用变量形式。
8 k, T$ T% C: H' N0 H) b0 tmysql_connect($server, $db_user, $db_pass);如果mysql数据库没有密码的话可以使用下面代码连接
: ~0 _: H- g9 [7 m% zmysql_connect($server, $db_user);查询数据库的代码:) @! c6 `+ u% h  z5 Y6 A
mysql_db_query('database', 'query');我们只要有访客就要增加一条记录。
1 @7 ^2 K1 m+ Z7 x1 R2 U7 p$insert = mysql_db_query($database, "INSERT INTO useronline VALUES  s  K3 P5 {' a. h; {  c; ]
('$timestamp','".$_SERVER['REMOTE_ADDR']."','".$_SERVER['PHP_SELF']."')");
' H$ w: M/ z' E- Y3 L( b: X如果用户用错误信息的话,这样处理。
) O3 @' n' ]. [) h; qif(!($insert)) {
; B; K3 C1 ^4 _( k4 Kprint "Useronline Insert Failed > ";
3 H8 n  H) X$ a" E/ \9 V}然后实现当超过设置的时间就删除该用户记录。
4 P# O; v2 a) y$delete = mysql_db_query($database, "DELETE FROM useronline WHERE timestamp<$timeout");同样给出删除记录出错的处理。# [0 L2 t5 v# T( \9 s; o9 h
if(!($delete)) {1 m  p, J" n1 u: n1 l7 ?" y; b( y
print "Useronline Delete Failed > ";7 t, f* `. d; I( D( a. s
}下面我们解决数据库中不同IP的问题
& D; v' X  g( E/ E4 A3 m+ m1 A$result = mysql_db_query($database, "SELECT DISTINCT ip FROM useronline WHERE file='".$_SERVER['PHP_SELF']."' ");使用6 _- l% G, M0 A& ]
mysql_num_rows(query);来统计用户,代码如下。6 ^. f% @+ q5 `. d* T2 z
$user = mysql_num_rows($result);最后关闭数据库。
2 H+ o. p& p, ^1 \mysql_close();显示在线的人数。* ?0 A7 \2 d& b; T/ P  u+ O
if($user == 1) {
, J" A: Z; x9 A, |% k9 b! x: Hprint("1 user online\n");
& L7 x1 T: q( P} else {+ u  N# x" H: @( q! |* k
print("$user users online\n");
, ^. I# Q9 _( U  V& Z) R+ a# m}最终把上面代码写成一个PHP文件如下。
; E3 D5 J, }0 [<?php0 }0 Y+ O) j+ y5 Q
//Put your basic server info here
/ k- d6 ?0 o$ ]% O$server = "localhost"; //normally localhost
7 `- p/ w: l/ r4 h/ O$db_user = "root"; //your MySQL database username) p  A3 u' A' g7 C  d
$db_pass = "password"; //your MySQL database password) e4 m7 ?$ R1 }% n
$database = "users";% z  c3 o4 i8 K  c& i1 b, f, D
$timeoutseconds = 300; //it will delete all people which haven't refreshed(so probbably are2 h' S4 p9 Z, W+ G
// offline or inactive) in $timieoutseconds time (so it actually checks the people that are active in the last2 @: H, a6 i/ u9 x* ~& d; j
// $timeoutseconds seconds)
1 k$ o$ ^- x" D. k//this is where PHP gets the time
/ L3 N+ L" @1 k( O$timestamp = time();" m+ G+ [8 `) f5 A! C1 l
//counts the timeout, all people which have been seen last online in earlier than this timestamp, will get removed
' t: \* O- z+ n( b$timeout = $timestamp-$timeoutseconds;% O% t2 C! b8 x
//connect to database( @$ v; _6 k8 C4 ^% J
mysql_connect($server, $db_user);. @# R: T/ \% D- [2 o# C6 ^
//add the timestamp from the user to the online list, P& c+ K" _8 @  ?5 c2 u9 b! h
$insert = mysql_db_query($database, "INSERT INTO useronline VALUES" ?  L$ \3 B1 x. ?" x
('$timestamp','".$_SERVER['REMOTE_ADDR']."','".$_SERVER['PHP_SELF']."')");
6 ?5 |& G0 Q0 T( }if(!($insert)) {
( j! v  s) x, v/ o' hprint "Useronline Insert Failed > ";
) p& r' l' u! ~4 K}6 Q- a% f( m% X- f2 p
//delete the peoples which haven't been online/active in the last $timeoutseconds seconds.
$ r( Z( Z/ v3 R9 }0 G$delete = mysql_db_query($database, "DELETE FROM useronline WHERE timestamp<$timeout");
$ d5 x, ~+ R; c) g! Y  C: I) n# Tif(!($delete)) {& i+ a$ H& w; g
print "Useronline Delete Failed > ";6 Q9 [0 d1 c& I# X4 R
}
( t' d7 _! o7 G- q# X5 g2 b//select the amount of people online, all uniques, which are online on THIS page
% }& x7 I4 V5 W- u0 x& F+ h$result = mysql_db_query($database, "SELECT DISTINCT ip FROM useronline WHERE file='".$_SERVER['PHP_SELF']."' ");
& D8 |% s" P6 o. Pif(!($result)) {
8 e2 ]# v, ]2 g; z* d4 a6 t9 B/ Jprint "Useronline Select Error > ";
& m! p1 r* C& O9 O# `' l7 M6 J}, {4 ?& t6 J2 d; X' h
//Count the number of rows = the number of people online
6 E$ b2 K# h! V, r  K4 S* a# V$user = mysql_num_rows($result);1 @' ~2 e8 ^2 f$ U% }% G
//spit out the results( o: a) E/ m1 q8 u& Y9 M
mysql_close();: E3 j, g5 v2 C5 D( J# }5 M
if($user == 1) {  C; B" Q" j8 w5 k5 v+ h7 }
print("1 user online\n");
' |$ {% `& ?: k' T% r- O& j. v& Y9 c} else {
+ t8 M+ D4 E. l. `" `print("$user users online\n");
' s& K2 L+ v, y2 U3 X}9 r  s) V9 ]+ |, `: g
?>- l2 z2 K! P$ M. A" [
& y% G% k$ C5 S4 ^3 ~
以上代码我是在时代互联提供的免费试用主机上测试的,感觉效果还不错,性能很稳定,不信的话你也可以去试试。当然,记得指出我这个程序中的不足先哦。6 {7 s+ C7 t% c9 D& F. ^  C" G4 W
时代互联是行业内最早开始提供PHP 虚拟主机的公司之一,现在已经是的金牌域名注册商和中国互联网客户满意度十佳单位,产品功能已经非常完善 ,特别提一下几个特有用的功能:数据库自动备份、免费集成繁简通简装版、多域名绑定、多子网站支持、GCDN 网站加速器、镜像加速、高级访问统计系统、支持WAP、可选电信/网通/香港机房。7 h; T. q1 R9 v& N2 c- z
我之前建站的时候选的是他们公司标准商务E型,因为这款机型还特别支持ASP.NET3.5(3.0/2.0/1.1)/ASP。: S6 p4 ~4 N1 f8 Z
当然啦,这两款主机也是相当不错的。, ?+ P9 @% `7 U6 N: t8 q
智强商务B型:Unix /Linux 操作系统+独立网页空间1000MB+送1000MB邮局空间+100MB MySQL数据库空间=1869元/年
. M) q1 r; M) M* g4 i+ l. s1 O标准商务B型:Unix /Linux 操作系统+独立网页空间500MB+送800MB邮局空间+60MB MySQL数据库空间=1365元/年
* m0 i) Q$ H/ ?! p% l+ w提供一下这个公司的联系方式:请见:http://www.now.cn/vhost/ + _' e: _0 l* ^2 w. E2 X
空间专线: 0756-2623871  QQ:168075865,好象还有全球免费网络电话:全球免费咨询电话 http://www.now.cn/callcenter/call.net?LineName=55% n$ }$ ~3 ^# M, L* w' m
自己加QQ去问吧。




欢迎光临 捌玖网络工作室 (http://www.89w.org/) Powered by Discuz! 7.2