You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
bug symfony#32421 [EventDispatcher] Add tag kernel.rest on 'debug.event_dispatcher' service (lyrixx)
This PR was submitted for the 4.4 branch but it was merged into the 3.4 branch instead (closessymfony#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 symfony#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 symfony#30339. I think we
should do the same for the TraceableEventDispatcher.
---
Note: When using symfony#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
0 commit comments