« 返回

足球论坛 的编码规范

目录

前言

本规范由编程原则组成,融归并提炼了开拓人员长时间蕴蓄堆积上去的幼稚阅历,意在扶助造成良好一致的编程风格。

适用范围

如无迥殊说明,以下规则要求完全适用于足球论坛项目,同时也可大局限适用于COMSENZ旗下其他PHP项目。

准绳化的重要性和长处

当一个软件项目尝试着遵守公共一致的准绳时,能够使参与项目的开拓人员更容易了解项目中的代码、弄清程序的状况。使新的参与者能够很快的适应环境,防止局限参与者出于节减时间的必要,自创一套风格并养成终生的风俗,招致其它人在阅读时浪费过多的时间和精神。而且在一致的环境下,也能够裁减编码出错的机缘。缺陷是由于每个人的准绳不同,所以必要一段时间来适应和改变自己的编码风格,暂时性的降底了工作效率。从使项目长远强健的发展以及前期更高的团队工作效率来研讨讨论暂时的工作效率下降是值得的,也是必必要经过的一个经过。准绳不是项目胜利的关键,但能够扶助我们在团队合营中有更高的效率并且更加顺手的完成既定的任务。
  • 程序员能够了解任何代码,弄清程序的状况
  • 新人能够很快的适应环境
  • 防止新接触PHP的人出于节减时间的必要。
  • 防止新接触PHP的人一次次的犯异样的不对
  • 在一致的环境下,人们能够裁减犯错的机缘
  • 程序员们有了一致的仇敌

PHP编码规范与原则

代码符号

PHP程序能够使用 来界定 PHP 代码,在HTML页面中嵌入纯变量时,能够使用 这样的形式。
注意:为了使代码进一步规范化和准绳化,从足球论坛 X2版本起早先禁用 这种速记形式。

注释

注释是对于那些容易健忘作用的代码增加冗长的先容性内容。请使用 C 样式的注释“/* */”和准绳 C++ 注释“//”。
在足球论坛每一个程序文件头部中,应放入相应SVN掌管字串,以方便SVN提交时自动更新:
  • $Id$

例如:

/**
 *      [足球论坛] (C)2001-2099 Comsenz Inc.
 *      This is NOT a freeware, use is subject to license terms
 *
 *      $Id$
 */
程序开拓中难免留下一些临时间码和调试代码,此类代码必需增加注释,以免日后遗忘。所有临时性、调试性、实习性的代码,必需增加同一的注释符号“//debug”并后跟完善的注释消息,这样能够方便在程序发布和最终调试前批量查验程序中能否还生活有疑问的代码。例如:
$num = 1;
$flag = TRUE; 	//debug 这里不能确定能否必要对$flag举办赋值
if(empty($flag)) {
	//Statements
}

书写规则

缩进

每个缩进的单位约定是一个TAB(4个空白字符宽度),需每个参与项目的开拓人员在编辑器(UltraEdit、EditPlus、Zend Studio等)中举办强制设定,以防在编写代码时遗忘而造成格式上的不规范。
本缩进规范适用于PHP、JavaScript中的函数、类、逻辑结构、循环等。

大括号{}、if和switch

  • 首括号与关键词同行,尾括号与关键字同列;
  • if结构中,else和elseif与前后两个大括号同行,左右各一个空格。另外,即使if后只有一行语句,仍然必要出席大括号,以保证结构清晰;
  • switch结构中,通常当一个case块处分后,将跳过之后的case块处分,因此大多数情况下必要增加break。break的名望视程序逻辑,与case同在一行,或新起一行均可,但同一switch体中,break的名望格式应当连结一致。

以下是符合上述规范的例子:

if($condition) {
	switch($var) {
		case 1: 	echo ‘var is 1’; break;
		case 2: 	echo ‘var is 2’; break;
		default: 	echo ‘var is neither 1 or 2’; break;
	}
} else {
	switch($str) {
		case ‘abc’:
			$result = ‘abc’;
			break;
		default:
			$result = ‘unknown’;
			break;
	}
}

