longxinH / xhprof

PHP7/PHP8 support
http://pecl.php.net/package/xhprof
Apache License 2.0
1.04k stars 165 forks source link

PHP80 / Possible memory leak on array_filter vs opcache #60

Closed quazardous closed 3 years ago

quazardous commented 3 years ago

I've experienced a memory leak using array_filter when both opcahe and xhprof are enabled.

here is a demo script:

<?php
// array_filter_short.php
namespace Somewhere\On\Earth;
class Foo {
    function leaking(array $array) {
        $f = function ($array) {
            return \array_filter($array, fn($item) => !is_null($item));
        };
        for (;;) {
            $clone = (array) $array;
            $res = $f($clone);
            printf("memory: %d\n", \memory_get_usage());
            unset($clone, $res);
        }
    }
    function run() {
        $array = array_combine(range(1, 1000, 2), array_fill(1, 500, null));
        $array += array_combine(range(2, 1000, 2), array_fill(1, 500, true));
        $this->leaking($array);
    }
}
(new Foo())->run();

Test it with


php80 -n -dzend_extension=opcache -dopcache.enable=1 -dopcache.enable_cli=1 -dextension=xhprof.so array_filter_short.php

Here is the PHP bug I've filled https://bugs.php.net/bug.php?id=81215

Here is the issue in phacility https://github.com/phacility/xhprof/issues/105

longxinH commented 3 years ago

@quazardous Fix

longxinH commented 3 years ago

https://pecl.php.net/package/xhprof/2.3.3