ThinkPhp3.2放到 linux环境下出现程序内存分配问题
----------------------------------------------------
:(
Allowed memory size of 1916796928 bytes exhausted (tried to allocate 3086655745 bytes)
错误位置
FILE: /data/xxx/ThinkPHP/Common/functions.php LINE: 370
ThinkPHP3.2.2 { Fast & Simple OOP PHP Framework } -- [ WE CAN DO IT JUST THINK ]
--------------------------------------------------
环境是 php5.4+nginx + mysql ,机器为阿里云主机,内存为1024m
请问有碰到这样问题的人么?
是咋回事?如何解决?修改www.conf 中的memory_limit 改大后还是依然出现这个问题。
回复讨论(解决方案)
什么东西一次要2.8G?
第370行是这样一句:
return ucfirst(preg_replace_callback('/_([a-zA-Z])/', function($match){return strtoupper($match[1]);}, $name));
居然要分配2.8G内存??
Allowed memory size of 1916796928 bytes exhausted (tried to allocate 3086655745 bytes)
的含义是:
在 1916796928b (1828M) 的可用内存中
申请 3086655745b (2943M)的空间失败
显然是待处理的变量 $name 出现了问题
清空 Runtime 目录再试试
清空 Runtime 目录了,还是没有解决问题!
两天了,这个破问题还没解决 。。
框架本来就耗内存。
这个啊,框架怎么耗内存也不可能耗到2G啊
估计是死循环,不断开辟空间了。
如果你确定是那句的问题,就不要写那么复杂啊啊
$b = preg_replace_callback('/_([a-zA-Z])/', 'aaa', $name)
return ucfirst($b);
function aaa($match){
return strtoupper($match[1]);
}
可能是由于替换掉_([a-zA-Z]) 然后从头开始找,所以会无限循环,你得让他结束的方法,
比如把_去掉来停止
换别的方案可能可以 preg_replace,preg_match_all,preg_split
这个啊,框架怎么耗内存也不可能耗到2G啊
估计是死循环,不断开辟空间了。
如果你确定是那句的问题,就不要写那么复杂啊啊
$b = preg_replace_callback('/_([a-zA-Z])/', 'aaa', $name)
return ucfirst($b);
function aaa($match){
return strtoupper($match[1]);
}
可能是由于替换掉_([a-zA-Z]) 然后从头开始找,所以会无限循环,你得让他结束的方法,
比如把_去掉来停止
换别的方案可能可以 preg_replace,preg_match_all,preg_split
--------------------------------------
这是框架内的代码。不是我写的。
刷新下,又出现如下问题。再刷新,还是上面内存问题,交替出现。
------------------
502 Bad Gateway
nginx/1.4.1
我怀疑是你的程序哪里错了,可能是写法错了,使底层框架产生死循环。
你这样做,查看你可控的逻辑流程。
从上面开始,一句句往下添加exit();(当然你可以用二分法找)
直到开启哪一句使得出现这个问题,就是那句错了。
查一下那句用到了什么函数,打印一下变量,看看传参顺序有没有错。
不行的话把那句及附近的代码贴上来让大家帮你看看
我看了3.0下面很像没有你说的那个函数
http://doc.thinkphp.cn/reference/functions.html
会不会是你版本低了?
哦 是3.2.2 看错了 你按9楼那样做就好。
然后和官方手册匹配下用法对不对
http://document.thinkphp.cn/manual_3_2.html
什么东西一次要2.8G?
----------------------------
版主,你不是碰到和回答过同样问题么?你是不是天天熬夜到2点,达到了过目就忘的能力啊。
问题原因就在于:preg_replace_callback出现内存泄露。在windows下没有问题,在linux下5.4.22,一下有上面问题。
所在,TP32在linux用php5.4可能会出现上面问题。
我的php环境是 5.4.22.
很奇怪!即便我判定是 bug,那也不能说明什么
什么东西一次要2.8G?
----------------------------
版主,你不是碰到和回答过同样问题么?你是不是天天熬夜到2点,达到了过目就忘的能力啊。
问题原因就在于:preg_replace_callback出现内存泄露。在windows下没有问题,在linux下5.4.22,一下有上面问题。
所在,TP32在linux用php5.4可能会出现上面问题。
我怀疑是你的程序哪里错了,可能是写法错了,使底层框架产生死循环。
你这样做,查看你可控的逻辑流程。
从上面开始,一句句往下添加exit();(当然你可以用二分法找)
直到开启哪一句使得出现这个问题,就是那句错了。
查一下那句用到了什么函数,打印一下变量,看看传参顺序有没有错。
不行的话把那句及附近的代码贴上来让大家帮你看看
多谢,和我程序完全没有关系。随便使用下 preg_replace_callback就会出现问题。比如test.php:
var_dump(preg_replace_callback('/\w{2}/',function($m)use(&$i){ echo ' i='.$i++; return $m[0]."cc ";},'abcd2acc'));
也会出现同样的问题。在国外网站随便一搜索,报告这个bug的人实在是太多了。但一直反复解决了,又反复出现。
自己写了个自认为比TP优秀多的框架YuYan PHP,从根本上解决了此问题。
下一篇: 详细介绍.NET中的性能改进