php代码优化以及开发中的小技巧(持续补充)

一、前言

      这篇文章是博主平时记的小笔记,记录的是平时开发没有注意到的细节,或者在写代码的时候可以优化的部分。有相当一部分bug都是开发中不够严谨造成的,所以大家共勉。提升代码质量,快乐撸码!

二、正文

1、 代码的公用部分尽量不要改动,除非是所有的项目都需要添加某些新功能

2、 对于自定义的数组,对象等不同文件,要按照已有的文件分开。不要把对象定义到数组文件,数组定义到对象文件,方便调试和代码优化

3、 对于一些不必要的操作,无需发请求。比如我们的拖动排序事件。应该确保当顺序改变的时候再发送http请求。仅仅是拖动但没有改变位置的,不需要发送请求。这样在用户访问量比较多的情况下,不会有太大的访问压力

4、 构造函数要用起来。通用的变量,或者需要实例化的数据库部分都可以放里面。这样在脚本的其他地方使用很方便

5、 控制器中的方法名命名要更贴近实际功能,方便查看维护。

6、 不要为了方便,有些表单只在前端验证,而不去后端验证。因为用户可以通过禁用JS等方法,跳过你的前端验证,那么这个时候我们就无法保证系统的安全性,所以后端验证必不能少。在用户体验不是很重要的项目,系统的安全性更加重要。
       举例: 用户修改密码,验证旧密码部分,如果只是前端通过JS验证,提交后的代码不加验证的话,用户可能会避过JS,从而直接修改密码,保证不了安全性

7、 比如我们在开发的时候,需要用到变量a。

if(xx){ $a=1; }else{$a=2}; 
			$b = $a + 1;

      类似于这种的,变量a没有预先定义,所以会成为notice错误。如果此时我们的服务器的错误级别是notice都会报错的话,那么这部分就会成为bug。此时此刻再说“在我本地没问题啊”这种话将毫无意义,所以最好是在写程序的时候,就对自己严谨一些。

8、 关于代码兼容性。
      在php 5.4下,可以正常使用可变变量,类似于:

$a = 'php';
			$$a = '我是PHP';
			echo $php;// 输出:我是PHP

      这段代码在php5.4下是可以的,但是在php 7.0下会报错:Array to string conversion

这是因为php 5.4把($$a)中的$a当做一个整体,先解析$a = php ,然后通过第一个`$`符号,转化为( $$a == $php = 我是PHP )。但是在 php7.0,代码的严格性得到提升,此处必须使用  ${$a}  来区分解析的优先级,加个花括号标出来后面的变量,类似于咱们小学时候的加减乘除的优先级问题。

php文档地址: http://www.php.net/manual/zh/language.variables.variable.php

9、关于SVN或者git提交

      代码在提交的时候,如果涉及到代码的重构,修复bug,优化等功能,那么最好是分多次提交。比如代码重构单独提交一次,修复Bug或者优化都单独提交一次。不要害怕提交的次数太多之类的,我们分的越细,等到出问题的时候,不管是直接定位问题所在还是回滚版本都会好操作很多。这也算是开发技巧之一吧。

======================= 2019年5月10日13时更新 ==============================

10、 在开发的时候,每用到一个变量,就要考虑到万一不存在这个变量,或者变量为空的时候,会不会影响到程序的正常运行?要在开发的时候就做好严谨的逻辑思考,加个条件判断并不会对程序的运行速度造成太大影响,但是不加这个条件判断,可能会造成程序崩溃。

11、 根据传过来的时间条件查询数据比实际数据少一天的情况?

      首先,我本地的时间字段是datetime,那么2019/03/25会自动转化为2019/03/25 00:00:00,所以才出现查询数据少一天的情况。如果本地的时间字段类型是date,那么查询的时候,可以不用再拼接23:59:59也能正确得出结束时间当天的数据。
      拼接的方案:
      当本地日期字段类型是datetime,使用between and查询时间区间的时候,需要记得,如果传过来的日期是:2019/03/25 -- 2019/03/27这种的,那么直接转化为时间戳的话,结束时间是2019/03/26 23:59:59 ,相当于27号那天的数据我们是查不到的。所以需要在接收的时候,
做一下转换:

	 $time_start = isset($this->db_g_data['time_start']) ? date("Y-m-d 00:00:00", strtotime($this->db_g_data['time_start'])) : "";
		 $time_end = isset($this->db_g_data['time_end']) ? date("Y-m-d 23:59:59", strtotime($this->db_g_data['time_end'])) : "";

这样相当于重新把日期转化为格式化的时间,同时给起始时间一个00:00:00 ,给结束时间一个:23:59:59

12、 使用传引用后,记得unset掉引用的部分 :https://segmentfault.com/a/1190000014126990

13、 关于php内存方面的优化也值得注意,循环能少则少,判断条件要在循环体之外:
参考:https://blog.csdn.net/LJFPHP/article/details/90053455

======================= 2019年6月2日20时更新 ==============================
1、 对于php程序,有些if{}else{}是可以缩减的,if{}else{}多了也代表着代码的冗余,要谨记

