Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

SkolemIriConverter isn't reset between requests in worker mode (missing kernel.reset tag)

Open Beginner friendly
#8,680 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
1/5
Estimated time
Under an hour
Newbie friendliness
85/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
php
Domain
api

Research direction

Start with the service definition for api_platform.symfony.iri_converter.skolem in the Symfony bundle config, and with SkolemIriConverter, which implements ResetInterface and holds the objectHashMap property. Check that the service is missing the kernel.reset tag, then confirm the reset call is wired through services_resetter. Done when the reproduction's skolem map is empty after each reset.

Written by the indexing model from the issue text.

Description

API Platform version(s) affected: 5.0.2 (also 4.4 and main)

Description
I've been upgrading one of our projects to API Platform 5 (Symfony 8.1, FrankenPHP in worker mode). One endpoint returns embedded objects that aren't resources themselves, so they get /.well-known/genid/... IRIs. With that endpoint, a single worker's memory kept growing until it hit our 128M memory_limit. It only took about five requests.

it seems the skolem IRI converter keeps an object → IRI map, and it is never cleared between requests.

I think the cause is that SkolemIriConverter already implements ResetInterface, but its service (api_platform.symfony.iri_converter.skolem) isn't tagged kernel.reset, so services_resetter never calls it. As far as I can see, it's the same in 4.4, 5.0 and main.

How to reproduce

  1. Create a resource that returns an embedded object which isn't itself a resource, so it gets a genid IRI. For example:
#[ApiResource(operations: [new Get(provider: [self::class, 'provide'])])]
final class Report
{
    public string $id = '1';
    /** @var Line[] */
    public array $lines = [];

    public static function provide(): self
    {
        $r = new self();
        foreach (range(1, 500) as $i) {
            $r->lines[] = new Line(str_repeat('x', 1000));
        }

        return $r;
    }
}

final class Line
{
    public function __construct(public string $text) {}
}
  1. Boot the kernel once and send several requests through it. Run the services resetter between them, as a FrankenPHP worker would:
$kernel = new Kernel('prod', false);
$kernel->boot();
$skolem = $kernel->getContainer()->get('api_platform.symfony.iri_converter.skolem');
$map = (new \ReflectionProperty($skolem, 'objectHashMap'));

for ($i = 1; $i <= 5; $i++) {
    $response = $kernel->handle(Request::create('/reports/1', 'GET', server: ['HTTP_ACCEPT' => 'application/ld+json']));
    $kernel->terminate($request ?? Request::create('/'), $response);
    $kernel->getContainer()->get('services_resetter')->reset();

    printf("request %d: %d skolem entries, %.1f MB\n", $i, count($map->getValue($skolem)), memory_get_usage() / 1048576);
}
  1. Expected: the skolem map is empty, or at least stays flat, after each reset. What happens: it grows by the number of embedded objects on every request (500, 1000, 1500, …), and memory grows with it. In our app it reached the 128M limit within about five requests.
  2. Add the kernel.reset tag (see the workaround below) and run it again. The map is cleared after each request, and memory stays flat.

Possible Solution
Add the tag where the service is registered:

->tag('kernel.reset', ['method' => 'reset'])

Additional Context
Workaround for now

override the service definition ourselves for api_platform.symfony.iri_converter.skolem to add the tag

With that in place, memory stays flat across requests.

I'll raise a short PR

Dominant language
PHP
Stars
2.6k
Forks
989
Avg merge
2d 2h
Merged PRs (30d)
101

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from api-platform/core

All issues in api-platform/core

Similar issues

More PHP issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.