mirror of
https://github.com/dunglas/frankenphp.git
synced 2025-10-05 07:27:14 +08:00

* add module (php_server directive) based workers * refactor moduleID to uintptr for faster comparisons * let workers inherit environment variables and root from php_server * caddy can shift FrankenPHPModules in memory for some godforsaken reason, can't rely on them staying the same * remove debugging statement * fix tests * refactor moduleID to uint64 for faster comparisons * actually allow multiple workers per script filename * remove logging * utility function * reuse existing worker with same filename and environment when calling newWorker with a filepath that already has a suitable worker, simply add number of threads * no cleanup happens between tests, so restore old global worker overwriting logic * add test, use getWorker(ForContext) function in frankenphp.go as well * bring error on second global worker with the same filename again * refactor to using name instead of moduleID * nicer name * nicer name * add more tests * remove test case already covered by previous test * revert back to single variable, moduleIDs no longer relevant * update comment * figure out the worker to use in FrankenPHPModule::ServeHTTP * add caddy/config_tests, add --retry 5 to download * add caddy/config_tests * sum up logic a bit, put worker thread addition into moduleWorkers parsing, before workers are actually created * implement suggestions as far as possible * fixup * remove tags * feat: download the mostly static binary when possible (#1467) * feat: download the mostly static binary when possible * cs * docs: remove wildcard matcher from root directive (#1513) * docs: update README with additional documentation links Add link to classic mode, efficiently serving large static files and monitoring FrankenPHP Signed-off-by: Romain Bastide <romain.bastide@orange.com> * ci: combine dependabot updates for one group to 1 pull-request * feat: compatibility with libphp.dylib on macOS * feat: upgrade to Caddy 2.10 * feat: upgrade to Caddy 2.10 * chore: run prettier * fix: build-static.sh consecutive builds (#1496) * fix consecutive builds * use minor version in PHP_VERSION * install jq in centos container * fix "arm64" download arch for spc binary * jq is not available as a rpm download * linter * specify php 8.4 default specify 8.4 so we manually switch to 8.5 when we make sure it works allows to run without jq installed * Apply suggestions from code review Co-authored-by: Kévin Dunglas <kevin@dunglas.fr> --------- Co-authored-by: Kévin Dunglas <kevin@dunglas.fr> * chore: update Go and toolchain version (#1526) * apply suggestions one be one - scriptpath only * generate unique worker names by filename and number * support worker config from embedded apps * rename back to make sure we don't accidentally add FrankenPHPApp workers to the slice * fix test after changing error message * use 🧩 for module workers * use 🌍 for global workers :) * revert1c414cebbc
* revert4cc8893ced
* apply suggestions * add dynamic config loading test of module worker * fix test * minor changes --------- Signed-off-by: Romain Bastide <romain.bastide@orange.com> Co-authored-by: Kévin Dunglas <kevin@dunglas.fr> Co-authored-by: Indra Gunawan <hello@indra.my.id> Co-authored-by: Romain Bastide <romain.bastide@orange.com>
91 lines
1.8 KiB
Go
91 lines
1.8 KiB
Go
package frankenphp
|
|
|
|
import (
|
|
"log/slog"
|
|
"time"
|
|
)
|
|
|
|
// Option instances allow to configure FrankenPHP.
|
|
type Option func(h *opt) error
|
|
|
|
// opt contains the available options.
|
|
//
|
|
// If you change this, also update the Caddy module and the documentation.
|
|
type opt struct {
|
|
numThreads int
|
|
maxThreads int
|
|
workers []workerOpt
|
|
logger *slog.Logger
|
|
metrics Metrics
|
|
phpIni map[string]string
|
|
maxWaitTime time.Duration
|
|
}
|
|
|
|
type workerOpt struct {
|
|
name string
|
|
fileName string
|
|
num int
|
|
env PreparedEnv
|
|
watch []string
|
|
}
|
|
|
|
// WithNumThreads configures the number of PHP threads to start.
|
|
func WithNumThreads(numThreads int) Option {
|
|
return func(o *opt) error {
|
|
o.numThreads = numThreads
|
|
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func WithMaxThreads(maxThreads int) Option {
|
|
return func(o *opt) error {
|
|
o.maxThreads = maxThreads
|
|
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func WithMetrics(m Metrics) Option {
|
|
return func(o *opt) error {
|
|
o.metrics = m
|
|
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// WithWorkers configures the PHP workers to start
|
|
func WithWorkers(name string, fileName string, num int, env map[string]string, watch []string) Option {
|
|
return func(o *opt) error {
|
|
o.workers = append(o.workers, workerOpt{name, fileName, num, PrepareEnv(env), watch})
|
|
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// WithLogger configures the global logger to use.
|
|
func WithLogger(l *slog.Logger) Option {
|
|
return func(o *opt) error {
|
|
o.logger = l
|
|
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// WithPhpIni configures user defined PHP ini settings.
|
|
func WithPhpIni(overrides map[string]string) Option {
|
|
return func(o *opt) error {
|
|
o.phpIni = overrides
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// WithMaxWaitTime configures the max time a request may be stalled waiting for a thread.
|
|
func WithMaxWaitTime(maxWaitTime time.Duration) Option {
|
|
return func(o *opt) error {
|
|
o.maxWaitTime = maxWaitTime
|
|
|
|
return nil
|
|
}
|
|
}
|