@@ -11,6 +11,7 @@ import (
1111 "path/filepath"
1212 "strconv"
1313 "strings"
14+ "time"
1415
1516 "github.com/dunglas/frankenphp/internal/fastabs"
1617
@@ -63,6 +64,8 @@ type FrankenPHPApp struct {
6364 Workers []workerConfig `json:"workers,omitempty"`
6465 // Overwrites the default php ini configuration
6566 PhpIni map [string ]string `json:"php_ini,omitempty"`
67+ // The maximum amount of time a request may be stalled waiting for a thread
68+ MaxWaitTime time.Duration `json:"max_wait_time,omitempty"`
6669
6770 metrics frankenphp.Metrics
6871 logger * zap.Logger
@@ -93,6 +96,7 @@ func (f *FrankenPHPApp) Start() error {
9396 frankenphp .WithLogger (f .logger ),
9497 frankenphp .WithMetrics (f .metrics ),
9598 frankenphp .WithPhpIni (f .PhpIni ),
99+ frankenphp .WithMaxWaitTime (f .MaxWaitTime ),
96100 }
97101 for _ , w := range f .Workers {
98102 opts = append (opts , frankenphp .WithWorkers (repl .ReplaceKnown (w .FileName , "" ), w .Num , w .Env , w .Watch ))
@@ -119,6 +123,7 @@ func (f *FrankenPHPApp) Stop() error {
119123 // reset configuration so it doesn't bleed into later tests
120124 f .Workers = nil
121125 f .NumThreads = 0
126+ f .MaxWaitTime = 0
122127
123128 return nil
124129}
@@ -156,6 +161,17 @@ func (f *FrankenPHPApp) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
156161 }
157162
158163 f .MaxThreads = int (v )
164+ case "max_wait_time" :
165+ if ! d .NextArg () {
166+ return d .ArgErr ()
167+ }
168+
169+ v , err := time .ParseDuration (d .Val ())
170+ if err != nil {
171+ return errors .New ("max_wait_time must be a valid duration (example: 10s)" )
172+ }
173+
174+ f .MaxWaitTime = v
159175 case "php_ini" :
160176 parseIniLine := func (d * caddyfile.Dispenser ) error {
161177 key := d .Val ()
@@ -266,7 +282,7 @@ func (f *FrankenPHPApp) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
266282
267283 f .Workers = append (f .Workers , wc )
268284 default :
269- allowedDirectives := "num_threads, max_threads, php_ini, worker"
285+ allowedDirectives := "num_threads, max_threads, php_ini, worker, max_wait_time "
270286 return wrongSubDirectiveError ("frankenphp" , allowedDirectives , d .Val ())
271287 }
272288 }
0 commit comments