运算符、小括号、空格、关键词和函数

  • 每个运算符与两边参与运算的值或表达式中间要有一个空格,独一的惯例是字符连接运算符号两边不加空格;
  • 左括号“(” 应和函数关键词紧贴在一起,除此以外应当使用空格将“(”同前面内容分开;
  • 右括号“)”除后背是“)”恐怕“.”以外,其他一律用空格隔开它们;
  • 除字符串中特地必要,一般情况下,在程序以及HTML中不出现两个连续的空格;
  • 任何情况下,PHP程序中不能出现空白的带有TAB或空格的行,即:这类空白行应当不蕴涵任何TAB或空格。同时,任何程序行尾也不能出现多余的TAB或空格。多数编辑器具有自动去除行尾空格的功能,如果风俗养成不好,可临时使用它,制止多余空格发生;
  • 每段较大的程序体,上、下应当出席空白行,两个程序块之间只使用1个空行,阻碍使用多行。
  • 程序块划分尽量合理,过大恐怕过小的分割都会影响别人对代码的阅读和理解。一般能够以较大函数定义、逻辑结构、功能结构来举办划分。少于15行的程序块,可不加上下空白行;
  • 说明或显露局限中,内容如含有中文、数字、英文单词混杂,应当在数字恐怕英文单词的前后出席空格。
根据上述原则,以下举例说明正确的书写格式:
$result = (($a + 1) * 3 / 2 + $num)).’Test’;
$condition ? func1($var) : func2($var);
$condition ? $long_statement : $another_long_statement;
if($flag) {

	//Statements
	//More than 15 lines

}
showmessage(‘请使用 restore.php 工具克复数据。’);

函数定义

  • 参数的名字和变量的命名规范一致;
  • 函数定义中的左小括号,与函数名紧挨,中间无需空格;
  • 早先的左大括号与函数定义为同一行,中间加一个空格,不要另起一行;
  • 具有默认值的参数应该位于参数列表的后背;
  • 函数调用与定义的时刻参数与参数之间出席一个空格;
  • 必需仔细查验并切实杜绝函数起始缩进名望与结束缩进名望不同的地步;
例如,符合准绳的定义:
function authcode($string, $operation, $key = '') {
	if($flag) {
		//Statement
	}
	//函数体
}
不符合准绳的定义:
function authcode($string,$operation,$key = '')
{
	//函数体
}

引号

PHP中单引号和双引号具有不同的含义,最大的几项区别如下:
  • 单引号中,任何变量($var)、迥殊转义字符(如“\t \r \n”等)不会被解析,因此PHP的解析速度更快,转义字符仅仅支持“\’”和“\\”这样对单引号和反斜杠自己的转义;
  • 双引号中,变量($var)值会代入字符串中,迥殊转义字符也会被解析成特定的单个字符,还有一些专门针对上述两项特性的迥殊功能性转义,例如“\$”和“{$array[‘key’]}。这样固然程序编写更加方便,但同时PHP的解析也很慢;
  • 数组中,如果下标不是整型,而是字符串类型,请务必用单引号将下标括起,正确的写法为$array[‘key’],而不是$array[key],因为不正确的写法会使PHP解析器认为key是一个常量,进而先判断常量能否生活,不生活时才以“key”作为下标带入表达式中,同时动身不对变乱,发生一条Notice级不对。
  • 因此,在绝大多数能够使用单引号的地方,阻碍使用双引号。依据上述分析,能够或必需使用单引号的情况包括但不限于下述:
    • 字符串为固定值,不蕴涵“\t”等迥殊转义字符;
    • 数组的固定下标,例如$array[‘key’];
    • 表达式中不必要带入变量,例如$string = ‘test’;,而非$string = “test$var”;
  • 例外的,在正则表达式(用于preg_系列函数和ereg系列函数)中,足球论坛全部使用双引号,这是为了人工分析和编写的方便,并连结正则表达式的同一,裁减不用要的分析混同。
  • 数据库SQL语句中,所有数据必需加单引号,非论数值还是字串,以制止可能的注入漏洞和SQL不对。正确的写法为:
