Board logo

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

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

刚用PHP写了一个网站在线人数的程序,请大家进来指点下!
- r! ^' ]6 v0 z/ t" e7 ~0 U/ i我是用PHP+MYSQL来写的,原理:网站在线人数的程序代码+后台有MYSQL数据库支持,可以直接统计出网站当前的在线人数。
4 A  \& i$ ~) q& ?$ J首先我创建MYSQL数据库表。5 k  u3 e# F  j. r
CREATE TABLE tablename (
  |: |1 V; p1 f' Ffield type(max_length) DEFAULT 'default_value' (NOT) NULL
5 w! e# g1 a+ N2 N, m}可以使用的SQL语句。; l2 p, Q& B( {" I# J1 Z1 a2 @
CREATE TABLE useronline (
, U& K. j: c$ n; g- D' }timestamp int(15) DEFAULT '0' NOT NULL,: `9 N( Y. b% R
ip varchar(40) NOT NULL,$ p+ Y4 @7 n8 c/ J( P6 w/ _
file varchar(100) NOT NULL,
  C& c. p6 y8 BPRIMARY KEY (timestamp),. [! o( V5 Q* i" w: a* q
KEY ip (ip),
% T- Q5 ]2 P) ^8 C6 f% c1 [KEY file (file)/ W7 A7 _* Y% Y. V
);下面我们是PHP脚本,首先我定义MYSQL的信息。
+ x( h, M3 v. n$server = "localhost"; //你的服务器
) J# `7 d% S0 }; O& P$db_user = "root"; //你的mysql的用户名
  R0 l5 T% {* ~; j6 ]6 Q( c$db_pass = "password"; //你的mysql的密码
& v! y* E. ~2 U4 T  T, X; u$database = "users"; //表的名字设置统计的时间(多少秒内在线人数)
+ g1 V* A4 M5 T: z4 r8 U$ `$timeoutseconds = 300;取当前时间。
; l; C1 S# o6 t5 t# H/ m' V$timestamp = time();上面的完整代码:
$ |- `! w/ V* f  l  N- k<?php  `" e' c4 X8 }; P
$server = "localhost"; //your server
( q9 t3 C% F6 J2 ^2 g' R$db_user = "root"; //your mysql database username" {( x& |- d# F" l/ x- _
$db_pass = "password"; //your mysql database password if any8 Y1 y: L* Z' E3 O" j
$database = "users"; //the db name
1 J. H' V( @3 T- E$timeoutseconds = 300;//timeoutseconds limit
& d$ u/ V4 O' y% [5 P//get the current time
+ ~( Q" k; @  Y$ ]1 |$ f$timestamp = time();" M, e, ^% C- ^4 q9 b+ T0 Q8 {
//calculate the lowest timestamp allowed
, X8 |3 @+ F% j$ C- ?2 y, P$timeout = $timestamp-$timeoutseconds;% p9 B# m/ n& u" n" `7 A+ S
?>连接mysql
  S8 e: \# n6 z& Imysql_connect('localhost', 'username', 'password');也允许使用变量形式。5 y2 ?' v3 G/ ~9 d" c3 A5 u
mysql_connect($server, $db_user, $db_pass);如果mysql数据库没有密码的话可以使用下面代码连接
0 n0 @$ E' k/ I9 [4 M4 D9 u  tmysql_connect($server, $db_user);查询数据库的代码:8 o+ e5 ~4 l8 g" u0 b
mysql_db_query('database', 'query');我们只要有访客就要增加一条记录。
) k- D4 g& s# }, K$insert = mysql_db_query($database, "INSERT INTO useronline VALUES
" X; S- M! ^) d( G0 k7 K('$timestamp','".$_SERVER['REMOTE_ADDR']."','".$_SERVER['PHP_SELF']."')");6 M4 Y$ J/ \# o3 e0 W" g3 S
如果用户用错误信息的话,这样处理。
  a9 \5 q7 Y# K# Q* M# o* vif(!($insert)) {
1 H' R. `2 G; B( A" ^# Rprint "Useronline Insert Failed > ";: o# [& d  ?1 {# l
}然后实现当超过设置的时间就删除该用户记录。
5 K- u/ o% K; R% J7 H% H$delete = mysql_db_query($database, "DELETE FROM useronline WHERE timestamp<$timeout");同样给出删除记录出错的处理。6 y8 z- |6 C  I4 W% y
if(!($delete)) {
9 A9 g! ?1 B9 Pprint "Useronline Delete Failed > ";
6 y6 n% ]% p8 q3 P- U, a}下面我们解决数据库中不同IP的问题
& I- w; |. O/ E0 @7 f$ N. p$result = mysql_db_query($database, "SELECT DISTINCT ip FROM useronline WHERE file='".$_SERVER['PHP_SELF']."' ");使用
; S2 J1 f7 O2 L% c) T8 ~; U9 Jmysql_num_rows(query);来统计用户,代码如下。
8 A. l0 a9 _" A( O+ \$user = mysql_num_rows($result);最后关闭数据库。
- u. D( l3 B% h# B8 h% s) umysql_close();显示在线的人数。8 Q4 ?: E/ f1 Z
if($user == 1) {3 D4 ?+ y1 h$ e: M) k. u: T
print("1 user online\n");# K0 U) i* s% X( f& z8 d4 P
} else {
5 o$ \; Y$ W' P3 _/ ^print("$user users online\n");
0 f9 }& }0 x& j1 L, l}最终把上面代码写成一个PHP文件如下。: C, D% p! R* V7 C' L
<?php: o. d1 K7 r" t
//Put your basic server info here+ K8 c$ X% e5 o2 \* d
$server = "localhost"; //normally localhost+ e  ?" J* g8 K7 ~3 n: Y6 S% t6 J
$db_user = "root"; //your MySQL database username
. ^7 J4 [+ E' i# e4 `3 M$db_pass = "password"; //your MySQL database password
4 I2 J5 x2 ?1 r% ]5 U7 D$database = "users";% j& E6 D9 R, I; J% ~0 J
$timeoutseconds = 300; //it will delete all people which haven't refreshed(so probbably are  B( a4 i/ T1 f" l; ^; Z
// offline or inactive) in $timieoutseconds time (so it actually checks the people that are active in the last
/ N% L* m1 X3 T% T9 F2 R// $timeoutseconds seconds)# e4 V, H9 ^7 V
//this is where PHP gets the time
" b1 L- `" G! c5 T4 S$timestamp = time();' v; a0 ^% I* V# n2 C/ D0 {  |* b
//counts the timeout, all people which have been seen last online in earlier than this timestamp, will get removed6 ]7 ?! p2 t. Y$ b$ m
$timeout = $timestamp-$timeoutseconds;- s6 h& z, ^! ?- d/ m
//connect to database
) X; c  h7 w, Q6 A5 o/ X9 Dmysql_connect($server, $db_user);6 a3 i5 L, S) x, ~
//add the timestamp from the user to the online list
( n% Q. j4 Q/ ]( y0 F. T# P: P$insert = mysql_db_query($database, "INSERT INTO useronline VALUES) g9 a) S  A9 j% R8 k
('$timestamp','".$_SERVER['REMOTE_ADDR']."','".$_SERVER['PHP_SELF']."')");7 O9 f: h2 O( Q9 t$ k6 z! k
if(!($insert)) {
4 P& \" i+ \* x7 t; f) g" I5 ]8 Cprint "Useronline Insert Failed > ";
+ q% j7 {1 S4 [! ~/ T}3 W' V5 r9 y( `% o6 ]9 j8 f! k
//delete the peoples which haven't been online/active in the last $timeoutseconds seconds.
, d. Q8 A/ Y. h# ]3 k8 X8 R$delete = mysql_db_query($database, "DELETE FROM useronline WHERE timestamp<$timeout");
# Y% U# g4 d) F9 I. {if(!($delete)) {
0 [' [" K* _  }/ bprint "Useronline Delete Failed > ";+ ?9 \6 {) j  k6 s" I, K
}
. w" P/ g% ^5 ~  {% l" W//select the amount of people online, all uniques, which are online on THIS page
. r7 g: N% @0 y; J7 N% l" [1 I$result = mysql_db_query($database, "SELECT DISTINCT ip FROM useronline WHERE file='".$_SERVER['PHP_SELF']."' ");7 L2 R9 s  N9 @6 j1 ?& v
if(!($result)) {
5 g! _! n; b% ^( Z9 Vprint "Useronline Select Error > ";& e  o6 f- q$ g
}9 \* h* ]# n' Y5 D
//Count the number of rows = the number of people online( B  D3 j6 j# o( c) Q
$user = mysql_num_rows($result);* N( x% s2 [) y
//spit out the results
0 E# d* N, e( S) h# qmysql_close();
1 G3 Z9 Z+ e9 A4 Z3 r/ _0 hif($user == 1) {- h  X. Z, F4 R9 }% D) a
print("1 user online\n");9 i5 S3 v* W- U
} else {
. D( m0 M, f2 ?0 K7 s/ _! qprint("$user users online\n");
" N- k+ a0 G8 {}
( e  u2 P1 C- O: ^+ Y?>0 Y" C2 q$ Z% r' ~; z- V  g$ {$ i$ J

+ j5 V9 ^0 F5 b% Y/ s0 ^' A: C以上代码我是在时代互联提供的免费试用主机上测试的,感觉效果还不错,性能很稳定,不信的话你也可以去试试。当然,记得指出我这个程序中的不足先哦。
* G8 [1 g2 a. l2 F1 ?% d  z时代互联是行业内最早开始提供PHP 虚拟主机的公司之一,现在已经是的金牌域名注册商和中国互联网客户满意度十佳单位,产品功能已经非常完善 ,特别提一下几个特有用的功能:数据库自动备份、免费集成繁简通简装版、多域名绑定、多子网站支持、GCDN 网站加速器、镜像加速、高级访问统计系统、支持WAP、可选电信/网通/香港机房。
7 H+ K: ]$ x5 W我之前建站的时候选的是他们公司标准商务E型,因为这款机型还特别支持ASP.NET3.5(3.0/2.0/1.1)/ASP。
6 I" d  i$ {# ]8 j当然啦,这两款主机也是相当不错的。7 Q8 U1 o1 b' r6 T( I" Y  V# e! r
智强商务B型:Unix /Linux 操作系统+独立网页空间1000MB+送1000MB邮局空间+100MB MySQL数据库空间=1869元/年
3 W) P1 D) |. H: X- R  I4 O6 _标准商务B型:Unix /Linux 操作系统+独立网页空间500MB+送800MB邮局空间+60MB MySQL数据库空间=1365元/年1 H8 F0 t- x! r& I/ q/ o
提供一下这个公司的联系方式:请见:http://www.now.cn/vhost/
4 X6 j7 `2 |7 x1 G9 T% [空间专线: 0756-2623871  QQ:168075865,好象还有全球免费网络电话:全球免费咨询电话 http://www.now.cn/callcenter/call.net?LineName=55
- u1 Z* J3 @( p1 ?& R4 d自己加QQ去问吧。




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