一、PHP代码存在延时输出
问题出现:在phpstudy集成环境搭建thinkphp6项目时,调试时候发现控制器输出存在延时情况,无法及时获取数据。
解决方案:在项目搭建过程中使用php版本为7.4.3,phpstudy的php7.4.3版本默认开启了Zend Opcache扩展,开发阶段关闭此扩展即可。
php.ini配置文件中opcache.enable配置的值将1改为0
opcache.enable=0
二、Thinkphp6开发阶段的页面存在缓存
问题出现:测试html页面时,发现很多时候数据和相关资源加载存在延时,无法进行有效的测试和调试。
解决方案:thinkphp6开启了模板缓存,提高访问效率。开发过程中可先关闭模板缓存。
框架中的config文件夹中的view.php配置中加上如下配置
// 关闭模板编译缓存,设为false则每次都会重新编译
\'tpl_cache\'=>false,
三、PHP中运算存在的偏差
问题:PHP数学运算 加乘除 运算出现数偏差,问题如下:
$num = 0.7+0.1; print_r($num); die;
上面代码输出肯定是没问题得0.8,但这数据被json_encode()之后就出了偏差
$num = 0.7+0.1; print_r(json_encode($num)); die;
上面的代码则会输出0.7999999999999999 经测试 加乘除 都会出现此情况 减法运算不会出现
解决方案:PHP中进行数学运算时,可以使用PHP的bc数学函数进行计算,即可得到正确的值。
$num = bcadd(0.7,0.1,2); print_r(json_encode($num)); die;
四、phpstudy集成环境(版本8.1.0.7)下,闲来无事通过PHP代码模拟百万级数据入库问题(以前都是自建的开发环境 未出现此问题)。
问题:PHP程序写完后进行入库操作时候,更改了PHP运行时间以及运行内存(php、mysql未出现错误日志)之后,程序走到40秒左右就崩掉报错。
描述:最开始一直以为PHP和MYSQL的配置文件出现问题了,在上面耽搁了大量时间。apache的错误日志也没有明确的实际错误,至少不是程序崩掉就出现。解决方案也是找了蛮久看到相似问题有位大佬提出的https://www.xp.cn/wenda/884.html
解决方案:apache的配置文件httpd.cof中加入如下代码,即可解决。
<IfModule mod_fcgid.c> FcgidProcessLifeTime 8200 FcgidIOTimeout 8200 FcgidConnectTimeout 4000 </IfModule>
五、html页面处理PHP返回的有序json数据和无序json数据的问题
问题:今天同事遇到的一个问题,数据经过PHP排序之后的数组(变成无序)json_encode()返回数据后循环出现异常,以前数据为有序,代码正常。排之后变成无序数组,以前的循环代码出现问题。
数组示例:
$data = array( \'2\'=>array( \'jl\' => \'小寒1\', \'xf\' => 81557, \'hbxf\' => 62732, \'hbcz\' => 18825, \'hbbfb\' => 30.01, \'tbxf\' => 72713, \'tbcz\' => 8844, \'tbbfb\' => 12.16, \'mtd\' => 1372941, \'qtd\' => 2782291, \'khs\' => 19, \'yxs\' => array( 0 => Array ( \'yx\' => \'小寒2\', \'cur_consumption_yx\' => 41,756, \'hbxf_yx\' => 27590, \'hbcz_yx\' => 14165, \'hbbfb_yx\' => 51.34, \'tbxf_yx\' => 41247, \'tbcz_yx\' => 509, \'tbbfb_yx\' => 1.23, \'mtd_yx\' => 693326, \'qtd_yx\' => 1255756, \'khs_yx\' => 7, ), 2 => array( \'yx\' => \'小寒3\', \'cur_consumption_yx\' => 23,121, \'hbxf_yx\' => 19018, \'hbcz_yx\' => 4103, \'hbbfb_yx\' => 21.57, \'tbxf_yx\' => 14337, \'tbcz_yx\' => 8783, \'tbbfb_yx\' => 61.26, \'mtd_yx\' => 368597, \'qtd_yx\' => 748772, \'khs_yx\' => 4 ), 1 => array( \'yx\' => \'小寒4\', \'cur_consumption_yx\' => 16681, \'hbxf_yx\' => 16124, \'hbcz_yx\' => 557, \'hbbfb_yx\' => 3.46, \'tbxf_yx\' => 17129, \'tbcz_yx\' => -448, \'tbbfb_yx\' => -2.62, \'mtd_yx\' => 311017, \'qtd_yx\' => 777763, \'khs_yx\' => 12, ) ) ), \'3\'=>array( \'jl\' => \'小寒5\', \'xf\' => 267454, \'hbxf\' => 248614, \'hbcz\' => 18841, \'hbbfb\' => 7.58, \'tbxf\' => 266019, \'tbcz\' => 1436, \'tbbfb\' => 0.54, \'mtd\' => 6597550, \'qtd\' => 16793696, \'khs\' => 71, \'yxs\' => array( 3 => array( \'yx\' => \'小寒6\', \'cur_consumption_yx\' => 75649, \'hbxf_yx\' => 69782, \'hbcz_yx\' => 5867, \'hbbfb_yx\' => 8.41, \'tbxf_yx\' => 77636, \'tbcz_yx\' => -1987, \'tbbfb_yx\' => -2.56, \'mtd_yx\' => 1854390, \'qtd_yx\' => 4499984, \'khs_yx\' => 14, ), 0 => array( \'yx\' => \'小寒7\', \'cur_consumption_yx\' => 37496, \'hbxf_yx\' => 34339, \'hbcz_yx\' => 3157, \'hbbfb_yx\' => 9.19, \'tbxf_yx\' => 28751, \'tbcz_yx\' => 8745, \'tbbfb_yx\' => 30.42, \'mtd_yx\' => 813342, \'qtd_yx\' => 1970,128, \'khs_yx\' => 18, ), 1 => array( \'yx\' => \'小寒8\', \'cur_consumption_yx\' => 30,919, \'hbxf_yx\' => 28626, \'hbcz_yx\' => 2293, \'hbbfb_yx\' => 8.01, \'tbxf_yx\' => 51056, \'tbcz_yx\' => -20137, \'tbbfb_yx\' => -39.44, \'mtd_yx\' => 1352496, \'qtd_yx\' => 4498428, \'khs_yx\' => 19, ), 2 => array( \'yx\' => \'小寒8\', \'cur_consumption_yx\' => 123390, \'hbxf_yx\' => 115867, \'hbcz_yx\' => 7523, \'hbbfb_yx\' => 6.49, \'tbxf_yx\' => 108576, \'tbcz_yx\' => 14814, \'tbbfb_yx\' => 13.64, \'mtd_yx\' => 2577322, \'qtd_yx\' => 5825156, \'khs_yx\' => 21, ) ) ) );
接收通过ajax接收的数据,接收数据后for循环、以及$().each();两种循环都无法正常读取。
解决方案:
1、PHP对数据进行重构,使其变成一个有序数组(键值不重要的情况)
2、更换循环方式,使用$.each()循环方式进行输出,示例和输出如下:
//本人常用循环方式,无法循环无序json数据 $(data).each(function (index,val) { console.log(val); }); console.log(\'--------------------------------------------------------------\'); //>>可正确循环无序json数据的方式 $.each(data,function (index,val) { console.log(val); })
结果:
6、纪录一次PHPExcel的异常问题
问题出现:正常运行许久后,某一天出现服务器导出功能出现500异常
问题分析:
①本地拉取线上最新代码,但是开始并未拉取最新数据库,用的还是最开始的测试数据
②搭建本地测试环境。线上用的IIS、本地用的apache环境(对IIS不是很熟,搭建IIS环境自己会觉得浪费时间) ,PHP版本用的也不一致。
注:以上两步也导致后面解决问题浪费了不少时间,可的话请尽量和线上保持一致。
③开始自己测试本地导出功能代码,怀疑是否最新数据导致的异常。(正常到了这一步就应该能确定是数据问题,但由于上面两步的操作,第④就导致我后面排除了这个问题)
④因为上报异常者只给了这个异常,自己开始对最新数据进行导出测试。由于上面环境配置问题,确实所有数据本地导出都没问题,排除了数据异常。
⑤IIS环境本地搭建不是很熟也不是很方便,然后怀疑PHP版本异常。本地切换到服务器相同版本,经过测试后本地任然正常导出(前面导致的浪费时间操作)。
⑥因为选择导出的数据量大,怀疑内存、执行时间问题。经测试后排出(前面导致的浪费时间操作)
⑦怀疑是否IIS和Apache的配置导致,查看相关错误日志、测试(前面导致的浪费时间操作)
⑧因为前面本地所有数据都能正常导出过,到现在也没怀疑数据有问题。然后在线上测试另外一个相似的导出功能发现能正常导出,逐渐开始怀疑数据是否存在异常字符。最后在主管的帮助下定位到一条数据。
⑨刚好这条数据的特殊字符较多,开始分段定位到底哪个字符影响,最后找到问题
问题结果:
此次异常定位到的字符是一个 ‘=’,进行相关分析,最后精确定位的是文本开头的\'=\'。
在服务器的IIS环境下,PHPexcel文本开头的等号会被解析为excel中数学表达式输出,但由于等号后面并不是数据表达式,然后导致无法解析输出到excel文件。
在Apache2.4环境下,PHPExcel文本开头的等号不会被认为是数学表达式