From 1bed1a3b16dd25d40709609c730bfe7e719981d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Thu, 19 Feb 2026 15:33:59 +0100 Subject: [PATCH] fix: prevent worker starvation after max_execution_time restarts Disable the execution timer in frankenphp_worker_request_shutdown() to prevent stale timers from firing between requests. Also fix evaluation order in frankenphp_handle_request() to check for shutdown before calling frankenphp_worker_request_startup(). Fixes #2205 Co-Authored-By: Claude Opus 4.6 --- frankenphp.c | 6 +++++ testdata/worker-timeout-recovery.php | 21 ++++++++++++++++ worker_test.go | 36 ++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 testdata/worker-timeout-recovery.php diff --git a/frankenphp.c b/frankenphp.c index 67ffdf28b..a754a0baf 100644 --- a/frankenphp.c +++ b/frankenphp.c @@ -385,6 +385,12 @@ static void frankenphp_cleanup_worker_state(void) { /* Adapted from php_request_shutdown */ static void frankenphp_worker_request_shutdown() { +#ifdef ZEND_MAX_EXECUTION_TIMERS + /* Disable any execution timer set during the request callback to prevent + * stale timers from firing between requests */ + zend_unset_timeout(); +#endif + /* Flush all output buffers */ zend_try { php_output_end_all(); } zend_end_try(); diff --git a/testdata/worker-timeout-recovery.php b/testdata/worker-timeout-recovery.php new file mode 100644 index 000000000..76ad5a70c --- /dev/null +++ b/testdata/worker-timeout-recovery.php @@ -0,0 +1,21 @@ +