搜索
首页后端开发php教程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,从根本上解决了此问题。

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
可以在PHP会话中存储哪些数据?可以在PHP会话中存储哪些数据?May 02, 2025 am 12:17 AM

phpsessionscanStorestrings,数字,数组和原始物。

您如何开始PHP会话?您如何开始PHP会话?May 02, 2025 am 12:16 AM

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考虑使用AttActAcks.s.s.4)

什么是会话再生,如何提高安全性?什么是会话再生,如何提高安全性?May 02, 2025 am 12:15 AM

会话再生是指在用户进行敏感操作时生成新会话ID并使旧ID失效,以防会话固定攻击。实现步骤包括:1.检测敏感操作,2.生成新会话ID,3.销毁旧会话ID,4.更新用户端会话信息。

使用PHP会话时有哪些性能考虑?使用PHP会话时有哪些性能考虑?May 02, 2025 am 12:11 AM

PHP会话对应用性能有显着影响。优化方法包括:1.使用数据库存储会话数据,提升响应速度;2.减少会话数据使用,只存储必要信息;3.采用非阻塞会话处理器,提高并发能力;4.调整会话过期时间,平衡用户体验和服务器负担;5.使用持久会话,减少数据读写次数。

PHP会话与Cookie有何不同?PHP会话与Cookie有何不同?May 02, 2025 am 12:03 AM

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

PHP如何识别用户的会话?PHP如何识别用户的会话?May 01, 2025 am 12:23 AM

phpientifiesauser'ssessionusessessionSessionCookiesAndSessionIds.1)whiwSession_start()被称为,phpgeneratesainiquesesesessionIdStoredInacookInAcookInamedInAcienamedphpsessidontheuser'sbrowser'sbrowser.2)thisIdAllowSphptptpptpptpptpptortoreTessessionDataAfromtheserverMtheserver。

确保PHP会议的一些最佳实践是什么?确保PHP会议的一些最佳实践是什么?May 01, 2025 am 12:22 AM

PHP会话的安全可以通过以下措施实现:1.使用session_regenerate_id()在用户登录或重要操作时重新生成会话ID。2.通过HTTPS协议加密传输会话ID。3.使用session_save_path()指定安全目录存储会话数据,并正确设置权限。

PHP会话文件默认存储在哪里?PHP会话文件默认存储在哪里?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版