问题描述
我正在尝试让SSI在我的SMF论坛上工作,但是我的操作方式似乎与预期的方法不同。我想从另一个目录的子目录中include
SSI.PHP
文件。换句话说,SSI.PHP
文件位于/home/account/public_html/forums/SSI.PHP
,而表示include
SSI.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"]
,但结果相同。
<?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,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');
<?PHP
include "/home/account/public_html/forums/SSI.PHP";
echo $sourcedir;
?>
由于此代码将用于各种不同的安装中,并非所有安装都允许编辑SSI.PHP
,所以我很想一种无需编辑SSI.PHP
就可以使其工作的方法。一切都可以放在file.PHP
中。
编辑:不是权限问题。对于所有三个文件来说,isizable()都返回true,我可以毫无问题地附加到它们上。
解决方法
似乎您正在使用已经包含相对路径的文件内部使用require
/ require_once
,所以解决方案是使用绝对路径。
NB :如果在__DIR__
see
include
常量将是定义文件绝对路径的好方法。
因此,请尝试将$sourcedir
更改为__DIR__
,因为参考您提到的错误消息(require_once(/QueryString.php)
),$sourcedir
为空。
例如:如果SSI.php
和QueryString.php
在同一目录中,请尝试更改此内容:
require_once(__DIR__ . '/QueryString.php');
与其他require
/ include
文件相同的事情