您好!
我有一个在付费VPS上运行的网络应用程序。没问题。我将此应用程序移动到我自己的专用服务器上。
当前云服务器-CS-: Centos 6 x86_64; 2 Gb Ram; 2 vCPU
专用服务器上的虚拟: Centos 7 x86_64; 2 Gb Ram; 2 vCPU
我使用相同的规格部署了PC,因为"如果它可以正常使用它应该使用相同的"。
在API的端点上,当前的CS返回正确的json。新服务器返回:
致命错误: /var/www/api/Components/Database.php 在线<上允许的内存大小为536870912字节(试图分配4294967296字节) b> 439
第439行是:
call_user_func_array(array($stmt, 'bind_result'), $parameters);
我在这里找到的搜索结果并没有帮助。有人说升级PHP版本,其中90%设置了更大的内存限制。 **我做了**。我把它设置为256M,512M,2GB(超出此范围,没有ram可用),4GB和5GB。 ** Nada **
此查询在其他 - 生产服务器上正常工作。
新服务器:
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips mod_fcgid/2.3.9
PHP/5.4.16 mod_wsgi/3.4 Python/2.7.5
X-Powered-By: PHP/5.4.16
CS:
Server: Apache
X-Powered-By: PHP/5.5.22
我查看被查询的base64的长度。他们发送了2张图像数据。这个大小由mysql返回:
select LENGTH(image_base64) from pmv where pmv.model = 1;
这是查询。它返回2行。 Image_base64是LONGTEXT。还有其他一些专栏,但它不会增加这个问题。
LENGTH(image_base64)
162678
131402
显然不接近4Gb
我无法在CS上访问php / apache conf。我唯一没有尝试的是将PHP从5.4升级到5.5。可能是吗?我会在周末尝试访问服务器以尝试其他任何想法。
编辑#1
我将PHP版本更新为5.6.9。
同样的错误:
<b>Fatal error</b>: Allowed memory size of 536870912 bytes exhausted (tried to allocate 4294967296 bytes) in <b>/var/www/api/Components/Database.php</b> on line <b>439</b><br />
编辑#2
将列类型从 longtext 更改为 mediumtext 似乎与this question
一样但是为什么我需要更改此服务器上的列类型?到目前为止我可以测试,无论该列存储了多少信息。只要它是一个longtext col。它就会给出错误。
谢谢!
答案 0 :(得分:2)
4294967296字节听起来真的很多。你肯定在某个地方有内存泄漏。
人们,通过ini_set更改memory_limit(&#39; memory_limit&#39;,&#39; -1&#39;);根本不是解决方案。
请不要这样做。显然,php在某处有内存泄漏,你告诉服务器只使用它想要的所有内存。这个问题根本没有解决
<强>更新强>
如this bug report中所述:
这是使用libmysql时的ext / mysqli的已知限制(总是在5.2和之前)以及使用5.3启用libmysql时。原因是服务器不会发送有关该列的特定元数据。此longtext的最大长度为4G,ext / mysqli尝试与最大长度绑定,以确保不会发生数据丢失(数据不适合C级别的绑定缓冲区)。
所以要解决这个问题,你有4个解决方案:
text
或mediumtext
代替longblob
或longtext
来减少使用内存就我个人而言,我会选择第四个版本,因为如果它没有强制您重构代码的重要部分,那么最近版本通常会为您带来更多优势。
答案 1 :(得分:0)
正如this SO回答中所述,您可以尝试以下方法:
ini_set('memory_limit', -1);
但是你应该尝试找到记忆的去向,总是最好不要忘记!
在这种情况下,这更加相关,看到你的使用量超过4GB,这是一个内存泄漏的地狱。