如何包含包含(包括嵌套的包含)的文件



我正试图让SSI为我的SMF论坛工作,但我这样做的方式似乎与预期的方法不同。我想从不同目录的子目录includeSSI.php文件。换言之,SSI.php文件位于/home/account/public_html/forums/SSI.php,而表示includeSSI.php的文件则位于/home/account/public_html/dev/extension/page/file.php

如果我放include "/home/account/public_html/forums/SSI.php";,我会得到

require_once(/QueryString.php): failed to open stream: No such file or
directory in '/home/account/public_html/forums/SSI.php line 64'

如果我把它作为一个相对路径,我会得到同样的结果。

我试过chdir$_SERVER["DOCUMENT_ROOT"],结果是一样的。

SSI.php的开始(出现错误的地方(是:

<?php
/**
* Simple Machines Forum (SMF)
*
* @package SMF
* @author Simple Machines http://www.simplemachines.org
* @copyright 2011 Simple Machines
* @license http://www.simplemachines.org/about/smf/license.php BSD
*
* @version 2.0.17
*/
// Don't do anything if SMF is already loaded.
if (defined('SMF'))
return true;
define('SMF', 'SSI');
// We're going to want a few globals... these are all set later.
global $time_start, $maintenance, $msubject, $mmessage, $mbname, $language;
global $boardurl, $boarddir, $sourcedir, $webmaster_email, $cookiename;
global $db_server, $db_name, $db_user, $db_prefix, $db_persist, $db_error_send, $db_last_error;
global $db_connection, $modSettings, $context, $sc, $user_info, $topic, $board, $txt;
global $smcFunc, $ssi_db_user, $scripturl, $ssi_db_passwd, $db_passwd, $cachedir;
global $image_proxy_enabled, $image_proxy_secret, $image_proxy_maxsize;
global $auth_secret, $cookie_no_auth_secret;
// Remember the current configuration so it can be set back.
$ssi_magic_quotes_runtime = function_exists('get_magic_quotes_gpc') && get_magic_quotes_runtime();
if (function_exists('set_magic_quotes_runtime'))
@set_magic_quotes_runtime(0);
$time_start = microtime();
// Just being safe...
foreach (array('db_character_set', 'cachedir') as $variable)
if (isset($GLOBALS[$variable]))
unset($GLOBALS[$variable]);
// Get the forum's settings for database and file paths.
require_once(dirname(__FILE__) . '/Settings.php');
// Make absolutely sure the cache directory is defined.
if ((empty($cachedir) || !file_exists($cachedir)) && file_exists($boarddir . '/cache'))
$cachedir = $boarddir . '/cache';
$ssi_error_reporting = error_reporting((defined('E_STRICT') ? E_ALL | E_STRICT : E_ALL) & ~E_DEPRECATED);
/* Set this to one of three values depending on what you want to happen in the case of a fatal error.
false:  Default, will just load the error sub template and die - not putting any theme layers around it.
true:   Will load the error sub template AND put the SMF layers around it (Not useful if on total custom pages).
string: Name of a callback function to call in the event of an error to allow you to define your own methods. Will die after function returns.
*/
$ssi_on_error_method = false;
// Don't do john didley if the forum's been shut down competely.
if ($maintenance == 2 && (!isset($ssi_maintenance_off) || $ssi_maintenance_off !== true))
die($mmessage);
// Fix for using the current directory as a path.
if (substr($sourcedir, 0, 1) == '.' && substr($sourcedir, 1, 1) != '.')
$sourcedir = dirname(__FILE__) . substr($sourcedir, 1);
// Load the important includes.
require_once($sourcedir . '/QueryString.php');
require_once($sourcedir . '/Subs.php');
require_once($sourcedir . '/Errors.php');
require_once($sourcedir . '/Load.php');
require_once($sourcedir . '/Security.php');

File.php要简单得多,由以下部分组成:

<?php 
include "/home/account/public_html/forums/SSI.php"; 
echo $sourcedir;
?>

由于这段代码将用于各种不同的安装,并不是所有的安装都允许编辑SSI.php,所以我希望有一种方法可以让它在不必编辑SSI.php的情况下工作。不过,任何东西都可以放在file.php中。

编辑:不是权限问题。isreadable((对所有三个文件都返回true,我可以毫无问题地附加到它们。

似乎在已经包含的文件中使用了require/require_once,使用的是相对路径,所以解决方案使用的是绝对路径。

NB__DIR__常量将是定义文件绝对路径的好方法,特别是如果在include中使用,请参见

因此,请尝试将$sourcedir更改为__DIR__,因为参考您提到的错误消息(require_once(/QueryString.php)(,$sourcedir为空。

例如:如果SSI.phpQueryString.php在同一目录中,请尝试更改:

require_once(__DIR__ . '/QueryString.php');

与其他require/include文件相同

相关内容

  • 没有找到相关文章

最新更新