@@ -21,6 +21,7 @@ type workerThread struct {
21
21
fakeRequest * http.Request
22
22
workerRequest * http.Request
23
23
backoff * exponentialBackoff
24
+ inRequest bool // true if the worker is currently handling a request
24
25
}
25
26
26
27
func convertToWorkerThread (thread * phpThread , worker * worker ) {
@@ -130,14 +131,15 @@ func tearDownWorkerScript(handler *workerThread, exitStatus int) {
130
131
131
132
// on exit status 1 we apply an exponential backoff when restarting
132
133
metrics .StopWorker (worker .fileName , StopReasonCrash )
133
- if handler .backoff .recordFailure () {
134
+ if ! handler . inRequest && handler .backoff .recordFailure () {
134
135
if ! watcherIsEnabled {
135
136
logger .Panic ("too many consecutive worker failures" , zap .String ("worker" , worker .fileName ), zap .Int ("failures" , handler .backoff .failureCount ))
136
137
}
137
138
logger .Warn ("many consecutive worker failures" , zap .String ("worker" , worker .fileName ), zap .Int ("failures" , handler .backoff .failureCount ))
138
139
}
139
140
}
140
141
142
+ // waitForWorkerRequest is called during frankenphp_handle_request in the php worker script.
141
143
func (handler * workerThread ) waitForWorkerRequest () bool {
142
144
// unpin any memory left over from previous requests
143
145
handler .thread .Unpin ()
@@ -172,6 +174,7 @@ func (handler *workerThread) waitForWorkerRequest() bool {
172
174
if c := logger .Check (zapcore .DebugLevel , "request handling started" ); c != nil {
173
175
c .Write (zap .String ("worker" , handler .worker .fileName ), zap .String ("url" , r .RequestURI ))
174
176
}
177
+ handler .inRequest = true
175
178
176
179
if err := updateServerContext (handler .thread , r , false , true ); err != nil {
177
180
// Unexpected error or invalid request
@@ -185,15 +188,20 @@ func (handler *workerThread) waitForWorkerRequest() bool {
185
188
186
189
return handler .waitForWorkerRequest ()
187
190
}
191
+
188
192
return true
189
193
}
190
194
195
+ // go_frankenphp_worker_handle_request_start is called at the start of every php request served.
196
+ //
191
197
//export go_frankenphp_worker_handle_request_start
192
198
func go_frankenphp_worker_handle_request_start (threadIndex C.uintptr_t ) C.bool {
193
199
handler := phpThreads [threadIndex ].handler .(* workerThread )
194
200
return C .bool (handler .waitForWorkerRequest ())
195
201
}
196
202
203
+ // go_frankenphp_finish_worker_request is called at the end of every php request served.
204
+ //
197
205
//export go_frankenphp_finish_worker_request
198
206
func go_frankenphp_finish_worker_request (threadIndex C.uintptr_t ) {
199
207
thread := phpThreads [threadIndex ]
@@ -202,6 +210,7 @@ func go_frankenphp_finish_worker_request(threadIndex C.uintptr_t) {
202
210
203
211
maybeCloseContext (fc )
204
212
thread .handler .(* workerThread ).workerRequest = nil
213
+ thread .handler .(* workerThread ).inRequest = false
205
214
206
215
if c := fc .logger .Check (zapcore .DebugLevel , "request handling finished" ); c != nil {
207
216
c .Write (zap .String ("worker" , fc .scriptFilename ), zap .String ("url" , r .RequestURI ))
0 commit comments