From 620c9e2ab1ad4a4e719a977acb29ddcaab7d0ae4 Mon Sep 17 00:00:00 2001 From: tianfenghan Date: Thu, 30 Jul 2026 18:01:07 +0800 Subject: [PATCH] fix: align server globals with PHP CLI --- src/Translator.php | 6 ++++-- tests/compiler/super_global/server-init.phpt | 10 ++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Translator.php b/src/Translator.php index 335771d7..6faa767d 100644 --- a/src/Translator.php +++ b/src/Translator.php @@ -1045,6 +1045,8 @@ CODE; if ($this->isBuildModeBin()) { $entryFunction = $this->symbols->function(self::ENTRY_FUNCTION); + // FunctionDef::sourceFile comes from loadFile()'s realpath(), so the + // CLI script fields always identify main()'s canonical absolute file. $entryFile = $entryFunction->sourceFile; $code .= $this->registerServerEnvironment($entryFile); $entryFileArg = $this->genCharPtr($entryFile, true); @@ -3228,7 +3230,7 @@ CODE; return $cppCode; } - private function registerServerEnvironment(string $scriptName): string + private function registerServerEnvironment(string $entryFile): string { $cppCode = 'php::Var &_SERVER = _global_var__SERVER;' . PHP_EOL; $cppCode .= 'php::Str php_self = "PHP_SELF";' . PHP_EOL; @@ -3236,7 +3238,7 @@ CODE; $cppCode .= 'php::Str script_filename = "SCRIPT_FILENAME";' . PHP_EOL; $cppCode .= 'php::Str path_translated = "PATH_TRANSLATED";' . PHP_EOL; $cppCode .= 'php::Str document_root = "DOCUMENT_ROOT";' . PHP_EOL; - $cppCode .= 'php::Str value = ' . $this->genCharPtr($scriptName, true) . ';' . PHP_EOL; + $cppCode .= 'php::Str value = ' . $this->genCharPtr($entryFile, true) . ';' . PHP_EOL; $cppCode .= '_SERVER.item(php_self, true) = value;' . PHP_EOL; $cppCode .= '_SERVER.item(script_name, true) = value;' . PHP_EOL; diff --git a/tests/compiler/super_global/server-init.phpt b/tests/compiler/super_global/server-init.phpt index 8dd97750..ce8cc049 100644 --- a/tests/compiler/super_global/server-init.phpt +++ b/tests/compiler/super_global/server-init.phpt @@ -12,10 +12,12 @@ DOCUMENT_ROOT=from-environment function main() { require __DIR__ . '/../../../src/Assert.php'; - Assert::eq($_SERVER['PHP_SELF'], __FILE__); - Assert::eq($_SERVER['SCRIPT_NAME'], __FILE__); - Assert::eq($_SERVER['SCRIPT_FILENAME'], __FILE__); - Assert::eq($_SERVER['PATH_TRANSLATED'], __FILE__); + $entryFile = realpath(__FILE__); + Assert::true(is_string($entryFile)); + Assert::eq($_SERVER['PHP_SELF'], $entryFile); + Assert::eq($_SERVER['SCRIPT_NAME'], $entryFile); + Assert::eq($_SERVER['SCRIPT_FILENAME'], $entryFile); + Assert::eq($_SERVER['PATH_TRANSLATED'], $entryFile); Assert::eq($_SERVER['DOCUMENT_ROOT'], ''); } ?>