Skip to content

Commit 7fffbc2

Browse files
committed
let workers inherit environment variables and root from php_server
1 parent 61bbef4 commit 7fffbc2

File tree

2 files changed

+72
-42
lines changed

2 files changed

+72
-42
lines changed

caddy/caddy.go

Lines changed: 71 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ func (f FrankenPHPApp) CaddyModule() caddy.ModuleInfo {
9090
// Provision sets up the module.
9191
func (f *FrankenPHPApp) Provision(ctx caddy.Context) error {
9292
f.logger = ctx.Logger()
93-
f.logger.Info("FrankenPHPApp provisioning 🐘")
9493

9594
if httpApp, err := ctx.AppIfConfigured("http"); err == nil {
9695
if httpApp.(*caddyhttp.App).Metrics != nil {
@@ -431,7 +430,6 @@ func (f *FrankenPHPModule) Provision(ctx caddy.Context) error {
431430
}
432431

433432
if len(f.Workers) > 0 {
434-
// Tag workers with a unique module ID based on the module's memory address
435433
for i := range f.Workers {
436434
f.Workers[i].ModuleID = uintptr(unsafe.Pointer(f))
437435
}
@@ -489,11 +487,67 @@ func (f *FrankenPHPModule) ServeHTTP(w http.ResponseWriter, r *http.Request, _ c
489487

490488
// UnmarshalCaddyfile implements caddyfile.Unmarshaler.
491489
func (f *FrankenPHPModule) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
492-
// when adding a new directive, also update the allowedDirectives error message
490+
// First pass: Parse all directives except "worker"
493491
for d.Next() {
494492
for d.NextBlock(0) {
495493
switch d.Val() {
494+
case "root":
495+
if !d.NextArg() {
496+
return d.ArgErr()
497+
}
498+
f.Root = d.Val()
499+
500+
case "split":
501+
f.SplitPath = d.RemainingArgs()
502+
if len(f.SplitPath) == 0 {
503+
return d.ArgErr()
504+
}
505+
506+
case "env":
507+
args := d.RemainingArgs()
508+
if len(args) != 2 {
509+
return d.ArgErr()
510+
}
511+
if f.Env == nil {
512+
f.Env = make(map[string]string)
513+
f.preparedEnv = make(frankenphp.PreparedEnv)
514+
}
515+
f.Env[args[0]] = args[1]
516+
f.preparedEnv[args[0]+"\x00"] = args[1]
517+
518+
case "resolve_root_symlink":
519+
if !d.NextArg() {
520+
continue
521+
}
522+
v, err := strconv.ParseBool(d.Val())
523+
if err != nil {
524+
return err
525+
}
526+
if d.NextArg() {
527+
return d.ArgErr()
528+
}
529+
f.ResolveRootSymlink = &v
530+
496531
case "worker":
532+
for d.NextBlock(1) {
533+
}
534+
for d.NextArg() {
535+
}
536+
// Skip "worker" blocks in the first pass
537+
continue
538+
539+
default:
540+
allowedDirectives := "root, split, env, resolve_root_symlink, worker"
541+
return wrongSubDirectiveError("php or php_server", allowedDirectives, d.Val())
542+
}
543+
}
544+
}
545+
546+
// Second pass: Parse only "worker" blocks
547+
d.Reset()
548+
for d.Next() {
549+
for d.NextBlock(0) {
550+
if d.Val() == "worker" {
497551
wc := workerConfig{}
498552
if d.NextArg() {
499553
wc.FileName = d.Val()
@@ -552,48 +606,24 @@ func (f *FrankenPHPModule) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
552606
return errors.New(`the "file" argument must be specified`)
553607
}
554608

555-
f.Workers = append(f.Workers, wc)
556-
case "root":
557-
if !d.NextArg() {
558-
return d.ArgErr()
559-
}
560-
f.Root = d.Val()
561-
562-
case "split":
563-
f.SplitPath = d.RemainingArgs()
564-
if len(f.SplitPath) == 0 {
565-
return d.ArgErr()
566-
}
567-
568-
case "env":
569-
args := d.RemainingArgs()
570-
if len(args) != 2 {
571-
return d.ArgErr()
572-
}
573-
if f.Env == nil {
574-
f.Env = make(map[string]string)
575-
f.preparedEnv = make(frankenphp.PreparedEnv)
576-
}
577-
f.Env[args[0]] = args[1]
578-
f.preparedEnv[args[0]+"\x00"] = args[1]
579-
580-
case "resolve_root_symlink":
581-
if !d.NextArg() {
582-
continue
609+
// Inherit environment variables from the parent php_server directive
610+
if !filepath.IsAbs(wc.FileName) && f.Root != "" {
611+
wc.FileName = filepath.Join(f.Root, wc.FileName)
583612
}
584613

585-
v, err := strconv.ParseBool(d.Val())
586-
if err != nil {
587-
return err
588-
}
589-
if d.NextArg() {
590-
return d.ArgErr()
614+
if f.Env != nil {
615+
if wc.Env == nil {
616+
wc.Env = make(map[string]string)
617+
}
618+
for k, v := range f.Env {
619+
// Only set if not already defined in the worker
620+
if _, exists := wc.Env[k]; !exists {
621+
wc.Env[k] = v
622+
}
623+
}
591624
}
592625

593-
f.ResolveRootSymlink = &v
594-
default:
595-
allowedDirectives := "root, split, env, resolve_root_symlink, worker"
596-
return wrongSubDirectiveError("php or php_server", allowedDirectives, d.Val())
626+
f.Workers = append(f.Workers, wc)
597627
}
598628
}
599629
}

frankenphp.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ func ServeHTTP(responseWriter http.ResponseWriter, request *http.Request) error
413413
}
414414
}
415415

416-
// If no worker was availabe send the request to non-worker threads
416+
// If no worker was available send the request to non-worker threads
417417
handleRequestWithRegularPHPThreads(fc)
418418

419419
return nil

0 commit comments

Comments
 (0)