Heim  >  Artikel  >  Backend-Entwicklung  >  ThinkPhp3.2放到 linux环境下出现程序内存分配问题

ThinkPhp3.2放到 linux环境下出现程序内存分配问题

WBOY
WBOYOriginal
2016-06-23 13:39:311293Durchsuche

错误信息:
----------------------------------------------------
:(
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,从根本上解决了此问题。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn