PHP允许的内存大小

时间:2015-06-12 22:13:47

标签: php mysql apache memory mariadb

您好!

我有一个在付费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。它就会给出错误。

谢谢!

2 个答案:

答案 0 :(得分:2)

4294967296字节听起来真的很多。你肯定在某个地方有内存泄漏。

You should read that

  

人们,通过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个解决方案:

  • 您可以使用textmediumtext代替longbloblongtext来减少使用内存
  • 您可以使用PDO连接器而不是mysqli,但我不知道在SaskPhp中实现它是否容易。
  • 您可以使用mysqli_stmt_store_result()在本地存储数据,这也会增加您的内存使用量,但由于它与缓冲区大小共享,所以会少一些。
  • 您可以使用高于5.3的版本升级PHP。

就我个人而言,我会选择第四个版本,因为如果它没有强制您重构代码的重要部分,那么最近版本通常会为您带来更多优势。

答案 1 :(得分:0)

正如this SO回答中所述,您可以尝试以下方法:

ini_set('memory_limit', -1);

但是你应该尝试找到记忆的去向,总是最好不要忘记!

在这种情况下,这更加相关,看到你的使用量超过4GB,这是一个内存泄漏的地狱。