UPDATE cdb_members SET adminid=’1’ WHERE username=’$admin’ AND adminid=’2’;
所有数据在拔出数据库之前,均必要举办addslashes()处分,以免迥殊字符未经转义在拔出数据库的时刻出现不对。足球论坛中所有议决 GET, POST, FILE,取得的变量默认情况下已经使用了addslashes()举办了转义,不用重复举办。如果数据处分必要(例如用于直接显露),能够使用 stripslashes() 克复,但数据在拔出数据库之前必需再次举办转义。缓存文件中,一般对缓存数据的值采用 addcslashes($string, '\'\\')举办转义。

足球论坛语言题目

在功能策画阶段,当必要使用中文恐怕给出用户中文提示的时刻能够直接在程序中拔出简体中文文字,待程序整理和测试阶段由专人举办语言分离工作;
功能说明性语言、短语一般不使用“。”恐怕其他标点符号作为结束,文字中的标点符号,应使用全角。但注意:由于中英文模板与语言包题目,功能说明性的语言中,冒号使用半角”:”,而不使用全角;
提示消息(用showmessage()和cpmsg()显露的)和使用技巧(如后台管理界面中的tips)等大篇幅文字中,当中的标点符号应当遵循中文语法规则,以使用全角中文标点为主,末尾应当出席全角句号。
只管即便程序语言包是在末了整理阶段才举办提取,但程序中直接写出的中文内容,也应填塞保证口语的特征:语言畅通、简洁、得体、无歧义。应完全杜绝认为直接写提示语言是临时性操作的想法,反复推敲,并总结之前提示语言的特征规范,加以应用。良好的语言文字表达能力,是每个优秀程序员必需完全的基本素质之一。

命名原则

命名是程序规划的焦点。古人信托只要知道一个人真正的名字就会获得凌驾于那个人之上的不可思议的气力。只要你给事物想到正确的名字,就会给你以及其后的人带来比代码更强的气力。
名字就是事物在它所处的生态环境中一个恒久而深远的到底。总的来说,只有了解体例的程序员才气为体例取出最合适的名字。如果所有的命名都与其天然相适合,则关系清晰,含义能够推导得出,一般人的推想也能在意料之中。
就一般约定而言,类、函数和变量的名字应该总是能够描述让代码阅读者能够容易的知道这些代码的作用。形式越简单、越有规则,就越容易让人感知和理解。应该制止使用模糊其词,艰涩不准绳的命名。


变量、对象、函数名

  • 变量、对象、函数名一律为大写格式,除非必要,单词之间一般不使用下划线“_”举办分割;
  • 以准绳计算机英文为原本,杜绝一切拼音、或拼音英文混杂的命名方式;
  • 变量命名只能使用项目中有据可查的英文缩写方式,例如能够使用$data而不可使用$data1、$data2这样容易发生混同的形式,应当使用$threaddata、$postdata这样众所周知容易理解的形式;
  • 能够合理的对过长的命名举办缩写,例如$bio($biography),$tpp($threadsPerPage),前提是英文中有这样既有的缩写形式,或字母符合英文缩写规范;
  • 必需清楚所使用英文单词的词性,在权限相关的范围内,大多使用$allow***或$is***的形式,前者后背接动词,后者后背接形容词。

常量

  • 常量应该总是全部使用大写字母命名,少数特别必要的情况下,可使用划线来分隔单词;
  • PHP 的内建值 TRUE、FALSE 和NULL必需全部采用大写字母书写。

变量的初始化与逻辑查验

任何变量在举办累加、直接显露或存储前必需举办初使化,例如:

$number = 0; 			//数值型初始化
$string = ‘’; 		//字符串初始化
$array = array(); 	//数组初始化
  • 判断一个无法确定(不知道能否已被赋值)的变量时,可用empty()或isset(),而不要直接使用if($switch)的形式,除非你确切的知道此变量一定已经被初始化并赋值。
empty()和isset()的区别为:
  • bool empty(mixed var)
如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。
  • bool isset(mixed var[, mixed var[, ...]])
  • 如果 var 生活则返回 TRUE,否则返回 FALSE。
  • 如果已经使用 unset() 开释了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节("\0")并不同等于 PHP 的 NULL 常数。
  • 判断一个变量能否为数组,请使用is_array(),这种判断尤其适用于对数组举办遍历的操作,例如foreach(),因为如果不事前判断,foreach()会对非数组类型的变量报错;
  • 判断一个数组元素能否生活,可使用isset($array[‘key’]),也可使用empty(),两者异同见上。