2、 比如要查询当前时间往后,1天,5天,10天的数据。如果你每次都循环查询,0-1,0-5,0-10,那么查询是有冗余的,而且查询速度会越来越慢。这个时候应该选用:0-1,2-5,6-10这个时间区间来查询,这样会节省不少时间。

3、 intval还是少用,如果在单纯的计算中,比如:12.22 / 1.1 这种,用intval就会计算不准确,特别是在循环中,数据会越来越不准确。在计算的时候,要么采用精度计算,要么采用sprintf来格式化

4、 在写代码的时候,要考虑一个问题,假如有100W的数据,你的代码能跑的动吗?优化在于开始写之前,而不是开始写之后。

5、 对文件命名的时候,不要带上项目的名字,因为多个项目的话,可能会共用同一个文件。

6、 代码精简,一些判断条件,要注意是否重复。比如你在sql里面限制 x字段为1,那么下面的逻辑中就没必要判断 if(x ==1)这种情况,因为我们用的结果集是从数据库中拿的,已经筛选过了。

=============== 2019/6/18===========================

1、 删除文件部分的代码,如果没有删除目录的需求,那最好是去掉删除目录的方法,防止传入目录是‘/’,直接把服务器上的目录都给删掉。
如果有需求的话,就在方法里面增加固定的路径前缀:比如:'/var/www/a/b'等,限定只能删除b目录下的目录文件。

2、 如果是用到网络上的代码,那么最好是先检查下,像curl,file_get_contens等代码尽量不要有,防止网上的文件带有漏洞后门之类的东西。

3、 尽量不要把数据都在首页全部查出来,这样的话,可能后续打开页面什么的会少一些网络请求,但首页加载速度慢有可能会在一开始就把用户拒之门外,所以哪里用哪里请求就行,特别是对于一些不用频繁打开的页面数据,更应该用的时候才查

4、 注意使用的函数是否必要,比如我们上传图片经常会使用iconv函数来进行字符编码转换,把utf-8转化为gbk的格式,防止保存的图片名称是乱码。但如果我们规定图片名称是英文或者字符串,那就没必要使用这个函数了,使用该函数只会让代码变得冗余难读。因此要根据业务进行选择。

5、 测试一定要细心,想到哪点可能会有问题,那就果断去测试。因为如果每次都是你出bug那么你在其他人心中的权威性会越来越低,最后导致只要出问题就找你,但其实未必是你的问题。

6、 当引用样式或者引用接口链接的时候,本地写的是http开头的。但是服务器上是https环境的,所以放上去自然找不到我们想要的内容。为了能让本地正常测试,并且上传服务器上也能正常使用,所以选用://xxxx.com/css 的方式,
即使用//代替。
参考: https://www.jianshu.com/p/b85b048dc2fb
好处是可以自己根据页面协议自己选用协议,在以后升级程序的时候也方便

7、 对于大型项目来说,有时候更新一次版本可能需要几分钟或者几十分钟,如果是不停机发版,那么用户在发版期间访问项目可能会出现一些问题。所以可以采用ab发版分方法,比如根目录是htdocs,可以在根目录同级新建a目录和b目录,这三个目录的内容是相同的。然后用软连接自动连接htdocs-->a,
当我们发版的时候,会根据软链接的位置,自动发布到b版本,此时不会影响用户的正常访问。当发版结束后,切换htdocs-->b,让根目录软连接到b,此时用户即可正常使用使用新功能。然后再同步a目录和b目录保持一致即可,如此便解决了发版过程中可能遇到的问题。

8、 写代码的时候,要考虑内存峰值,遇到大数组相关的,处理完要及时unset掉,尽量不要两个大数组进行循环或者传值,这样如果数组很大,接近于内存峰值,那么循环的时候则会造成内存溢出问题。最好是优化业务,使用一个大数组之后,要及时unset()掉。

9、 编码的时候要注意代码格式

	ctrl + alt + L 	可以自动排版
	ctrl + alt + O 自动删除无用的类引用

2个写代码的时候, 随时摁一下,文件编码: utf8, 每行缩进4个空格, 不要用tab

10、 mysqlupdate更新,如何判断是数据重复还是修改错误

对于php来说,执行mysql的update操作的时候,经常需要根据返回值来进行操作。但是当我们使用如下:

r e s = " u p d a t e x x x x x " ; i f ( res = "update xxxxx"; if( res="updatexxxxx";if(res){
}else{
}
使用这种方式进行判断,那么会不能区分sql执行错误和数据重复问题,因为当数据完全重复的时候,update操作返回的是0,代表受影响的行数。

此时可以采用 ===的方式来判断返回的是0还是false,返回false代表update语句操作错误:

if($result > 0 || $result === 0){  
//如果修改的数据和原数据一样的话,返回的是false
   
}else{
  } 

写一次博客也是重新看一遍记录的这些问题。愿以后的代码可以少出bug,哈哈。共勉!

end

你可能感兴趣的:(php日常bug)