require_once 中的 require_once 创建路径问题

4
我有一个问题:
  • 一个文件:/public_html/folderX/test.php 里面有一行代码:require_once '../functions/sendemail.php'
  • 另一个文件:/public_html/functions/sendemail.php 里面有一行代码:require_once '../config.php'

config.php 在这种情况下可以正常加载。

当我尝试将functions/sendemail.php添加到不在folderX中的文件中时,问题就出现了。例如:

当我尝试在public_html/test.php上添加require_once 'functions/sendemail.php'时,我得到了以下错误信息:

警告:require_once(../config-min.php) [function.require-once]:无法打开流:在public_html/test.php中没有此文件或目录

如何使functions/sendemail.php 中的 require_once '../config.php' 可以“独立”工作,这样它被包含在任何文件中时,这个“require_once”问题就不会再出现了。

我尝试更改为'include_once',但仍然无法正常工作。

谢谢!

4个回答

5

试试这样做

require_once( dirname(__FILE__).'/../config.php')

2
尝试使用__DIR__来获取脚本的当前路径。
require_once(__DIR__.'../config.php');

__DIR__ 仅在 PHP 5.3 及以上版本中可用。

 __DIR__ 

The directory of the file. If used inside an include, the directory of 
the included file is returned. This is equivalent to dirname(__FILE__). 
This directory name does not have a trailing slash unless it is the root directory. 
(Added in PHP 5.3.0.)

1

我相信相对路径名在这里困扰了你。相对路径(据我所知)是基于当前活动脚本的目录。当包含需要文件时,PHP不会chdir进入文件夹。在我的有限经验中,对于这种情况,最好的建议是尽可能使用绝对路径。因此,可以使用以下内容:

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

会变成:

require_once('/home/myuser/config.php'); // Or wherever the file really is

dirname函数可以在这种情况下提供帮助。


1

你必须明白 PHP 会切换到最外层脚本所在的目录。当你使用相对路径(例如以 ./../ 开头或不以 / 开头的路径)时,PHP 将使用当前目录来解析相对路径。这会在你复制粘贴包含行的代码时造成问题。考虑以下目录结构:

/index.php
/admin/index.php
/lib/include.php

假设这两个索引文件包含以下行:

include_once("lib/include.php");

以上代码行在调用/index.php时有效,但在调用/admin/index.php时无效。
解决方案是不要复制粘贴代码,在您的包含调用中使用正确的相对文件路径:
/index.php       -> include_once("lib/include.php");
/admin/index.php -> include_once("../lib/include.php");

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