Skip to content

Multiple calls to Cache::get within while loop causing incremental memory leak #54095

@sts-ryan-holton

Description

@sts-ryan-holton

Laravel Version

11.35.1

PHP Version

8.3.8

Database Driver & Version

MySql 8

Description

Multiple calls within while (true) loop to Cache::get() is causing incremental memory consumption (leak) when called from a custom artisan command ran within the terminal. See attached screenshots:

I'm using Redis as my cache driver locally here and in production. I'm using Laravel telescope locally.

Without the Cache::get block

Screenshot 2025-01-06 at 17 25 00

/**
 * Execute the console command.
 */
public function handle(): int
{
    $lastRestart = Cache::get('statistic_aggregates:ingest:restart');

    while (true) {
        dump(memory_get_usage() / (1024 * 1024));

        // if ($lastRestart !== Cache::get('statistic_aggregates:ingest:restart')) {
        //     Cache::forget('statistic_aggregates:ingest:restart');

        //     return self::SUCCESS;
        // }

        Sleep::for(1)->second();
    }
}

With the Cache::get block

Screenshot 2025-01-06 at 17 26 00

/**
 * Execute the console command.
 */
public function handle(): int
{
    $lastRestart = Cache::get('statistic_aggregates:ingest:restart');

    while (true) {
        dump(memory_get_usage() / (1024 * 1024));

        if ($lastRestart !== Cache::get('statistic_aggregates:ingest:restart')) {
            Cache::forget('statistic_aggregates:ingest:restart');

            return self::SUCCESS;
        }

        Sleep::for(1)->second();
    }
}

Steps To Reproduce

  1. Create a simple artisan command and run it from the command line with a while loop to Redis

Additionally, I have tried adding the following block of code to my project and calling it:

/**
 * Schedule Telescope to store entries if enabled.
 */
protected function ensureTelescopeEntriesAreCollected(): void
{
    if ($this->laravel->bound(\Laravel\Telescope\Contracts\EntriesRepository::class)) {
        \Laravel\Telescope\Telescope::store($this->laravel->make(\Laravel\Telescope\Contracts\EntriesRepository::class));
    }
}

Still creating a memory leak after 10 seconds.

Additional context

I've just tried some other things, replacing dump() with echo, still get the same memory leak.

Interestingly the problem doesn't happen when simply echoing other facades like: str()->random(32) or now()

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions