Skip to content

Memory allocated by stream_context_create not released when destroying stream_socket_server #10885

Closed
@lucasnetau

Description

@lucasnetau

Description

I have a long running PHP application that is creating stream_socket_server over time, the memory allocated by stream_context_create() is never released even after closing and destroying the stream_socket_server. A minimal reproduction is below (backlog is set to allocate more memory on each loop however even an empty array to stream_context_create shows this issue). Eventually the application will crash, this is more evident in memory constrained environments like container deployments.

I found an old PHP bugs report referencing this with stream_socket_client (https://bugs.php.net/bug.php?id=61371) inhibition for deleting the context was too broad and a really old one that says that stream_context_create() memory is never released https://bugs.php.net/bug.php?id=40257 but this is not documented.

Output from memprof shows the allocated memory from stream_context_create()

image

<?php

$m0 = memory_get_usage(true);
for ($i=0;$i<50000;++$i){
    $context = stream_context_create(['socket'=>['backlog'=>511]]);
    $server = @\stream_socket_server(
        'tcp://127.0.0.1:0',
        $errno,
        $errstr,
        \STREAM_SERVER_BIND | \STREAM_SERVER_LISTEN,
        $context,
    );
    fclose($server);
    unset($server);
    unset($context);
    unset($errno);
    unset($errstr);
}
$m1 = memory_get_usage(true);
echo ($m1-$m0)/1048576,' MB allocated',PHP_EOL;

$cycles = \gc_collect_cycles() + gc_collect_cycles();
echo 'Ran ', $cycles, ' GC Cycles', PHP_EOL;

Resulted in this output:

46.00390625 MB allocated
Ran 0 GC Cycles

But I expected this output instead:

0 MB allocated
Ran 0 GC Cycles

PHP Version

PHP 8.0.28 - PHP 8.2.4

Operating System

No response

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions