Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
bug #32421 [EventDispatcher] Add tag kernel.rest on 'debug.event_disp…
…atcher' service (lyrixx) This PR was submitted for the 4.4 branch but it was merged into the 3.4 branch instead (closes #32421). Discussion ---------- [EventDispatcher] Add tag kernel.rest on 'debug.event_dispatcher' service | Q | A | ------------- | --- | Branch? | 4.4 | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | | Tests pass? | yes | Fixed tickets | | License | MIT | Doc PR | In CLI, Symfony leaks because it uses the TraceableEventDispatcher. Let's make this service resetable. This PR is related to #32418 --- Side note: Forcing user to use the `ServicesResetter` is IMHO bad for the DX. I prefer to have something that does not leak by default. More over, the TraceableEventDispatcher stores some informations for the profiler. But in CLI it does not make sens, since the tooling does not exist. I have already fixed such issue for monolog in #30339. I think we should do the same for the TraceableEventDispatcher. --- Note: When using #32418 + this PR and with the following code, it does not leak **at all** <details> <summary>code</summary> ```php <?php namespace App\Command; use Psr\Log\LoggerInterface; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; use Symfony\Component\EventDispatcher\Event; use Symfony\Component\HttpKernel\DependencyInjection\ServicesResetter; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; class LeakCommand extends Command { protected static $defaultName = 'leak'; private $dispatcher; private $resetter; private $logger; public function __construct(EventDispatcherInterface $dispatcher, ServicesResetter $resetter, LoggerInterface $logger) { $this->dispatcher = $dispatcher; $this->resetter = $resetter; $this->logger = $logger; parent::__construct(); } protected function execute(InputInterface $input, OutputInterface $output) { $this->dispatcher->addListener(MyEvent::class, function ($e) { }); for ($i=0; $i < INF; $i++) { $output->writeln(memory_get_usage()); $this->dispatcher->dispatch(new MyEvent()); $this->logger->debug('some log'); // if ($i > 2000) { // meminfo_dump(fopen('/tmp/my_dump_file.json', 'w')); // die; // } usleep(100); $this->resetter->reset(); } } } class MyEvent {} ``` </detail> Commits ------- 5249eaf [EventDispatcher] Add tag kernel.rest on 'debug.event_dispatcher' service
- Loading branch information