From 5979b4dac721ef67f6e4635af59ab5b43c3e40b1 Mon Sep 17 00:00:00 2001 From: Marc Date: Sun, 8 Mar 2026 22:28:14 +0700 Subject: [PATCH] fix php startup errors when ini files contain environment variables (#2252) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes #2250 --------- Signed-off-by: Marc Co-authored-by: Kévin Dunglas --- frankenphp.c | 14 +++++++------- frankenphp_test.go | 13 +++++++++++++ phpmainthread_test.go | 6 ++---- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/frankenphp.c b/frankenphp.c index 419959f3..9277560e 100644 --- a/frankenphp.c +++ b/frankenphp.c @@ -1135,6 +1135,13 @@ static void *php_main(void *arg) { frankenphp_init_interned_strings(); + /* take a snapshot of the environment for sandboxing */ + if (main_thread_env == NULL) { + main_thread_env = pemalloc(sizeof(HashTable), 1); + zend_hash_init(main_thread_env, 8, NULL, NULL, 1); + go_init_os_env(main_thread_env); + } + frankenphp_sapi_module.startup(&frankenphp_sapi_module); /* check if a default filter is set in php.ini and only filter if @@ -1144,13 +1151,6 @@ static void *php_main(void *arg) { should_filter_var = default_filter != NULL; original_user_abort_setting = PG(ignore_user_abort); - /* take a snapshot of the environment for sandboxing */ - if (main_thread_env == NULL) { - main_thread_env = pemalloc(sizeof(HashTable), 1); - zend_hash_init(main_thread_env, 8, NULL, NULL, 1); - go_init_os_env(main_thread_env); - } - go_frankenphp_main_thread_is_ready(); /* channel closed, shutdown gracefully */ diff --git a/frankenphp_test.go b/frankenphp_test.go index 0301b202..3b8c274d 100644 --- a/frankenphp_test.go +++ b/frankenphp_test.go @@ -160,6 +160,19 @@ func testHelloWorld(t *testing.T, opts *testOptions) { }, opts) } +func TestEnvVarsInPhpIni(t *testing.T) { + t.Setenv("OPCACHE_ENABLE", "0") + + runTest(t, func(handler func(http.ResponseWriter, *http.Request), _ *httptest.Server, _ int) { + body, _ := testGet("http://example.com/ini.php?key=opcache.enable", handler, t) + assert.Equal(t, "opcache.enable:0", body) + }, &testOptions{ + phpIni: map[string]string{ + "opcache.enable": "${OPCACHE_ENABLE}", + }, + }) +} + func TestFinishRequest_module(t *testing.T) { testFinishRequest(t, nil) } func TestFinishRequest_worker(t *testing.T) { testFinishRequest(t, &testOptions{workerScript: "finish-request.php"}) diff --git a/phpmainthread_test.go b/phpmainthread_test.go index c26f2cde..d2749918 100644 --- a/phpmainthread_test.go +++ b/phpmainthread_test.go @@ -188,12 +188,11 @@ func TestReturnAnErrorIf2WorkersHaveTheSameFileName(t *testing.T) { workersByName = map[string]*worker{} workersByPath = map[string]*worker{} w, err1 := newWorker(workerOpt{fileName: testDataPath + "/index.php"}) + assert.NoError(t, err1) workers = append(workers, w) workersByName[w.name] = w workersByPath[w.fileName] = w _, err2 := newWorker(workerOpt{fileName: testDataPath + "/index.php"}) - - assert.NoError(t, err1) assert.Error(t, err2, "two workers cannot have the same filename") } @@ -202,12 +201,11 @@ func TestReturnAnErrorIf2ModuleWorkersHaveTheSameName(t *testing.T) { workersByName = map[string]*worker{} workersByPath = map[string]*worker{} w, err1 := newWorker(workerOpt{fileName: testDataPath + "/index.php", name: "workername"}) + assert.NoError(t, err1) workers = append(workers, w) workersByName[w.name] = w workersByPath[w.fileName] = w _, err2 := newWorker(workerOpt{fileName: testDataPath + "/hello.php", name: "workername"}) - - assert.NoError(t, err1) assert.Error(t, err2, "two workers cannot have the same name") }