dongyixiu3110 2014-04-22 22:47
浏览 271
已采纳

在两个foreach循环中使用“continue 2”时,php 5.5内存泄漏?

I just came across a strange memory leak issue. I managed to track the problem down to the following code:

<?php
$data=array();
for($c=0; $c<32768; $c++)
    $data[$c]=array(1, 2, 3);
$filter=array(1, 2, 3);

for($kc=0; $kc<25600; $kc++)
{
    $cm=memory_get_usage(true);
    $pm=memory_get_peak_usage(true);
    echo "<b>loop $kc: current_memory: $cm, peak_memory: $pm...</b><br>";
    flush();

    foreach($data as $entry)
        foreach($filter as $pattern)
            continue 2;
}
?>

Output:

loop 0: current_memory: 12582912, peak_memory: 12582912...
loop 1: current_memory: 20709376, peak_memory: 20709376...
loop 2: current_memory: 28835840, peak_memory: 28835840...
loop 3: current_memory: 36962304, peak_memory: 36962304...
loop 4: current_memory: 45088768, peak_memory: 45088768...
loop 5: current_memory: 53215232, peak_memory: 53215232...
loop 6: current_memory: 61341696, peak_memory: 61341696...
loop 7: current_memory: 69468160, peak_memory: 69468160...
loop 8: current_memory: 77594624, peak_memory: 77594624...
loop 9: current_memory: 85721088, peak_memory: 85721088...
loop 10: current_memory: 93847552, peak_memory: 93847552...
loop 11: current_memory: 101974016, peak_memory: 101974016...
loop 12: current_memory: 110100480, peak_memory: 110100480...
loop 13: current_memory: 118226944, peak_memory: 118226944...
loop 14: current_memory: 126353408, peak_memory: 126353408...
loop 15: current_memory: 134479872, peak_memory: 134479872...
loop 16: current_memory: 142606336, peak_memory: 142606336...
loop 17: current_memory: 151257088, peak_memory: 151257088...
loop 18: current_memory: 159383552, peak_memory: 159383552...
loop 19: current_memory: 167510016, peak_memory: 167510016...
loop 20: current_memory: 175636480, peak_memory: 175636480...
loop 21: current_memory: 183762944, peak_memory: 183762944...
loop 22: current_memory: 191889408, peak_memory: 191889408...
loop 23: current_memory: 200015872, peak_memory: 200015872...
loop 24: current_memory: 208142336, peak_memory: 208142336...
loop 25: current_memory: 216268800, peak_memory: 216268800...
loop 26: current_memory: 224395264, peak_memory: 224395264...
loop 27: current_memory: 232521728, peak_memory: 232521728...
loop 28: current_memory: 240648192, peak_memory: 240648192...
loop 29: current_memory: 248774656, peak_memory: 248774656...
loop 30: current_memory: 256901120, peak_memory: 256901120...
loop 31: current_memory: 265027584, peak_memory: 265027584...
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 40 bytes) in xxx

When I remove the "continue 2" statement and use a simple "break" or "continue", the memory usage stays constant. Can anyone confirm this strange behavior? Did I find a memory leak bug in php 5.5? Using php-cli doesn't show this strange behavior. Only using php as mod_php inside apache shows this behavior.

My System:

$ php --version
PHP 5.5.11-2 (cli) (built: Apr  8 2014 11:42:22) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies

$ apache2ctl status
Apache Server Status for localhost (via ::1)

   Server Version: Apache/2.4.9 (Debian)
          mod_fastcgi/mod_fastcgi-SNAP-0910052141 PHP/5.5.11-2
          mod_perl/2.0.8 Perl/v5.18.2

   Server MPM: prefork
   Server Built: Mar 29 2014 21:52:01

I'm on current Debian testing (Jessie).

Thanks for your help!

  • 写回答

2条回答 默认 最新

  • dongyi2159 2014-05-04 07:57
    关注

    WAIT !!

    You should not disable opcache: as well as caching, opcache performs optimization.

    Optimization means that opcache changes the compiled opcodes.

    I am certain that it is the case that tuning optimization will show you where the bug is introduced, this will mean you can create a bug report at bugs.php.net and we have a chance of fixing the problem for everyone.

    Please take the time to do this, please.

    Tuning Optimization

    Opcache has several optimization passes, https://gist.github.com/krakjoe/962e54c38b155f896b00

    Configuring which passes run is a matter of changing opcache.optimization_level in your configuration, this is a bitmask, by default 0xffffffff.

    If you need help debugging visit #php.pecl on EFnet.

    Note: to have opcache enabled in php-cli, change opcache.enable_cli to 1, this will allow you to test in console, the same behaviour should display itself

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥100 需要跳转番茄畅听app的adb命令
  • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
  • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
  • ¥50 opencv4nodejs 如何安装
  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
  • ¥15 nginx反向代理获取ip,java获取真实ip
  • ¥15 eda:门禁系统设计
  • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
  • ¥15 376.1电表主站通信协议下发指令全被否认问题
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证