原文网址:https://www.youyong.top/article/1158d21a5e1f
优化方法
从nginx日志中可知,是内存不够用了。默认一个php进程允许占用的内存是134217728bytes,而这个php进程还需要1048560bytes内存才能往下执行。
在php.ini中有关于内存的限制:
memory_limit = 128M //128M=131072K=134217728b
我可以把这个值改的大一点来解决问题。但不能每次都靠改大来解决。
通过用方法 memory_get_usage()逐行看程序内存占用,以此来优化内存。
1:去掉多余函数和变量
代码中的空格和注释都不影响内存的占用,但调用文件中多余的函数和变量就会占用内存,于是把不用的函数和变量删除掉
2:不要声明多余的变量
比如:
把 $rs = round ( abs ( $a_dt - $b_dt ) / 86400 ); return $rs;
改成 return round ( abs ( $a_dt - $b_dt ) / 86400 );
3:不用的变量及时释放掉
4:优化函数返回结果大小
函数尽可能的只返回每次调用所需要的结果集
比如:要得到的是:$datastruct
5:优化mysql返回结果集的大小(这个是我这里面影响最大的)
查询了一下表中数据的大小
mysql> select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data from TABLES where table_schema='flow' and table_name = 'channel_order_log_201511';
2.52MB.
再看看结果集在PHP中占的内存:
内存耗用:(76201912-1086264)/1024/1024 = 71.64M
哇 PHP的数组太占内存了,网上有人做过数组占用内存的测试,如下图:
那么我们这么优化那?
缩小返回的结果集,一开始是查询出了所有字段,改成 只返回需要的字段
2:在1的基础上,我们再使用 mysql_unbuffered_query来查询数据
mysql_unbuffered_query()向MySQL发送一条SQL查询query,但不像mysql_query()那样自动获取并缓存结果集。一方面,这在处理很大的结果集时会节省可观的内存。另一方面,可以在获取第一行后立即对结果集进行操作,而不用等到整个SQL语句都执行完毕。
PDO_Mysql也提供了这种使用方法:就是在prepare()方法之前增加:
$conn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
原文网址:https://www.youyong.top/article/1158d21a5e1f