A long-running PHP process keeps everything the framework touched, so a worker that runs forever accumulates memory whether or not there is a leak.
$ php artisan queue:work redis
--max-jobs=1000 --max-time=3600 --memory=128
--tries=3 --backoff=10
# supervisor
# stopwaitsecs=3600 ← must exceed the longest job
# numprocs=4
The three limits are a seatbelt rather than a fix: a worker recycled every thousand jobs cannot leak enough to matter, and it also cannot tell you that it is leaking. Alerting on the restart rate is what keeps that visible. stopwaitsecs is the setting people miss — the default is ten seconds, after which supervisor sends SIGKILL, and that kills a worker mid-transaction.