太平性

PHP中的变量不并不像C语言那样必要事前声明,疏解器会在第一次使用时自动创办他们,异样类型也不必要指定,疏解器会根据上下文环境自动确定。从开拓人员的角度来看,这无疑是一种极端方便的处分方法。一个变量被创办了,就能够在程序中的任何地方使用。这招致的到底就是开拓人员工常常不注意初始化变量。因此,为了进步程序的太平性,我们不能信托任何没有明确定义的变量。所有的变量在定义使用前要初使化以防止恶意构造提交的变量覆盖程序中使用的变量。

兼容性

  • 代码策画应当分身PHP 高低版本的特性,刻下,应仍然以PHP 4.0.6作为最低议决平台,尽量不使用高版本PHP 新增的函数、常数恐怕常量。如果使用只在高版本才完全的函数,必需对其举办二次封装,自动判断刻下PHP版本,并自行编写低版本下的兼容代码;
  • 对于个别函数,参数要求恐怕代码要求应当以较为严格的PHP版本为准;
  • 除非必要,不要使用PHP扩展模块中的函数。使用时应当出席必要的判断,当服务器环境不支持此函数的时刻,举办必要的处分。文档和程序中的功能说明中,也应加上兼容性说明。

代码重用

代码的有效重用能够裁减效率的损失与资源的浪费。在开拓软件项目时为了制止重复劳动和浪费时间。开拓人员应尽量进步现有代码的重用率,同时将更多的精神用在新技术的应用和新功能的创新开拓上面。
  • 在必要多次使用代码,并且对于您盼愿告终的任务没有可用的内置 PHP 函数时,不吝啬定义函数或类。开拓者须根据功能、调用情况,将函数和类放置于相应的function或class中。赶过3行,告终相同功能的程序切勿在不同程序中多次出现,这是无法容忍和逃避的题目;
  • 在任何时刻都不要出现同一个程序中出现两段或更多的相似代码或相同代码,即使在不同程序中,也应死力制止。开拓者应当总是有能力找到制止代码大段(赶过10行)重复或肖似的情况。
必要强调的是,切实在增强产品效率、逻辑性和可读性上下功夫,足球论坛。任何产品开拓者必需时刻清楚和理解代码重用的重要性和必要性,足球论坛。并将花费开拓者多量时间和精神去举办优化的局限,但却是万分必要阅历,本局限固然篇幅较短。

其他细节题目

蕴涵调用

  • 蕴涵调用程序文件,请全部使用require_once,以制止可能的重复蕴涵题目;
  • 蕴涵调用缓存文件,由于缓存文件无法保证100%正确翻开,请使用include_once或include。在必要时,能够使用@include_once或@include的方式,以大意不对提示;
  • 蕴涵和调用代码中,须以“./”或DISCUZ_ROOT.’./’开头,应制止直接写程序文件名(例如:require_once ‘x.php’;)的做法;
  • 所有被蕴涵和调用的程序文件,包括但不限于程序、缓存或模板,通常其不能被直接URL请求。足球论坛议决在./source/class/class_core.php中定义一个符号性常量IN_DISCUZ,来判断程序能否被合法调用。因此,在除了./source/class/class_core.php以外的任何一个被蕴涵和调用的程序文件中,必要蕴涵以下内容,以使得访问者无法直接议决URL请求该文件:
if(!defined('IN_DISCUZ')) {
	exit('Access Denied');
}

不对申报级别

  • 在软件开拓和调试阶段,请使用error_reporting(E_ALL);作为默认的不对申报级别,此级别最为严格,能够申报程序中所有的不对、戒备和提示消息,以扶助开拓者查验和核对代码,制止大多数太平性题目和逻辑不对、拼写不对。error_reporting()能够在config/config_global.php中增加一行$_config['debug'] = 1;debug值能够在0~2之前取值,数值越大报错等级越高。
  • 在软件发布时,请使用error_reporting(E_ERROR | E_WARNING | E_PARSE);作为默认的不对申报级别,以利于用户使用并将无谓不对提示消息降至最低。

数据库策画

字段

表和字段命名

