@@ -186,6 +186,10 @@ Option Type Description
186186 in this list are destroyed after each request to prevent state leakage.
187187 Default: ``['autoloader', 'locator', 'exceptions', 'commands',
188188 'codeigniter', 'superglobals', 'routes', 'cache'] ``
189+ **$resetEventListeners ** array Event names whose listeners are removed between requests. Use this
190+ when you register event listeners inside other event callbacks rather
191+ than at the top level of **Config/Events.php **, which would cause them
192+ to accumulate across requests. Default: ``[] ``
189193**$forceGarbageCollection ** bool Whether to force garbage collection after each request.
190194 ``true `` (default, recommended): Prevents memory leaks.
191195 ``false ``: Relies on PHP's automatic garbage collection.
@@ -214,6 +218,29 @@ Service Purpose
214218 state management can cause data leakage between requests. Only persist services
215219 that are truly stateless or manage their own request isolation.
216220
221+ .. _worker-mode-reset-event-listeners :
222+
223+ Reset Event Listeners
224+ =====================
225+
226+ .. versionadded :: 4.7.1
227+
228+ Event listeners registered at the top level of **Config/Events.php ** are loaded once
229+ at worker startup and persist correctly across requests. However, if you register a
230+ listener inside another event's callback, it will be re-registered on every request
231+ and accumulate:
232+
233+ .. literalinclude :: worker_mode/001.php
234+
235+ To clean up such listeners between requests, add the event name to
236+ ``$resetEventListeners `` in **app/Config/WorkerMode.php **:
237+
238+ .. literalinclude :: worker_mode/002.php
239+
240+ .. note :: The recommended approach is to register listeners at the top level of
241+ **Config/Events.php ** instead of inside callbacks. Use ``$resetEventListeners ``
242+ only when registering inside a callback is unavoidable.
243+
217244**********************
218245Optimize Configuration
219246**********************
0 commit comments