站长资讯网
最全最丰富的资讯网站

php什么情况内存泄露

php什么情况内存泄露

情况一、程序操作数据过大

情景还原:一次性读取超过php可用内存上限的数据导致内存耗尽

<?php ini_set('memory_limit', '128M'); $string = str_pad('1', 128 * 1024 * 1024);

解决办法:

1、能用钱解决的问题都不是问题,如果程序要读大文件的机会不是很多,且上限可预期,那么通过 ini_set('memory_limit', '1G'); 来设置一个更大的值或者 memory_limit=-1。内存管够的话让程序一直跑也可以。

2、如果程序需要考虑在小内存机器上也能正常使用,那就需要优化程序了。如下,代码复杂了很多。

<?php  //php7 以下版本通过 composer 引入 paragonie/random_compat ,为了方便来生成一个随机名称的临时文件  require "vendor/autoload.php";  ini_set('memory_limit', '128M');  //生成临时文件存放大字符串  $fileName = 'tmp'.bin2hex(random_bytes(5)).'.txt'; touch($fileName);  for ( $i = 0; $i < 128; $i++ ) {         $string = str_pad('1', 1 * 1024 * 1024);     file_put_contents($fileName, $string, FILE_APPEND);  }  $handle = fopen($fileName, "r");  for ( $i = 0; $i <= filesize($fileName) / 1 * 1024 * 1024; $i++ ) {   //do something        $string = fread($handle, 1 * 1024 * 1024);  }  fclose($handle);  unlink($fileName);

情况二程序操作大数据时产生拷贝

情景还原:执行过程中对大变量进行了复制,导致内存不够用。

<?php  ini_set("memory_limit",'1M');  $string = str_pad('1', 1* 750 *1024);  $string2 = $string;  $string2 .= '1';

解决办法:

及早释放无用变量,或者以引用的形式操作原始数据。

<?php  ini_set("memory_limit",'1M');  $string = str_pad('1', 1* 750 *1024);  $string2 = $string;  unset($string);  $string2 .= '1';

情况三、配置不合理系统资源耗尽

情景还原:因配置不合理导致内存不够用,2G 内存机器上设置最大可以启动 100 个 php-fpm 子进程,但实际启动了 50 个 php-fpm 子进程后无法再启动

赞(0)
分享到: 更多 (0)