默认情况下,PHP会话(session)是通过文件来保存的。这样做有以下几个缺点:
- 会话文件一般都很小,但文件数却很多,在文件系统中保存许多这样的小文件非常浪费空间,且效率不高。
- 分布式的站点难以利用会话文件来共享会话。
- 会话文件方式不利于统计在线用户的会话信息。
为解决以上问题,我们可以考虑用数据库来保存会话信息。
对于 PHP 开发来说,保存会话用 MySQL 是一个非常不错的选择。MySQL 提供一种建立在内存中的表类型 Heap,如果每条会话数据量很小的话,可以考虑用这种类型的表来进一步优化性能。但是 Heap 类型的表有许多限制,例如它不支持 text 类型的字段,因此如果在无法预测会话数据记录长度的情况下,选择 MyISAM 是比较合适的,这种类型的表没有事物处理开销,对于基于磁盘的表可以得到最优性能。
下面是 sessions 表的结构:
- DROP TABLE IF EXISTS `sessions`;
- CREATE TABLE `sessions` (
- `session_id` varchar(32) NOT NULL default '',
- `user_id` int(10) unsigned NOT NULL default '0',
- `data_value` text NOT NULL,
- `last_visit` timestamp(14) NOT NULL,
- PRIMARY KEY (`session_id`),
- KEY `user_id` (`user_id`)
- ) TYPE=MyISAM;
PHP 支持用户会话模块,可以通过 session_set_save_handler 来设置自定义的会话处理函数。因为默认的处理模块是 files,因此要在用 session_set_save_handler 设置会话处理函数之前,先用 session_module_name(’user’) 来告诉 PHP 使用用户会话模块, 而session_set_save_handler 必须要在 session_start 之前执行。
用户会话数据在会话处理函数中都是序列化之后的,要取出其中的某个会话变量,可以对其进行反序列化,默认是 php 序列化方式,可以用 session::unserialize 函数来反序列化。
下面的代码定义了一个用 MySQL 来处理 PHP 会话的类,其中所使用的 class_mysql.php 请参见 《超级简单但超级实用的 PHP 的 mysql 类》 。
- <?php
- /**
- * @author 马秉尧
- * @copyright (C) 2005 CoolCode.CN
- */
- require_once("class_mysql.php");
- class session {
- var $db;
- function session(&$db) {
- $this->db = &$db;
- session_module_name('user');
- session_set_save_handler(
- array(&$this, 'open'),
- array(&$this, 'close'),
- array(&$this, 'read'),
- array(&$this, 'write'),
- array(&$this, 'destroy'),
- array(&$this, 'gc')
- );
- session_start();
- }
- function unserialize($data_value) {
- $vars = preg_split(
- '/([a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)|/',
- $data_value, -1, PREG_SPLIT_NO_EMPTY |
- PREG_SPLIT_DELIM_CAPTURE
- );
- for ($i = 0; $vars[$i]; $i++) {
- $result[$vars[$i++]] = unserialize($vars[$i]);
- }
- return $result;
- }
- function open($path, $name) {
- return true;
- }
- function close() {
- return true;
- }
- function read($session_id) {
- $session_id = $this->db->escape_string($session_id);
- if ($row = $this->db->query("select * from `sessions` where `session_id` = '$session_id' limit 1")) {
- return $row['data_value'];
- }
- else {
- $this->db->query("insert into `sessions` set `session_id` = '$session_id'");
- return "";
- }
- }
- function write($session_id, $data_value) {
- $data = $this->unserialize($data_value);
- $session_id = $this->db->escape_string($session_id);
- $data_value = $this->db->escape_string($data_value);
- $this->db->query("update `sessions` set "
- . "`user_id` = '{$data['user_id']}', "
- . "`data_value` = '$data_value', "
- . "`last_visit` = null "
- . "where `session_id` = '$session_id'");
- return true;
- }
- function destroy($session_id) {
- $session_id = $this->db->escape_string($session_id);
- $this->db->query("delete from `sessions` where `session_id` = '$session_id'");
- return true;
- }
- function gc($lifetime) {
- $this->db->query("delete from `sessions` where unix_timestamp(now()) - unix_timestamp(`last_visit`) > $lifetime");
- return true;
- }
- // get sessions by user_id
- function get($user_id) {
- $user_id = $this->db->escape_string($user_id);
- return $this->db->query("select * from `sessions` where `user_id` = '$user_id'");
- }
- // get sessions list
- function lists($page, $rows) {
- if ($page == 0) {
- return $this->db->query("select * from `sessions` order by `user_id`");
- }
- else {
- $start = ($page - 1) * $rows;
- return $this->db->query("select * from `sessions` order by `user_id` limit $start, $rows");
- }
- }
- }
- ?>
这个类的使用很简单,在原来使用 session_start 的地方,替换成 $session = new session($db) 就可以了。$db 表示 sessions 表所在的数据库。
另外可以用 get 方法来获取某个用户的所有会话信息,通过 lists 方法来得到所有用户会话列表。这样就可以方便的管理用户会话了。
第一部分、较轻微的错误
一、Printf(),
该函数主要用来格式化显示数据。当你要改变某个数据的显示格式时才使用。
例如以不同的精度来显示PI(3.1415926)的值。
/*
* The three faces of Π
*/
printf ("Pi is: %.2fn
n", M_PI);
printf ("Pi is also: %.3fn
n", M_PI);
printf ("Pi is also: %.4fn
n", M_PI);
?>
但许多程序员仅仅为显示一些变量值和函数返回值使用该函数。因为Printf()在显示数据前要先格式化该数据以速度较慢,因此,仅为了显示数据时应用print和echo,以提高速度。
二、语意检查
PHP是一种弱类型语言,也就是说在使用一个变量前不用定义,这样给编程带来了很大的方便和灵活,但你自己必须知道该变量到底应该是哪种类型,因为该变量在运行时仍实际对应着某一种类型(各种类型之间可以自由互相转换),没有类型的变量是不存在的。有可能PHP并不能检查出你的语意错误,但由于变量类型的变化,会导致一些潜在的问题的发生。另外一个值得注意的问题是变量的范围,它也可能会导致一些潜在的问题的发生。
在PHP中有以下几种基本变量:
Boolean, resource, integer, double, string, array and object。
三、临时变量的使用
临时变量的滥用会导致程序运行效率的降低。何时使用临时变量可基于以下两点考虑:
1、该变量是否至少使用两次。
2、该变量的使用是否会显著提高程序的可读性。
如果一条也不满足,则省略该变量的使用。例如:
$tmp = date ("F d, h:i a"); /* ie January 3, 2:30 pm */
print $tmp;
?>
就应该改成:
print date ("F d, h:i a");
?>
又如:
// string reverse_characters(string str)
// Reverse all of the characters in a string.
function reverse_characters ($str)
{
return implode ("", array_reverse (preg_split("//", $str)));
}
?>
的可读性不强,可改成:
// string reverse_characters(string str)
// Reverse all of the characters in a string.
function reverse_characters ($str)
{
$characters = preg_split ("//", $str);
$characters = array_reverse ($characters);
return implode ("", $characters);
}
?>
四、客户端和服务器端代码的分离
客户端和服务器端代码的在PHP程序中实际上就是HTML代码和PHP语言代码,很多人把HTML和PHP语句混合在一个文件里,使得这文件很大,这种风格对程序的维护和再开发很不利,不适合大型站点的开发。一般有两种方法把HTML和PHP语句分开:
1、编写专用API,例如:
index.php ? The Client side
| |
site.lib ? The server side code
$dbh = mysql_connect ("localhost", "sh", "pass")
or die (sprintf ("Cannot connect to MySQL [%s]: %s",
mysql_errno (), mysql_error ()));
@mysql_select_db ("MainSite")
or die (sprintf ("Cannot select database [%s]: %s",
mysql_errno (), mysql_error ()));
$sth = @mysql_query ("SELECT * FROM site", $dbh)
or die (sprintf ("Cannot execute query [%s]: %s",
mysql_errno (), mysql_error ()));
$site_info = mysql_fetch_object ($sth);
function print_header ()
{
global $site_info;
print $site_info->header;
}
function print_body ()
{
global $site_info;
print nl2br ($site_info->body);
}
function print_links ()
{
global $site_info;
$links = explode ("n", $site_info->links);
$names = explode ("n", $site_info->link_names);
for ($i = 0; $i < count ($links); $i++)
{
print "ttt
$names[$i]
n
n";
}
}
?>
这种方法使得程序看起来比较简洁,而且执行速度也较快。
2、使用模板的方法
这种方法使得程序看起来更简洁,同样实现上面的功能,可用以下代码:
%%PAGE_TITLE%%
%%PAGE_LINKS%% | %%PAGE_CONTENT%% |
用占位符代替要动态生成的内容,然后用一解析程序分析该模板文件,把占位符用际的内容替换。种方法使得即使不会使用PHP的页面制作人员也能修改模板文件。这种方法的缺点是执行效率不高,因为要解释模板文件。同时实现起来也比较复杂。
注: www.thewebmasters.net的 FastTemplate class可方便的实现以上功能。
五、不要用过时的函数
作为一种自由软件,PHP发展很快,其中的很多函数都已过时,例如:
while (1):
print "5";
if ($idx++ == 5):
break;
endif;
endwhile;
虽然还能用但效率肯定不高,而且可能在以后的版本中会禁用,导致程序不能运行。因此要经常对照最新PHP手册检查那些函数已过时及时修正
<?
//asx的格式:
function channelprogramlist($filename){
$str="";
$str.="<ASX version="3.0">rn";
$str.="t<ENTRY>rn";
$str.="tt<AUTHOR>".$filename; //节目名
$str.="</AUTHOR>rn";
$filename=urlencode($filename); //把节目名转换
$filepath="http://".192.168.0.1"/".$filename; //192.168.0.1是服务器的ip
$str.= "tt<REF HREF="$filepath" />rn";
$str.= "t</ENTRY>rn";
}
$str.= "</ASX>";
return $str;
}
//写asx文件
function writeFile($str){
$file="mms.asx";
$fp = fopen($file,"w+");
fwrite($fp,$str);
fclose($fp);
return $file;
}
//控制mediaplayer每次从新读取文件
function PlayChannel($urlstr){
echo "<script language="javascript">n";
echo "function change(){n";
echo "t"."document.mediaPlayer.file=".$urlstr.";n";
echo "}n";
echo "</script>n";
}
?>
<html>
<head>
<title>播放器</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<?php
$filename="神话";
PlayChannel(writeFile(channelprogramlist($filename)));
?>
</head>
<body leftmargin="0" topmargin="0" onLoad="change()" bgcolor="#000000">
<object id="mediaPlayer" width="554" height="380" classid="clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95" standby="Loading Microsoft Media Player components..." type="application/x-oleobject">
<PARAM NAME="animationatStart" VALUE="true">
<PARAM NAME="transparentatStart" VALUE="true">
<PARAM NAME="autoStart" VALUE="true">
<PARAM NAME="CanSeek" VALUE="FALSE">
<PARAM NAME="showControls" VALUE="FALSE">
<param name="FileName" value="mms.asx">
<embed type="application/x-mplayerO" pluginspage="http://www.microsoft.com/Windows/Downloads/Contents/Products/MediaPlayer/" autostart="1" width="500" height="400">
</embed>
</object>
</body>
</html>
项目过程
1、项目启动
1)、项目组成立(公司成员、客户成员)
2)、制定项目预期目标
3)、制定项目计划周期
4)、建立好项目组成员沟通机制
2、需求调研
1)、创建调研计划、协调调研时间
2)、收集客户资料,获取客户需求
所有的资料都需要保留一份,资料中存疑的需要及时询问
3)、编写需求文档
重点描述出客户的业务流程和性能要求。
采用Word、Excel、Rose等形式。
4)、需求变更记录
5)、确定开发环境和运行环境
6)、扩展性要求
7)、与旧系统的接驳要求。
8)、估算出项目工作量
本阶段需要一套需求管理系统来进行需求的管理。
本阶段的需求文档也是用户测试的依据。
3、系统设计/详细设计
一个系统可以分为基础平台和应用模块两部分。
1)、选择基础平台,无论是采用第三方平台还是自行开发平台,都需要深入了解,查看是否符合要求。
2)、应用模块设计(针对业务流程)
3)、中间件的采用或自行开发,需要深入了解。
4)、用户界面的设计
如果用户界面设计完毕并确认,即可初步写出用户使用手册、管理员使用手册。
5)、变更记录
本阶段的系统设计是集成测试的依据。
4、程序开发
创建开发任务计划表、开发计划日程表
1)、优先编写测试用例
2)、按照编码规范编写代码
3)、按照文档注释规范注释
以上形成开发文档。
本阶段需要一套版本管理系统。
本阶段的测试用例也是单元测试的依据。
如果能做到,最好每日构建。
5、测试
本阶段需要一套Bug管理系统,形成需求、设计、开发、测试互动。
1)、编写测试计划和测试方案
2)、功能测试
单元测试、集成测试
3)、性能测试
集成测试、压力测试
如果能做到,最好能进行自动化测试。
如果能做到,做分析统计工作。
最后形成测试报告。
6、试用、培训、维护
本阶段需要解决:
1)、解决异地修改和公司修改的同步问题。
2)、用户测试中的Bug修改问题,按照级别分为
a)、程序Bug
b)、设计变更
c)、需求变更
尽量按照a b c的顺序来进行修改,尽量避免b、c级的修改。
最后形成安装手册、维护记录。
项目成员组成
根据以上过程,一个项目组中,需要:
1、需求工程师,其要求
善于与客户沟通,能快速了解客户的需求,对客户所在的行业比较熟悉。
善于学习新知识。
熟悉Word、Excel、Rose等工具的使用。
熟悉开发语言和开发框架
熟悉已积累的产品的功能、性能等。
2、系统分析师/设计师,其要求
精通开发语言和开发框架,部分需要精通数据库
精通已积累的产品的功能、性能等
深入了解客户行业特点
能根据客户的要求分析出其实质
能做出优秀的设计
熟悉Word、Excel、Rose等工具的使用
3、开发工程师,其要求
熟悉开发语言,熟悉开发要求和注释规范,部分需要熟悉数据库。
熟悉单元测试。
能根据设计做出良好的编码,保证功能和性能。
部分需要有一定的设计要求,因为涉及到将来的维护。
4、测试工程师,其要求
熟悉测试工作,能按照测试计划进行测试。
熟悉开发语言,能协助开发工程师找错。
能独立完成黑、白盒测试。
如果是高级测试人员,还要能够对系统能深入进行分析并能制定出优秀的测试方案。
5、管理人员
一般由以上人员兼任,主要有
项目经理:负责整个项目
开发经理:负责系统设计、开发工作
测试经理:负责测试工作
6、其他人员
一些项目涉及到其他人员,如页面设计人员、页面制作人员。
部分大的项目,还有专门的维护人员。
由于目前国内很多公司并没有严格这么区分,如果项目小的话,可以一人兼任多项职位
【回帖】看了别人的帖子,加复一下,表示自己的意见,这叫回帖,也叫跟帖。
【置顶】一个帖子,回复的人或者跟帖的人多了,就成了热门帖。一般论坛,会把这样的帖子放到所有帖子的最前面,这叫置顶。如果再编入论坛永久保留的精华区,对发帖的人是一种无上的光荣。
【顶】顶,也叫推,回帖的一种。不过所谓顶,就是在回帖时,不表示什么具体的意见,仅仅表示支持一下,这是看帖的基本美德之一。
【砖·水】一个论坛即要有砖———精彩的帖子,吸引网虫浏览、议论;也要有水———没什么内容的帖子,或同一文章在同一版或不同版重复发表三次以上者。然而灌水,有实际提高论坛人气的显著作用,只要灌得不要太过分而影响了他人,一般都是被允许甚至鼓励的。有的论坛甚至设立专门的灌水区,供灌水爱好者发泄。
【潜水】论坛有了水,自然也就可以潜水,潜水特指论坛里那些只看不回帖的人。因为这种行为,对论坛人气提升极为不利,所以这也是论坛管理者们和积极地发帖者们最恨的。就算你看了帖子,没什么想法,也可以顶一下嘛,又不掉块肉的喽!如果是长期不发言的潜水员,突然发言,则称为浮上来。
【楼】有砖才能盖楼,一个帖子如果吸引人,就会有很多人回帖。第一个帖子和回帖,从上到下以时间顺序排列,下面的称上面的叫楼上,或者按次序称之为第N楼的。回帖的人有时也会相互讨论,楼上楼下打成一片,而这个一系列帖子的发起者(原帖)就成了楼主。
【删帖】这是论坛管理员或者斑竹的特权,它可以根据论坛的基本规则,决定是否删除某人的帖子,一般是这些帖子违反了论坛不成文的规矩。然而删帖行为,经常会引发论坛管理者和发帖人之间激烈的矛盾。矛盾激化,有的高层斑竹甚至会封掉某些人的发帖权。
【ID·头衔】论坛一般都是自由开放的。一般的浏览者都称为游客,许多论坛游客是不能发言的,要发言就必须成为正式成员,即注册ID,它是你在论坛的用户名。而一个优秀的论坛,还允许固定成员使用代表自己ID的可爱头像和个性签名。所谓签名,一般都是超好玩的Gif动画。至于头衔,一般是根据你在论坛的发帖或者回帖数量,自动产生的。
【天外飞砖·拍砖】这是一种特别的帖子,其目的是中伤某人的网络名誉。所以在论坛成名成家者,要特别小心喔!至于拍砖,是指回帖时持批评态度。
【水桶·水鬼·水仙·水王·水怪·水母】这些都是指灌水狂人,其中水母特指女性。
网络通用辞典:叫叫版
◎我不叫我,叫———偶
◎年轻人不叫年轻人,叫———小P孩
◎蟑螂不叫蟑螂,叫———小强(来自于周星驰的《唐伯虎点秋香》)
◎什么不叫什么,叫———虾米
◎不要不叫不要,叫———表
◎喜欢不叫喜欢,叫———稀饭
◎这样子不叫这样子,叫———酱紫
◎好不叫好,叫———强
◎强不叫强,叫———弓虽
◎被无数蚊子咬了不叫被无数蚊子咬了,叫———~~~新蚊连啵~~~
◎追女孩不叫追女孩,叫———泡MM
◎看MM不叫看MM,叫———鉴定
◎兴奋不叫兴奋,叫———HIGH
◎吃喝不叫吃喝,叫———腐败
◎请人吃饭不叫请客,叫———反腐败
◎散步不叫散步,叫———溜溜
◎爸不叫爸,叫———DADY
◎妈妈不叫妈妈,叫———MAMY
偶:我
kick your ass:踢你的PP
FT,分特:faint的简称,晕倒。
统一:刷墙,扫楼的同义词。也就是整个版面都是你的回复,一种被谴责的行为。
XXXX的说:一种动词后置,比如吃饭的说
XXXXing:XXXX进行中,正在XXXX。比如上网ing
MM:妹妹
GG:哥哥
DD:弟弟
JJ:姐姐 鸡鸡
PLMM:漂亮美眉,浮云
XDJM:兄弟姐妹
PFPF:佩服佩服
PP:照片,但如果是说打PP,那就是kick your ass的意思了
BT:变态。和浮云的其他版块相比,水版是个BT出没的地方 扁他(她、它)
SL:色狼。浮云的特点是,狼多也MM多
BL:玻璃,不是指一种易碎品,而是同性恋
BC:白痴
YW:阳痿,不举
BD:笨蛋
RY:人妖
LM:流氓
YY:意淫
PG:屁股
GF:girl friend,女友
BF:boy friend,男友
kao,*,拷:粗口,慎用
MD:妈的,粗口,特别慎用!
***:, *** ,粗口,特别慎用!
TNND:他XXXX的,粗口,特别慎用!
JJWW:唧唧歪歪,指人说话的样子
S***:神经病
PMP:拍马屁
MPJ:马屁精
kick:扁
slap:打耳光
KH:葵花,就是练葵花宝典的高手,浮云某高手已练至化境,人皆不呼其名,而直呼KH。
KHBD:葵花宝典
PXJF:辟邪剑法,源于KHBD,KH专用的剑法
SM:Sadism & Masochism的缩写,性虐待或指(被)虐待狂
JS:*商
SP:support,支持
的微:一种语气助词,KH专用
呼呼,猪猪:睡觉
稀饭:喜欢
果酱:过奖
BXCM:冰雪聪明
LOL:Laugh Out Loud,大笑
KFC:Kxxx & Fxxx & Cxx,要是和某人有仇,就KFC他吧
PK:player kill,砍人,攻击,也可解释为先批后K
btw:by the way,顺便说一句
PS:两种意思,btw或者photoshop(一种电脑修图软件)
CU:see you,再见
BB:宝贝,情人,孩子,byebye,看具体使用
走召弓虽:超强
满清:满清十大酷刑,老祖宗的玩艺
咔嚓:砍了,yan了
酱紫:这样
饭饭:吃饭
片片:照片
斑竹,板猪:版主,论坛版块的管理人员,把水版比作个小店,他们就是店小二。
水桶,水鬼,水仙,水王,水母:指灌水狂人,水母特制女性
水手:浮云水版的芸芸众生
潜水员:就是那些喜欢看别人灌水自己不灌水的家伙
恐龙:长得难看的MM
抓狂:受不了刺激而行为失常
THX,3X:thanks,谢谢
sigh:叹息
cool:酷
gay:同性恋,BL
fag:同性恋,BL
pm:论坛的私信
zip it:闭嘴
leecher:吸血鬼,指只知道索取不懂得分享回报的家伙,被严重鄙视的人
DL:download,下载
PUB:网路上扫描到的ftp,可以临时起上传下载功能,也指把文件传到pubftp上共享的行为。
BRB:Be right back,马上回来
TTYL:Talk to you later,再见,下次回头再谈
BBL:be back later 过会回来
kick your ass:打你屁屁
R P W T:人品问题
PPL:people,人们
PLZ,PLS:please,请
bull *** , *** :胡说,废话
sorry ass:可怜的家伙,鄙视的意思
so so:一般
cutie:甜心
d*amn:*,他XX的
包子:某人长得难看或者笨就说他包子
粉:很,非常
菜鸟,小虾,初哥:就是初级水平的新人
老鸟,大虾:高手
木油:没有
蛋白质:BD+BC+S***
爱老虎油:I love U,我爱你
倒:晕倒,厥倒
表:不要,比如表太好,不要太好的意思。
咣当:晕倒发出的声音
9494:就是就是
猪娃:CCF传过来的口语,好孩子
爆头:游戏中引来的词汇,把某人打得脑袋开花
4242:是啊是啊
7456:气死我了
748:**
886,88:再见
847:别生气
987:就不去,就不去
55555:哭
XXX:儿童不宜的东西
blah-blah:反复说
厚厚,吼吼,咔咔,kaka,嘻嘻,xixi:语气助词
猪头党,锄头党,仙族一派,神族,魔族,女子别动队。。:浮云水版的帮派组织
浮通社:浮云水版的新闻机构
五朵金花:翠花,如花,木花,黑花,菜花,水版的5个BT男
小琳飞刀:某MM版主的独门暗器,江湖第一快刀
天外飞砖:某**两口子发明的一种极凶猛的暗器,据说让人生不如死
RPWT:人品問題
---------------------------------
稀飯 ______喜歡
米油_______沒有
索_________是
介锅________這個
D_________的
8___________不