代码之家  ›  专栏  ›  技术社区  ›  Michael

一旦忽略就要求

  •  2
  • Michael  · 技术社区  · 17 年前

    Windows上的PHP有个奇怪的问题…我的应用程序加载一个“核心”文件,它加载一个设置文件,注册自动加载,进行初始化等。在核心文件的顶部,我包含了一次“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”)不会抛出任何错误,但不会执行其中的任何代码!

    3 回复  |  直到 9 年前
        1
  •  7
  •   Jakub Kulhan    17 年前

    如果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.php 包括 组态PHP 那将是:

    需要“一次应用程序目录”。/../config.php';
    

    等等。

    使用绝对文件系统路径可以防止任何含糊不清的地方。

        2
  •  2
  •   Thorarin    17 年前

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

    <?php
    require_once(dirname(__FILE__) . "/config.php");
    ?>
    
        3
  •  1
  •   Amber    17 年前

    也许你碰到了PHP open_basedir 限制?为了防止一些恶意脚本,PHP有一个“安全模式”,除其他外,它限制了文件的加载位置。如果XAMPP在默认情况下启用了此选项,则可能会遇到它。

    您可能还需要检查Web服务器的错误日志,以查看是否有任何失败的迹象(并打开错误报告,最好是全部打开,直到问题得到解决)。

    推荐文章