一个简单的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 在线翻译函数代码
May 07 PHP
CI框架源码阅读,系统常量文件constants.php的配置
Feb 28 PHP
PHP Directory 函数的详解
Mar 07 PHP
PHP笔记之:基于面向对象设计的详解
May 14 PHP
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
Aug 01 PHP
php获取随机数组列表的方法
Nov 13 PHP
php读取远程gzip压缩网页的方法
Dec 29 PHP
在php和MySql中计算时间差的方法详解
Mar 27 PHP
PHP函数超时处理方法
Feb 14 PHP
使用PHP访问RabbitMQ消息队列的方法示例
Jun 06 PHP
Yii框架数据库查询、增加、删除操作示例
Oct 14 PHP
PHP 数组操作详解【遍历、指针、函数等】
May 13 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读取远程gzip压缩网页的方法
2014/12/29 PHP
php实现异步数据调用的方法
2015/12/24 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
web css实现整站样式互相切换
2013/10/29 Javascript
JS、CSS以及img对DOMContentLoaded事件的影响
2014/08/12 Javascript
jquery+php实现搜索框自动提示
2014/11/28 Javascript
使用jquery 简单实现下拉菜单
2015/01/14 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
2017/12/28 Javascript
jQuery实现炫丽的3d旋转星空效果
2018/07/04 jQuery
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
js代码实现轮播图
2020/05/04 Javascript
JS实现躲避粒子小游戏
2020/06/18 Javascript
python之Character string(实例讲解)
2017/09/25 Python
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
Python 生成 -1~1 之间的随机数矩阵方法
2018/08/04 Python
python实现kmp算法的实例代码
2019/04/03 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
2020/02/07 Python
如何把外网python虚拟环境迁移到内网
2020/05/18 Python
将pycharm配置为matlab或者spyder的用法说明
2020/06/08 Python
Python json格式化打印实现过程解析
2020/07/21 Python
python跨文件使用全局变量的实现
2020/11/17 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
小学生安全责任书
2014/07/25 职场文书
个人股份转让协议书范本
2014/10/26 职场文书
会计求职自荐信范文
2015/03/04 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
倡议书的格式写法
2015/04/28 职场文书
队名及霸气口号大全
2015/12/25 职场文书
MYSQL(电话号码,身份证)数据脱敏的实现
2021/05/28 MySQL