gpt4 book ai didi

PHP `require_once` 包含错误的文件

转载 作者:IT王子 更新时间:2023-10-29 01:21:34 24 4
gpt4 key购买 nike

我在 Linux Ubuntu 14.04-LTS 机器上有一个像这样的开发树,有三个相同的分支:

main -+-- leonardo --- project --- htdocs -+- panel --- index.php
| |
| +- config.php
|
+-- federico --- project --- htdocs -+- panel --- index.php
| |
| +- config.php
|
+-- carlo ------ project --- htdocs -+- panel --- index.php
| |
| +- config.php
..... (you get my drift).

既没有软链接(soft link)也没有硬链接(hard link)config.php 文件在 svn-ignore 中,并且在所有分支之间都是不同的

有一个Apache服务器,每个开发者都有一个virtualHost,所以我可以在http://leonardo.project.local看到我的开发版本或费德里科的 http://federico.project.local .

在调查当前的怪事时,两个文件是这样的:

<?php // this is panel/index.php
echo "I am " . __FILE__ . "\n";
echo "I will include " . realpath('../config.php') . "\n";
require_once '../config.php';

<?php // this is config.php
echo "I am " . __FILE__ . "\n";
exit();

当然预期的输出是:

I am leonardo/project/htdocs/panel/index.php
I will include /var/www/main/leonardo/project/htdocs/config.php
I am leonardo/project/htdocs/config.php

但实际输出是:

I am leonardo/project/htdocs/panel/index.php
I will include /var/www/main/leonardo/project/htdocs/config.php
I am federico/project/htdocs/config.php

更奇怪的是

    echo "I will include " . realpath('../config.php') . "\n";
require_once realpath('../config.php');

有效。

TL;DR require_oncerealpath 不同意“../config.php”的实际位置。

真正奇怪的是,我没有看到如何leonardo/project/htdocs/panel/ 中运行的脚本可以知道关于federico/project/htdocs/config.php;它应该向上移动四个目录,然后探索很多子目录。

我几乎开始怀疑这可能与文件系统甚至内核相关。

文件系统是 ext4,内核是 3.13.0-55-generic#92-Ubuntu SMP Sun Jun 14 18:32:20 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux。该机器是最新 VMware Workstation 上的虚拟 x64。

检查

  • PHP 的include_path 只包含./usr/local/php5/pear.
  • 如前所述,分支中没有文件是符号链接(symbolic link),所有涉及文件的 inode 计数表明没有交叉链接。这些文件确实不同。
  • 所有文件都确实存在,这不是“最后的包含”。
  • 从命令行,在 leonardo... 面板中,我运行“cat ../config.php”,然后我得到了我的 config.php,正如预期的那样。只有 PHP 才会包含错误的文件。
  • 重新启动 Apache(以防万一)无济于事。接下来我将尝试重新启动整个虚拟机,但为此我需要卡住多项服务,这会花费我一段时间。
  • 到昨天为止一切都很顺利(那时我不在)。最近三天没有系统更新,没有重启,甚至没有远程登录。正常运行时间现在是八天。
  • 我是个白痴:我可以通过检查集成测试日志知道这种情况何时开始发生。已经要求他们,期待他们在午餐后。

最佳答案

值得检查您的 include_path 设置的内容(这可以使用 get_include_path 完成)。

requireinclude 在给定绝对路径和相对路径的情况下会有不同的行为。当你使用

require_once realpath('../config.php');

这是在做:

require_once '/var/www/main/leonardo/project/htdocs/config.php';

如您所愿。

下面的奇怪之处:<​​/p>

require_once '../config.php';

发生是因为 PHP 将检查包含路径中的每个条目以查找匹配的文件并返回第一个匹配的条目。因此,很可能首先检查 federico 配置的路径。

关于PHP `require_once` 包含错误的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30912005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com