2

Windows 上 php 的奇怪问题...我的应用程序加载了一个“核心”文件,该文件加载了一个设置文件、注册自动加载、初始化等。在核心文件的顶部我有 include_once("config.php"); 这适用于当前目录中的任何内容,如果我从单独的目录中包含核心文件,尽管它只是默默地忽略了配置文件的包含......以前有人见过吗?

/webroot/core.php

<?php
  require_once "config.php";
  //register autoloads
  //do some initialization... standard stuff
?>

/webroot/config.php

<?php
  define("WEB_ROOT","/webroot");
  define("DB_USER","root");
  // ... more stuff...
?>

/webroot/admin/index.php

<?php
  require_once("../dbconnect.php");
  echo WEB_ROOT;
  // print string literal WEB_ROOT rather than value in config.php
?>

我的理解是文件操作是相对于发出请求的文件的目录,require_once(“config.php”)不应该选择相对于core.php的文件吗?这段代码就像我在 mac 或 Linux 上所期望的那样工作,但在 windows 上根本不工作,(如果我更改使用完整路径或 ../ 的要求,它可以工作)

真正的疯狂是 require_once("config.php") 没有抛出任何错误,但里面的代码没有被执行!

4

3 回答 3

7

如果 PHP 默默地忽略错误,请尝试将请求放在文件的顶部:

ini_set('display_errors', 'On');
error_reporting(E_ALL);

现在所有错误都应该可见。

然后最佳实践(根据我)是在请求的文件中(不在任何包含的文件中)为应用程序根定义一些具有完整文件系统路径的常量。所以index.php如果应用程序根是/webroot/admin

define('APP_DIR', dirname(__FILE__));

之后,当您包含某些内容时,请使用此常量。如果目录结构是:

/webroot/
    admin/
        index.php
    config.php
    core.php

并且您想config.php包括index.php

require_once APP_DIR . '/../config.php';

包括它是core.phpconfig.php

require_once APP_DIR . '/../config.php';

等等。

使用绝对文件系统路径将防止任何歧义。

于 2009-08-16T07:18:56.973 回答
2

如果要使用相对于执行包含的文件的路径包含文件,则必须预先添加完整路径,如下所示:

<?php
require_once(dirname(__FILE__) . "/config.php");
?>
于 2009-08-16T07:46:49.420 回答
1

也许您遇到了 PHP 的open_basedir限制?为了防止某些恶意脚本,PHP 有一个“安全模式”,除其他外,它限制了文件可以从哪里加载。如果 xampp 默认打开了这个,你可能会遇到它。

您可能还想检查您的网络服务器的错误日志,看看那里是否有任何失败的迹象(并打开错误报告,最好是 E_ALL,直到您解决问题为止)。

于 2009-08-16T07:05:05.527 回答