一个简单的PHP入门源程序


Posted in PHP onOctober 09, 2006

引用“星空浪子”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]."<br>\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]."<br>\n";
}
unlink($uniqfile);

将档案读入阵列变数 $chatfilearray 中,并以最后的资料最先显示的方式送给浏览器端,当然可以使用对阵列排序的方法,但确定一定时最后存入的资料在最后面,将它排序实在很浪费 CPU 时间,因此就从最后 echo 到最前面的资料。使用完成还要用 unlink() 指令,将临时档杀掉。

PHP 相关文章推荐
PHP网站基础优化方法小结
Sep 29 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
Apr 23 PHP
PHP中如何定义和使用常量
Feb 28 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
Aug 01 PHP
linux实现php定时执行cron任务详解
Dec 24 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
Jul 22 PHP
PHP获取远程图片并保存到本地的方法
May 12 PHP
百度地图API使用方法详解
Aug 25 PHP
php常用字符函数实例小结
Dec 29 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
Oct 15 PHP
PHP学习之PHP表达式
Oct 09 #PHP
聊天室php&amp;mysql(三)
Oct 09 #PHP
PHP学习之PHP运算符
Oct 09 #PHP
PHP学习之PHP变量
Oct 09 #PHP
php的控制语句
Oct 09 #PHP
PHP4 与 MySQL 交互使用
Oct 09 #PHP
Access数据库导入Mysql的方法之一
Oct 09 #PHP
You might like
PHP的面试题集,附我的答案和分析(一)
2006/11/19 PHP
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
PHP命名空间namespace及use的简单用法分析
2018/08/03 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
javascript对JSON数据排序的3个例子
2014/04/12 Javascript
Javascript判断文件是否存在(客户端/服务器端)
2014/09/16 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
JS选取DOM元素的简单方法
2016/07/08 Javascript
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
解决Antd 里面的select 选择框联动触发的问题
2020/10/24 Javascript
Python运行报错UnicodeDecodeError的解决方法
2016/06/07 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
2017/11/08 Python
Python基于Floyd算法求解最短路径距离问题实例详解
2018/05/16 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
Python3直接爬取图片URL并保存示例
2019/12/18 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
kafka-python 获取topic lag值方式
2019/12/23 Python
Python 项目转化为so文件实例
2019/12/23 Python
Django框架请求生命周期实现原理
2020/11/13 Python
低碳环保演讲稿
2014/08/28 职场文书
软件测试专业推荐信
2014/09/18 职场文书
杨善洲电影观后感
2015/06/04 职场文书
2016大学军训通讯稿
2015/11/25 职场文书
如何写好竞聘报告
2019/04/03 职场文书
导游词之包公祠
2019/11/25 职场文书
python自动化调用百度api解决验证码
2021/04/13 Python