让 PHP 站点指向与代码中的路径不同的路径

Having PHP site point to a different path than one that is in the code

我 运行 Windows 上的一个 PHP 站点使用 Wampserver。整个站点都有一个硬编码行,例如:

$settings = parse_ini_file("/usr/local/apache2/myconfigs/settings.ini", true);

我知道这从一开始就是不好的做法,但这是我无法控制的。

当网站运行时,如果代码在 parse_ini_file 函数中查找 /usr/local/apache2/myconfigs/settings.ini,我是否有任何可能的方法可以欺骗网站指向 C:\wamp64\bin\apache\apache2.4.27\myconfigs\settings.ini

$settings = parse_ini_file(APACHE_INI_PATH, true);
// $settings = parse_ini_file("/usr/local/apache2/myconfigs/settings.ini", true);

如果您不想按照@cddoma 的建议进行查找和替换,我建议您在 windows 机器中创建目录 /usr/local/apache2/myconfigs/,然后复制文件 settings.ini 从 C:\wamp64\bin\apache\apache2.4.27\myconfigs\settings.ini 到那个目录.

打开 windows 命令行并输入以下内容

mkdir C:\usr\local\apache2\myconfigs\

copy C:\wamp64\bin\apache\apache2.4.27\myconfigs\settings.ini C:\usr\local\apache2\myconfigs\

这有点老套,但我认为这就是您要找的东西,所以这里的技巧是重新定义 parse_ini_file 函数并使其忽略无效的传递路径 ("/usr/local/apache2/myconfigs/settings.ini") 和请改用正确的文件。

这看起来很简单但有点棘手,因为您的新函数也应该以某种方式调用原始 parse_ini_file 函数,这就是为什么您需要先 重命名 然后 覆盖

您需要为此启用 PHP runkit 扩展,查看 runkit_function_redefine and runkit_function_rename 以供参考。

未经测试但应该可以工作,代码应该围绕这些行:

runkit_function_rename('parse_ini_file','original_parse_ini_file');
runkit_function_redefine('parse_ini_file', function() {
    original_parse_ini_file("C:\wamp64\bin\apache\apache2.4.27\myconfigs\settings.ini", true);
});

确保上面的代码在您的应用程序脚本的开头执行,并且任何 parse_ini_file 调用都应该使用您的文件而不是硬编码的文件。

如果您的应用程序没有单一入口点,您可以将上面的代码放在其中,您可以将其放在单独的脚本中,并通过 运行 在任何脚本之前 PHP 加载 auto_prepend_file 设置在你的 settings.ini 文件中,还要确保 runkit.internal_override 设置为 On 因为 parse_ini_file 不是用户定义的函数。

您可以使用 Symbolic link on Windows

您好,请查看

runkit_function_rename('parse_ini_file','o_parse_ini_file');
runkit_function_redefine('parse_ini_file', function($p1,$p2)  use($someCondition) {
    if($someCondition)
        o_parse_ini_file("C:\wamp64\bin\apache\apache2.4.27\myconfigs\settings.ini", true);
    else
        o_parse_ini_file($p1,$p2);

});

可以return

Call to undefined function runkit_function_rename()

修复此错误please read here

or here