【问题标题】:require_once ignoredrequire_once 被忽略
【发布时间】:2010-11-19 23:55:16
【问题描述】:

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") 没有抛出任何错误但里面的代码没有被执行!

【问题讨论】:

  • 有没有人注意到 index.php 正在加载 dbconnect.php 而不是 config.php 或 core.php?您还需要显示 dbconnect.php 的内容...

标签: php xampp windows-vista require-once


【解决方案1】:

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

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

【讨论】:

  • 我确实检查了 ini 以查看是否打开了安全模式,但事实并非如此,但这是个好建议!错误报告设置为忽略通知,但使用香草 E_ALL 我只是得到这个: 注意:使用未定义的常量 FILE_ROOT - 在第 87 行的 C:\webroot\core.php 中假设为 'FILE_ROOT' 甚至没有发出通知卸载的配置文件!
【解决方案2】:

如果 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 中包含config.php 将是:

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

等等。

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

【讨论】:

  • 使用 dirname(FILE) 是定义绝对路径的好方法!不幸的是,我正在处理的应用程序在配置文件中手动设置它,然后将其用作“APP_DIR”。我真的不知道为什么!
【解决方案3】:

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

<?php
require_once(dirname(__FILE__) . "/config.php");
?>

【讨论】:

  • 不在 nixes 上......它太奇怪了 php 在这种情况下只是默默地忽略了需求!
  • 这一行实际上来自我在 Linux 上专门开发的一个脚本。沉默的忽略位确实很奇怪,恐怕我无法帮助您。我刚刚发布了几年前我将其改编为最佳实践的内容。
猜你喜欢
  • 2011-12-28
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 2016-06-05
  • 2014-02-25
  • 2011-05-09
  • 2015-02-08
相关资源
最近更新 更多