|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
最近陆续的有人问我学习php的心得,现在整理为下面,希望可以对大家有些帮助。法式 援用“星空荡子”php中文文档的例子:
聊天室,是 Web 站上打发无聊人士的奥密兵器。同时,站长或其它人员也能够在这儿杀工夫。乃至产生一段大张旗鼓的网路爱情呢,就算没有,最少可以增添打字的速度。
聊天室,其实就是多人配合利用的 CGI 程式。程式将每一个人输出的字串,依体系吸收完成的工夫收拾整顿事后,再送给各个利用者。而 Web 聊天室和 BBS 的聊天室分歧的中央是 BBS 聊天室可以每收到一句话,就即刻分送给每位在聊天室的网路利用者;Web 因为 CGI 程式不克不及像 BBS 的 telnet 一向连线,Web CGI 必需以最快的速度将新闻送出,然后停止连线。会构成这类情况,就是由于 Web 聊天室仍是利用 HTTP 传输协议,在 HTTP 实作的版本,不管是 0.9、1.0 或是 1.1 版都不克不及临时占有网路连线的 Port。
为懂得决材料没法即刻传输的成绩,及更新讯息的成绩,Netscape 在 3.0 版阅读器以后利用了新的手艺,而 Internet Explorer 也实作了这些 Netscape 研收回来的手艺。Netscape 将它分红 Server Push 及 Client Pull 二种手艺。Server Push 由 Web 伺服器将材料以多重 MIME 编码,送给利用者端,今朝较少网站利用这类体例;而 Client Pull 则使用了 HTML 的 meta 标签,并使用 http-equiv="Refresh" 的属性,暗示材料要从头载入,至于载入工夫,则使用 content 属性来告竣。
<meta> 标签凡是都放在 <head>..</head> 的区段中,以便让阅读器可以仅早筹办更新利用者真个网页。上面为 meta 和 PHP 适用的例子,设定为每十五秒从头载入一次。
<meta http-equiv="Refresh" content="15; url=<? echo $PHP_SELF; ?>">
假如不必 Server Push 或是 Client Pull 来做聊天室,是不是有其它的办法,让 Web 的阅读器能聊天呢?谜底是一定的。可使用 Java 或是 ActiveX (限 IE4、5) 来做乃至自行开辟专属的 Browser Plug-in 程式 (如奇摩的聊天室),不外这就和 PHP 没有关系了,不是咱们要的重点。
除此以外,因为按期更新一切网友的留言,为了怕写了一半由于 refresh 而被清失落还没有写好的字串,因而将聊天室以 frame 的页框手艺来做是有需要的。下例就是聊天室的主程式。
<html>
<head>
<title>聊天室</title>
</head>
<frameset rows="*,40" border=1>
<frame src="list.php" name=list scrolling=auto>
<frame src="post.php" name=post scrolling=no>
<noframes>
<body>
本聊天室需利用页框,您的阅读器没法利用
</body>
</noframes>
</frameset>
</html>
程式中以 frame 带出二支 PHP 程式,建议将它们放在统一目次当中,例如 /chatroom,以便往后保护。别的,为了 list.php 及 post.php 可使用不异的变数,下例将共通的变路途径放在 env.inc 中,可以将它放在 /chatroom 或是 Web 伺服器 (如 Apache) 的 PHP include 设定途径中。
<?php
// 档名: env.inc
$tempdir="/tmp/";
$chatfile="/tmp/abc";
?>
聊天室的后端可以设计的很复杂,纯真的利用档案来做,也能够弄个材料库,将聊天的内容丢入,若是真的很在乎体系效力,也许可以思索利用 UNIX 的行程通信 IPC 了。
本节行将利用者留言的内容放入档案中,在这儿的例子大部分都利用 UNIX/Linux 的内部指令。若体系无该指令 (或称程式),请自行装置相干程式。
实践大将材料丢入档案中会比利用材料库还快,若还很在意速度,可以在 UNIX 机械中装上 RAM Disk,再将档案的存取途径都设在该 RAM Disk 上,包管存取速度能知足严苛的请求。在有些以高速度搜索引擎为召唤的网站,乃至将全部材料库材料都放到 RAM Disk 中,即刻让体系速度进步十倍百倍,并且 RAM 的价钱和其它处理计划比拟的话还算很廉价。若利用 Windows NT,那就没举措了,看微软甚么时分供应,或用 Third Party 的产物了。
有些利用者能够对 UNIX 还不是很熟,在这儿先简介会用到的指令:
touch: 创立新档案,或修正旧档的最初更新日期。
echo 加上二个大于符号: 将字串显示转向到指定的中央。
tail: 显示档案最初数行的材料,内定值为十行,可以使用减号加数字,修正欲显示的行数。
上面为送出及处置留言字串的程式,程式用到 env.inc 的档案。
<?php
// 档名: post.php
require("env.inc");
if (($chatuser!="") and ($chattext!="")) {
$chatstr="<font color=8080ff>".date("h:i:s")."</font>-<font color=ff8080>".$chatuser."</font>: ".$chattext;
$cmdstr="echo \"".$chatstr."\" >> ".$chatfile;
if (!file_exists($chatfile)) passthru("touch ".$chatfile);
passthru($cmdstr);
}
?><html>
<body bgcolor=ffffff leftmargin=0 topmargin=0 marginheight=0 marginwidth=0>
<form action=<? echo $PHP_SELF; ?> method=post>
<table border=0 width=100%><tr>
<td align=right>匿称:</td>
<td><input type=text name=chatuser size=8 value="<? echo $chatuser; ?>"></td>
<td align=right>讲话:</td>
<td><input type=text name=chattext size=30 maxlength=500></td>
<td><div align=right><input type=submit value="送出"></td>
</tr></table>
</form>
</body>
</html>
程式先反省是不是有输出字串,若无匿名及讲话内容字串则显示讲话的表单 (Form),如有材料则将字串及事先工夫存入档案中 (使用 UNIX 的转向指令)。固然,为了避免毛病,先反省是不是有档案可存档,若没有则先 touch 该档,例中的档案就是 /tmp/abc。
<html>
<meta http-equiv="Refresh" content="5; url=<? echo $PHP_SELF; ?>">
<meta content="text/html; charset=gb2312" http-equiv=Content-Type>
<body bgcolor=ffffff leftmargin=0 topmargin=0 marginheight=0 marginwidth=0>
<?
// 档名: list.php
require("env.inc");
if (!file_exists($chatfile)) {
echo "还没有倒闭</body></html>";
exit;
}
$uniqfile=$tempdir.uniqid(rand());
$shellcmd="/usr/bin/tail -50 ".$chatfile. " > ".$uniqfile;
passthru($shellcmd);
$chatfilearray=file($uniqfile);
$j=count($chatfilearray);
for ($i=1; $i<=$j; $i++) {
echo $chatfilearray[$j-$i]."
\n";
}
unlink($uniqfile);
?>
</body>
</html>
下面的程式就是利用 Client Pull 的手艺,每五秒就从头更新一次。一样地,它也 require 共用的 env.inc 档,要改动个中的变数时,即刻就能够让一切的程式用到,这对开辟网站来讲,是蛮主要的办法,可以将网页程式中城市呈现的中央。例如 Copyright (C) 1996-2000 的字串,放在一个档案上,到了新的一年,只需改一个档,全部站都改了。
if (!file_exists($chatfile)) {
echo "还没有倒闭</body></html>";
exit;
}
$uniqfile=$tempdir.uniqid(rand());
$shellcmd="/usr/bin/tail -50 ".$chatfile. " > ".$uniqfile;
passthru($shellcmd);
程式先反省有无利用者发送聊天内容的档案 /tmp/abc,若没有就显示还没有倒闭,等利用者送聊天内容。若已有聊天材料,就抓出最初五十笔,在在别的的档案中筹办显示。
$chatfilearray=file($uniqfile);
$j=count($chatfilearray);
for ($i=1; $i<=$j; $i++) {
echo $chatfilearray[$j-$i]."
\n";
}
unlink($uniqfile);
将档案读入阵列变数 $chatfilearray 中,并以最初的材料最早显示的体例送给阅读器端,固然可使用对阵列排序的办法,但肯定必定时最初存入的材料在最初面,将它排序其实很华侈 CPU 工夫,因而就从最初 echo 到最后面的材料。利用完成还要用 unlink() 指令,将一时档杀失落。 在学习PHP这六个月里,每看到一个优秀的php脚本,就会兴奋的手舞足蹈,嘴里还不停的说:太酷了,太酷了。呵呵,很幼稚吧,但这可能就是兴趣。 |
|