|
12 | 12 | namespace Symfony\Component\Messenger\EventListener;
|
13 | 13 |
|
14 | 14 | use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
15 |
| -use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent; |
16 |
| -use Symfony\Component\Messenger\Event\WorkerMessageHandledEvent; |
17 | 15 | use Symfony\Component\Messenger\Event\WorkerMessageReceivedEvent;
|
| 16 | +use Symfony\Component\Messenger\Event\WorkerRunningEvent; |
18 | 17 |
|
19 | 18 | /**
|
20 | 19 | * @author Tim Düsterhus <tim@tideways-gmbh.com>
|
21 | 20 | */
|
22 | 21 | class ResetMemoryUsageListener implements EventSubscriberInterface
|
23 | 22 | {
|
| 23 | + /** |
| 24 | + * Indicates whether the GC already ran during the current idle phase. |
| 25 | + */ |
| 26 | + private bool $collected = false; |
| 27 | + |
24 | 28 | public function resetBefore(WorkerMessageReceivedEvent $event): void
|
25 | 29 | {
|
26 | 30 | // Reset the peak memory usage for accurate measurement of the
|
27 | 31 | // memory usage on a per-message basis.
|
28 | 32 | memory_reset_peak_usage();
|
29 | 33 | }
|
30 | 34 |
|
31 |
| - public function collectAfter(WorkerMessageHandledEvent|WorkerMessageFailedEvent $event): void |
| 35 | + public function collectAfter(WorkerRunningEvent $event): void |
32 | 36 | {
|
33 |
| - // Run the cycle collector after handling a message to avoid it |
34 |
| - // running while the message is reserved and in processing. |
35 |
| - gc_collect_cycles(); |
| 37 | + // Try to avoid running the GC while a message is handled by running it once while the worker is idle |
| 38 | + if ($event->isWorkerIdle()) { |
| 39 | + if (!$this->collected) { |
| 40 | + gc_collect_cycles(); |
| 41 | + |
| 42 | + $this->collected = true; |
| 43 | + } |
| 44 | + } else { |
| 45 | + $this->collected = false; |
| 46 | + } |
36 | 47 | }
|
37 | 48 |
|
38 | 49 | public static function getSubscribedEvents(): array
|
39 | 50 | {
|
40 | 51 | return [
|
41 | 52 | WorkerMessageReceivedEvent::class => ['resetBefore', -1024],
|
42 |
| - WorkerMessageFailedEvent::class => ['collectAfter', -1024], |
43 |
| - WorkerMessageHandledEvent::class => ['collectAfter', -1024], |
| 53 | + WorkerRunningEvent::class => ['collectAfter', -1024], |
44 | 54 | ];
|
45 | 55 | }
|
46 | 56 | }
|
0 commit comments