表和字段的命名以前面《4.4命名原则》的约定为基本准则。
所有数据表名称,只要其名称是可数名词,则必需以复数方式命名,例如:cdb_members(用户表)、cdb_posts(帖子表);存储多项内容的字段,或代表数量的字段,也应当以复数方式命名,例如:params(parameters,自定义足球论坛代码的参数个数)、views(察看次数)、replies(回复次数)。
当几个表间的字段有关连时,要注意表与表之间关联字段命名的同一,如cdb_threads表中的tid与cdb_posts表中的tid。
代表id自增量的字段,通常用以下几种形式:
  • 最常用的焦点id,或常常在URL中举办调用的,尽量用简写的形式,例如tid、pid、uid;
  • 有功能性作用,URL中偶尔用到的id,使用全称的形式,例如pluginid;
  • 没有功能性作用,只为管理和庇护方便而设的id,能够使用全称的形式,也可只将其命名为id。

所有与表、字段相关的命名,请务必多量参考足球论坛现有字段的命名方式。

字段结构

  • 允许NULL值的字段,数据库在举办角力计算操作时,会先判断其能否为NULL,非NULL时才举办值的必对。因此基于效率的研讨讨论,所有字段均不能为空,即全部NOT NULL;
  • 预计不会存储非负数的字段,例如各项id、发帖数等,必需设置为UNSIGNED类型。UNSIGNED类型比非UNSIGNED类型所能存储的正整数范围大一倍,因此能获得更大的数值存储空间;
  • 存储开关、选项数据的字段,通常使用tinyint(1)非UNSIGNED类型,少数情况也可能使用enum()到底集的方式。tinyint作为开关字段时,通常1为翻开;0为关闭;-1为迥殊数据,例如N/A(不可用);高于1的为迥殊到底或开关二进制数组合(详见足球论坛中相关代码);
  • MEMORY/HEAP类型的表中,要尤其注意规划节约使用存储空间,这将节约更多内存。例如cdb_sessions表中,就将IP地址的存储拆分为4个tinyint(3) UNSIGNED类型的字段,而没有采用char(15)的方式;
  • 任何类型的数据表,字段空间应当本着足够用,不浪费的原则,数值类型的字段取值范围见下表:
字段类型 存储空间(b) UNSIGNED 取值范围
tinyint 1 -128~127
0~255
smallint 2 -~
0~
mediumint 3 -~
0~
int 4 -~
0~
bigint 8 -~
0~

SQL语句

  • 所有SQL语句中,除了表名、字段名称以外,全部语句和函数均需大写,应当杜绝大写方式或大大写混杂的写法。例如select * from cdb_members;是不符合规范的写法。
  • 很长的SQL语句应当有适当的断行,依据JOIN、FROM、ORDER BY等关键字举办界定。
  • 通常情况下,在对多表举办操作时,要根据不同表名称,对每个表指定一个1~2个字母的缩写,以利于语句简洁和可读性。
