require_once在实际服务器中无法工作

3

我遇到了这样一种情况,一个PHP语句在本地主机上运行正常,但在生产服务器上却不行,尽管文件和文件夹的结构是相同的。

require_once '/../Renderer.php';

我在现场服务器上遇到的错误是:
警告:require_once(/../Renderer.php):打开流失败:在/home2/attafsir/public_html/balaghatoalquran/production/wp-content/themes/twentyten/Text/Diff/Renderer/unified.php的第19行中没有此类文件或目录
致命错误:require_once():无法打开所需的/ ../Renderer.php(include_path ='.:/usr/php/54/usr/lib64:/usr/php/54/usr/share/pear'),位于/home2/attafsir/public_html/balaghatoalquran/production/wp-content/themes/twentyten/Text/Diff/Renderer/unified.php的第19行
我花了很多时间尝试找出这种行为背后可能的原因,但是没有任何结果,非常感谢您的帮助。
PS:我已经向我的主机验证了php.ini中是否安装和配置了PEAR,并且他们向我确认了。(因为代码正在使用PEAR包)
解决方案: 解决方案是接受的答案,但是我想指出的是,在现场服务器上解决了问题,但是破坏了本地主机的功能。这是一个临时解决方案,因为最好的方法是在本地主机和现场服务器上使用相同的代码。当我找到完整的解决方案时,我会回来发布它。欢迎您的建议。

иҝҷж„Ҹе‘ізқҖж–Ү件дёҚеӯҳеңЁгҖӮиҜ·жЈҖжҹҘж–Ү件зҡ„е®һйҷ…еҗҚз§°renderer.phpжҲ–Renderer.phpпјҢеӣ дёәUnixжңәеҷЁеҢәеҲҶеӨ§е°ҸеҶҷгҖӮ - Guns
@Guns,文件名为Renderer.php。感谢您的评论,不幸的是这并没有解决问题。 - Adib Aroui
您没有使用正确的文件位置。 - Justin E
1
这也可能与Windows中的\和Linux中的/有关。 - Justin E
6个回答

4

/ 是文件系统的根目录,而尝试使用 .. 前往上一级目录。由于该目录不存在,因此会出现错误。

您确定不想使用相对路径吗?

如果您想要相对于 Web 服务器的根目录(除非有问题,否则不是文件系统的根目录),请使用类似于以下内容的路径:

$_SERVER['DOCUMENT_ROOT'] . '/../Renderer.php'

1
我受到你的答案的启发,找到了解决方案(但不幸的是在本地主机上出现了故障)。 - Adib Aroui
2
如果您的本地Web服务器正确设置,$_SERVER['DOCUMENT_ROOT']应该会给出您网站的根文件夹,因此不应该有问题。 - jeroen
你说的很有道理,但我仍然不明白为什么在从本地主机传输到线上时,我应该将不同的代码行放在同一个文件中。除了 require_once 之外,在整个网站中都没有出现这种行为。感谢您的时间。 - Adib Aroui
2
如果你正在使用HTML链接,/代表你的文档根目录。在PHP中,它是文件系统根目录。尝试更改为include_once、include或require,问题仍然存在。 - Justin E
@whitelettersandblankspaces 可能是Windows和Linux之间的目录分隔符问题,例如请参见此处:https://dev59.com/0m855IYBdhLWcg3wuG6W - jeroen
Mark B说得很好:“require/include不受Web服务器文档根目录的限制。这只是Web服务器中存在的一个概念。PHP只看到文件系统,并且可以访问其包含用户ID具有访问权限的任何文件/目录。” - Justin E

1

只需尝试:

require_once '../Renderer.php';

谢谢花时间,不幸的是这并没有解决问题。 - Adib Aroui
嗯,你可以验证 Renderer.php 是否在这里:/home2/attafsir/public_html/balaghatoalquran/production/wp-content/themes/twentyten/Text/Diff/Renderer.php - MrHunter
根据我的托管账户中的文件管理器,文件的位置是准确的,并且该文件存在于那里。 - Adib Aroui
@whitelettersandblankspaces 在托管帐户中,“/”是您帐户的根目录,您的文件可能在public_html、httpdocs等中。 您使用谁进行托管? - Justin E

0

去掉第一个斜杠,然后尝试以下操作:

require_once '../Renderer.php';

或者

require_once '../../Renderer.php';

哪一个适用取决于您的文件结构。


不幸的是,这个无法工作。只有 require_once '/../Renderer.php'; 可以工作,但仅限于本地主机。 - Adib Aroui

0

require_once DRI . '/../Renderer.php';

需要先调用DRI . '/../Renderer.php'文件;


请解释您的答案以使其易于理解。 - Lajos Arpad

0

你不能使用'/../Renderer.php'。它要么是'../',表示向上一级文件夹,要么是'/',表示根目录。


很遗憾,这个不起作用。只有 require_once '/../Renderer.php'; 在本地工作。 - Adib Aroui
2
你可能有基于Windows的本地主机。此外,服务器配置也是不同的。检查文件路径。 - Santosh Achari
是的,我同意你的看法,这很有逻辑性(在本地主机上使用Windows,在线服务器上使用Linux)。 - Adib Aroui

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接