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

我刚遇到一个奇怪的内存泄漏问题。我设法将问题归结为以下代码:

<?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;
}
?>

输出:

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

当我删除“ continue 2”语句并使用简单的“ break”或“ continue”时,内存使用保持不变。
谁能确认这种奇怪的行为?
我是否在php 5.5中发现了内存泄漏错误?
使用php-cli不会显示这种奇怪的行为。仅将php作为apache内的mod_php使用可显示此行为。

我的系统:

$ 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

我正在进行当前的Debian测试(杰西)。

谢谢你的帮助!

参考方案

等待!

您不应该禁用opcache:除了缓存之外,opcache还会执行优化。

优化意味着opcache会更改已编译的操作码。

我敢肯定,优化优化会向您显示引入错误的位置,这意味着您可以在bugs.php.net上创建错误报告,我们有机会为每个人解决问题。

请花一些时间做这个。

优化优化

Opcache具有多个优化通道,https://gist.github.com/krakjoe/962e54c38b155f896b00

配置哪个遍次运行是在配置中更改opcache.optimization_level的问题,这是一个位掩码,默认情况下为0xffffffff

如果您需要调试帮助,请访问EFnet上的#php.pecl。

注意:要在php-cli中启用opcache,请将opcache.enable_cli更改为1,这将允许您在控制台中进行测试,相同的行为应显示出来

php继续跳过条件评估 - php

在我的简单代码中,“ continue”跳过条件求值,直接跳到循环体的开始(if行),从而导致无限循环。我可以看到,这是在循环条件下使用断点调试和恢复执行(不中断)或使用跨步时发生的。可能只是我很累,但我一无所知。while ( ($line = _e(fgets($dump_file))) !== FALSE ) { if ($line === '…

在while循环内继续搜索页面功能的语句 - php

我不明白为什么这个循环不起作用。该循环的目的仅仅是跳过不等于给定搜索词(在此示例中为TN)的数组的每个值(在此示例中为0-2)。所以输出应该是TN 而且不应该IN TN OH 这是我的代码:<?php $states = array('IN', 'TN', 'OH'); $search = &…

PHP-将日期插入日期时间字段 - php

我已在数据库中使用datetime字段存储日期,使用PHP将“今天的日期”插入该字段的正确方法是什么?干杯, 参考方案 我认为您可以使用php date()函数

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

PHP mysqli获取查询返回的第一行的值 - php

我正在使用mysqli从数据库中获取某些数据。我正在使用的查询已设置为仅从数据库返回一行。有没有一种方法可以在不使用while循环的情况下获取该行的值?我知道一个while循环对于返回多于一行的行很有用,但是如果不需要while循环,我想避免这种情况,因为不必要的代码是不好的编程。 参考方案 是的-您可以使用:$row = $result->fetch…