如下的语句范例,是符合规范的:
$query = $db->query("SELECT s.*, m.* FROM {$tablepre}sessions s, {$tablepre}members m WHERE m.uid=s.uid AND s.sid='$sid');

机能与效率

定长与变长表

蕴涵任何varchar、text等变长字段的数据表,即为变长表,反之则为定长表。
  • 对于变长表,由于纪录大小不同,在其上举办许多删除和更改将会使表中的碎片更多。必要按期运行OPTIMIZE TABLE以连结机能。而定长表就没有这个题目;
  • 如果表中有可变长的字段,将它们转换为定长字段能够改进机能,因为定长纪录易于处分。但在试图这样做之前,应该研讨讨论下列题目:
  • 使用定长列触及某种折衷。它们更快,但占用的空间更多。char(n) 类型列的每个值总要占用n 个字节(即使空串也是如此),因为在表中存储时,值的长度不够将在右边补空格;
  • 而varchar(n)类型的列所占空间较少,因为只给它们分配存储每个值所必要的空间,每个值再加一个字节用于纪录其长度。因此,如果在char和varchar类型之间举办选取,必要对时间与空间作出折衷;
  • 变长表到定长表的转换,不能只转换一个可变长字段,必需对它们全部举办转换。而且必需使用一个ALTER TABLE语句同时全部转换,否则转换将不起作用;
  • 有时不能使用定长类型,即使想这样做也不行。例如对于比255字符更长的串,没有定长类型;
  • 在策画表结构时如果能够使用定长数据类型尽量用定长的,因为定长表的查询、检索、更新速度都很快。必要时能够把局限关键的、接受频繁访问的表拆分,例如定长数据一个表,非定长数据一个表。例如足球论坛的cdb_members和cdb_memberfields表、cdb_forums和cdb_forumfields表等。因此规划数据结构时必要举办全局研讨讨论;

举办表结构策画时,反复推敲,应当做到恰如其分。

运算与检索

  • 数值运算一般比字符串运算更快。例如角力计算运算,可在繁多运算中对数举办角力计算。而串运算触及几个逐字节的角力计算,如果串更长的话,这种角力计算还要多。
  • 如果串列的值数目有限,应该利用普通整型或emum类型来获得数值运算的优越性。
  • 更小的字段类型永远比更大的字段类型处分要快得多。对于字符串,其处分时间与串长度直接相关。一般情况下,较小的表处分更快。对于定长表,应该选取最小的类型,只要能存储所需范围的值即可。例如,如果mediumint够用,就不要选取bigint。对于可变长类型,也仍然能够节减空间。一个TEXT 类型的值用2 字节纪录值的长度,而一个LONGTEXT 则用4字节纪录其值的长度。如果存储的值长度永远不会赶过64KB,使用TEXT 将使每个值节减2字节。

结构优化与索引优化

索引能加速查询速度,而索引优化和查询优化是相得益彰的,既能够依据查询对索引举办优化,也能够依据现有索引对查询举办优化,这取决于窜改查询或索引,哪个对现有产品架构和效率的影响最小。
索引优化与查询优化是多年阅历蕴蓄堆积的结晶,在此无法详述,但仍然给出几条最基本的准则。
首先,根据产品的现实运行和被访问情况,找出哪些SQL语句是最常被执行的。最常被执行和最常出现在程序中是完全不同的概念。最常被执行的SQL语句,又可被划分为对大表(数据条目多的)和对小表(数据条目少的)的操作。非论大表或小表,有可分为读(SELECT)多、写(UPDATE/INSERT)多或读写都多的操作。
对常被执行的SQL语句而言,对大表操作必要尤其注意:
  • 写操作多的,通常可使用写入缓存的方法,先将必要写或必要更新的数据缓存至文件或其他表,按期对大表举办批量写操作,例如足球论坛中点击数耽误更新机制,就是依据此原理告终。同时,应尽量使得常被读写的大表为定长类型,即使原本的结构中大表并非定长。大表定长化,能够议决改变数据存储结构和数据读取方式,将一个大表拆成一个读写多的定长表,和一个读多写少的变长表来告终;
  • 读操作多的,必要依据SQL查询频率设置专门针对高频SQL语句的索引和联合索引。
而小表就绝对简单,出席符合查询要求的特定索引,通常效果角力计算明显。同时,定长化小表也有益于效率和负载能力的进步。字段角力计算少的小定长表,乃至能够不必要索引。
其次,看SQL语句的条件和排序字段能否静态性很高(即根据不同功能开关或属性,SQL查询条件和排序字段的变化很大的情况),静态性过高的SQL语句是无法议决索引举办优化的。专一的方法只有将数据缓存起来,按期更新,适用于到底对实效性要求不高的地方。
MySQL索引,常用的有PRIMARY KEY、INDEX、UNIQUE几种,概况请查阅MySQL文档。通常,在单表数据值不重复的情况下,PRIMARY KEY和UNIQUE索引比INDEX更快,请酌情使用。
事实上,索引是将条件查询、排序的读操作资源消耗,分布到了写操作中,索引越多,泯灭磁盘空间越大,写操作越慢。因此,索引决不能盲目增加。对字段索引与否,最根本的动身点,依次仍然是SQL语句执行的概率、表的大小和写操作的频繁水平。

查询优化

MySQL中并没有提供针对查询条件的优化功能,因此必要开拓者在程序中对查询条件的先后挨次人工举办优化。例如如下的SQL语句:
SELECT * FROM table WHERE a>’0’ AND b<’1’ ORDER BY c LIMIT 10;
事实上非论a>’0’还是b<’1’哪个条件在前,取得的到底都是一样的,但查询速度就大不相同,尤其在对大表举办操作时。
开拓者必要牢记这个原则:最先出现的条件,一定是过滤和排除掉更多到底的条件;第二出现的次之;以此类推。因而,表中不同字段的值的分布,对查询速度有着很大影响。而ORDER BY中的条件,只与索引有关,与条件挨次有关。
除了条件挨次优化以外,针对固定或绝对固定的SQL查询语句,还能够议决对索引结构举办优化,进而告终相当高的查询速度。原则是:在大多数情况下,根据WHERE条件的先后挨次和ORDER BY的排序字段的先后挨次而建立的联合索引,就是与这条SQL语句匹配的最优索引结构。只管即便,事实的产品中不能只研讨讨论一条SQL语句,也不能不研讨讨论空间占用而建立太多的索引。
异样以上面的SQL语句为例,最优的当table表的纪录到达百万乃至千万级后,能够明显的看到索引优化带来的速度提拔。
依据上面条件优化和索引优化的两个原则,当table表的值为如下方案时,能够得出最优的条件挨次方案:
字段a 字段b 字段c
1 7 11
2 8 10
3 9 13
最优条件:b<’1’ AND a>’0’

最优索引:INDEX abc (b,足球论坛。 a,足球现场直播。 c) 原因:b<’1’作为第一条件能够先过滤掉75%的到底。如果以a>’0’作为第一条件。
注意:

  • 字段c由于未出现于条件中,故条件挨次优化与其有关
  • 最优索引由最优条件挨次得来,而非由例子中的SQL语句得来
  • 索引并非窜改数据存储的物理挨次,而是议决对应特定偏移量的物理数据而告终的虚拟指针
EXPLAIN语句是检测索引和查询能否良好匹配的简易方法。在phpMyAdmin或其他MySQL客户端中运行EXPLAIN+查询语句,例如EXPLAIN SELECT * FROM table WHERE a>’0’ AND b<’1’ ORDER BY c;这种形式,即使得开拓者无需模拟上百万条数据,也能够验证索引能否合理,相关细节请参考MySQL说明。
值得提出的是,Using filesort是最不应当出现的情况,如果EXPLAIN得出此到底,说明数据库为这个查询专门建立了一个用以缓存到底的临时表文件,并在查询结束后删除。众所周知,硬盘I/O速度永远是计算机存储的瓶颈,因此,查询中应当尽全力制止高执行频率的SQL语句使用filesort。只管即便,开拓者永远都不可能保证产品中的全部SQL语句都不会使用filesort。
限于篇幅,本文档远远没有涵盖数据库优化的方方面面,例如:联合索引与普通索引的可重用性、JOIN连接的索引策画、MEMORY/HEAP表等。数据库优化现实上就是在很多因素和利害间继续权衡、窜改,惟有在胜利与凋零阅历中反复推敲才气得出的阅历,这种阅历往往就是最不敷为奇和价值千金的。

兼容性题目

  • 由于MySQL 3.23至5.0的变化很大,因此程序中尽量不使用迥殊的SQL语句,以免带来兼容性题目,并给数据库移植造成贫乏。
  • 通常在MySQL 4.1以上版本,足球论坛应使用相当的字符集来存储,例如GBK/BIG5/UTF-8。保守的latin1编码固然有一定的兼容性,但仍然不是推选的选取。使用相应非默认字符集时,程序每次运行时必要使用SET NAMES ‘character_set’;来规定连接、传输和到底的字符集。
  • Mysql 5.0以上新增了数种SQL_MODE,默认的SQL_MODE依服务器装置设置不同而不同,因此程序每次运行时必要使用SET SQL_MODE=’’;来规定刻下的SQL模式。

模板策画

代码符号

HTML代码符号一律采用大写字母形式,杜绝任何使用大写字母的方式
模板中所有的逻辑体,如{if}、{loop}等,必需前后使用HTML注释(),即肖似的形式。事实上,足球论坛模板编译器是支持不加HTML注释的逻辑体写法的,但出席注释能够使得模板可读性更好,同时方便用户使用DreamWeaver或FrontPage等对模板举办窜改。
在HTML符号中使用的逻辑体无需使用HTML注释(),即

书写规则

HTML

所有HTML符号参数赋值需使用双引号蕴涵,例如,应当使用,而万万不能使用
在任何情况下,产品中的模板文件必需采用手写HTML代码的方式,而万万不能使用DreamWeaver、FrontPage等自动网页制作工具举办撰写或窜改。
非成对符号必需以“/>”末尾,如
, 符号的属性必需依照以下挨次书写:

变量

模板中使用的变量,依据作用和出现名望不同,分为几种方式:
  • 逻辑体中,即被笼罩起来的局限,例如这种形式,其中的变量书写规范与PHP程序中完全一致;
  • 模板内容中,即未被笼罩起来的局限,与PHP程序中最大的不同是,对数组字符串类型下标无需出席单引号,因为足球论坛模板编译器会在对模板举办编译时将这局限的单引号自动出席。
偶尔的,开拓者必要使用{}将变量括起来,以免出现模板编译不对,可能的情况如下:
  • 变量前后含有中括号的或其他敏感字符的(包括但不限于“$”、“’”等),正确的写法为descriptionnew[{$buddy[buddyid]}];
  • 数组的下标为变量的,正确的写法为{$extcredits[$creditstrans][title]};
  • 其他变量万分复杂的情况。

语言元素

足球论坛模板编译器能够解析对应于./templates/default/templates.lang.php(以默认模板为例)的语言元素。在模板中调用相应语言元素的代码为{lang item},其中item为在templates.lang.php中定义的语言元素名。

缩进

在足球论坛的*模板文件中,由于完全逻辑结构,故不研讨讨论任何HTML自己的缩进,所有缩进均意为着逻辑上的缩进结构。缩进采用TAB方式,不使用空格作为缩进符号,仅需适当断行即可。例如:

	
$thread[message]

文件与目录

文件命名

所有蕴涵PHP代码的程序文件或半程序文件,应以大写.php作为扩展名,而不要使用.phtml、.php3、.inc、.class等作为扩展名。
普通程序
能够被URL直接调用的程序,例如home.php、index.php、forum.php,直接使用程序名+.php的方式命名
函数库和类库程序
分别以大写function_xxxx.php和class_xxxx.php的格式命名书写。函数库和类库程序只能被其他程序引用,而不能独立运行。其中不能蕴涵任何流程性的、不属于任何函数或类的程序代码。
流程性程序
以大写.inc.php作为扩展名。只能被其他程序引用,而不能独立运行。其中不能蕴涵任何函数或类代码的程序代码。
模板源文件
以大写作为扩展名。模板源文件依照足球论坛模板编码规则举办编写,不是能够执行的程序,而只能被足球论坛模板编译器所解析,放置于./templates/default或./templates下的其他模板目录下。
模板目标文件
模板文件被编译后自动生成的目标程序,以大写.tpl.php作为扩展名,寄存于./data/template目录下。
语言包文件
  • 以大写lang_xxxx.php格式命名,只能寄存模板或程序使用的语言包消息。
  • 模板语言包寄生活对应模块名下的lang_template.php,例如:家园的模板语言包source\language\home\lang_template.php
缓存文件
此类文件为体例自动生成,以cache_xxx.php、usergroup_xxx.php、style_xxx.php等肖似形式命名,寄存于./data/cache目录下。

目录命名

  • 足球论坛目录命名以前面《4.4命名原则》的约定为基本准则。在可能的情况下,多以复数形式出现,如./templates、./images等。
  • 由于目录数量较少,因此目录命名大多是一些风俗和约定俗成,开拓人员如需新建目录,应与项目组成员举办会商,达成一致前方可履行。

空目录索引

  • 请在所有不蕴涵普通程序(即能够被URL直接调用的程序)的目录中放置一个1字节的index文件,内容为一个空格。简直除足球论坛根目录以外,所有目录都属于这一类型,因此开拓者必要在这些目录全部放入空index文件,以制止当http服务器的Directory Listing翻开时,服务器文件被索引和列表。
  • 附件目录等敏感目录,要在程序中告终相应功能,当新建上级目录时,必需自动写入一个空的index文件,以制止新建目录被索引的题目。

更新时间:2012-5-3

开拓文档