一:编码命名规范
-
PHP 编码命名规范
PSR(PHP标准规范) 是PHP开发的实践标准,主要包含基础编码规范、编码风格规范、日志接口规范、缓存接口规范、Http消息接口规范等。参见 https://learnku.com/docs/psr
1.基础编码规范
1)PHP代码文件必须以不带 BOM 的UTF-8编码
2)类的命名必须遵守 StudlyCaps 式的首字母大写的帕斯卡命名法。
3)类中常量所有字母必须大写,单词间用下划线分割
4)方法名称必须符合 camelCase 式的首字母小写的 驼峰命名法。
2.编码风格
1)代码必须用4个空格而不是【TAB】进行缩进。好处是方便查看、比较、重新阅读整体的代码,因为不同的编辑器 【TAB】键占用的空格数不一致,使用不同编辑器打开代码时容易造成格式混乱。
2)类的属性、方法必须添加访问修饰符 (private、protected、public、abstract 以及 final 必须声明在访问修饰符之前,而 static 必须声明在访问修饰符后面)
3)PHP 的关键字必须小写 (true 、false、null)
-
数据库设计约定
1. 数据表与字段
1)库名尽量与应用名一致,使用小写英文和下划线。
2)数据表与字段用字母、数字加下划线。
3)数据表名称不使用复数名词,命名最好是“业务名称_表的作用”,如 tiger_task
4)唯一索引名为uk_字段名;普通索引名则 idx_字段名
5)小数类型使用 decimal ,禁止使用 float和double(因为在存储的时候存在精度损失的问题,很可能在比较值的时候得不到正确的结果)。若存储的数据范围超过了decimal的存储范围建议将数据拆分为整数、小数分开存储。
6)若存储的字符串的长度几乎相等,使用char定长字符串类型
7)varchar 可变长字符串,不预先分配存储空间。长度超过 5000 后定义字段类型为text,独立一张表用主键来对应,避免影响其他字段索引效率
8)表必备三个字段,id、created_at、updated_at
9)字段允许冗余,但必须考虑数据同步问题。冗余的字段不应是频繁更改的字段,不是 varchar 超长字段,更不能是 text 字段。如商户类目名称使用频率高,字段长度短,名称基本不变,可在相关联的表中冗余存储类目名称,避免关联查询。
10)单表行数超过 500万行或者单表容量超过2G,才推荐进行分库分表。若预计三年后数据量根本达不到这个级别,不建议建表时分库分表
11)合适的字符存储长度。如人的年龄采用 unsigned tinyint(0-255);海龟就必须使用 smallint 了
12)尽量使用数字型字段。因为引擎处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型只需要比较一次就好了。(IP-inet_ aton:ip转数字,inet_ntoa:数字转ip、时间可以转换为数值型存储)
13)最好不要给数据库留 NULL (备注、描述、评论等可以设置为NULL)。原因是在 Mysql 中含有NULL值的列很难进行查询优化,而且对表索引时不会存储NULL值,这样就会大大降低索引的效率。
14)拆分大的 DELETE 和 INSERT 语句。因为这两个操作会锁表,表锁住后其他任何操作都会进不来。使用LIMIT是一个好办法,如 :DELETE FROM logs WHERE loge_date <= '2019-10-14' LIMIT 1000。
2. 索引规范
1)业务上具有唯一特性的字段,即使是组合字段也应该建成唯一索引。建组合索引时,区分度最高的放左边。
2)超过三个表禁止 join 。需要 join 的 字段数据类型保持一致
3)页面搜索严禁使用左模糊或者全模糊,如果需要,需要走搜索引擎来解决该类问题。
4)若有全球化需要,所有字符集存储与表示均采用UTF-8编码。使用表情是采用utf8mb4 。Mysql支持的utf8最大能编码3个字节长度的字符。MySql5.5.3后增加的utf8mb4保存4个字节字符。不扩充utf-8字符集应该是出于节省存储空间以及向下兼容考虑,毕竟utf-8能支持大部分字符
5)使用索引是有代价的,索引需要存储空间,也需要定期维护。每当有INSERT、UPDATE(索引列被更新)、DELETE语句执行时,索引本身也会修改。因此不必要的索引反而会让查询时间变慢,需要定期维护。
6)对于唯一值得列,索引效果最好,对于具有多个重复值的列,如年龄和性别,建立索引不是好办法
3. SQL 命令优化规范
1)使用参数化查询:防止SQL注入,预编译SQL命令提高效率
2)去掉不必要的查询字段。
3)选择最有效的表名顺序:数据库解析器是按照从右到左的顺序处理FROM字句中的表名。因此FROM字句包含的表中,记录条数最少的表放在最后。
4)不要使用 SELECT * :以提高查询效率,减少数据数据量,提高传输速度。
5)统计相关的查询应避免在业务高峰期进行,或者从库中统计数据,同时建议把数据先保存到内存中再写入数据库
6)where 子句中对字段值进行null 判断、包含not null,!=等操作,或like '%asa'都无法使用索引,从而引发全表扫描。
7)如果使用到了临时表,在存储过程的最后需要将所有临时表显式删除。先truncate table再drop 从而避免表较长时间锁定。
二:网站安全的应用
1、系统级别的错误不应直接暴露给用户,用户提示信息需要有好一些,系统错误信息记录日志
2、无论客户端是否做过数据校验,服务端必须要有数据校验
1)输入字符长度
2)数据类型校验
3)字符串重复性校验
4)输入值进行 html 编码 (htmlentities 字符串转为html实体),防止 xss 攻击
5)输入字符串的单引号、双引号加反斜杠进行转义(addslashes),防止 SQL 注入 ,如下所示
select * FROM users where user_name='user_name' AND pwd=md5(pwd); --- 假设 user_name 输入为 ' OR 1=1 #
select * FROM users where user_name='' OR 1=1 #'AND pwd=md5(pwd)
6)对于接收的参数,过滤掉任何远程内容的引用(正则匹配替换)(尤其是式样、js)
3、页面输出前做 html 转码(html_entity_decode html实体转码为字符串),不能原内容输出,防止 xss 跨站攻击
4、机密信息不能明文存储,需要进行加密
5、尽量使用 cookie 的 httponly 属性 (setcookie 第7个参数),使得客户端js无法读取cookie。对 cookie 内容进行加密,防止xss攻击、cookie欺骗
6、使用参数化SQL命令而非动态拼接的SQL命令,防止SQL注入
7、实现 session token 表单令牌,拒绝不明来源的非法提交
8、对用户上传的文件进行严格限制。(文件类型、文件大小等,同时对上传文件后存储的文件目录进行权限限制,去掉脚本执行权限和文件解压权限等,防止上传入侵)
9、不要直接暴露文件下载地址,而要将下。并对每个ip做刷新次数限制,防止CC攻击从而耗尽流量。
三:前端优化约定
1、减少http请求,多个css合并
2、压缩css、js代码
3、css尽量放在html头部,js尽量放在尾部
4、如果是移动端,单个数据对象最好小于25k
5、压缩图片并尽量使用png图片,因为它的功能更多体积更小