【问题标题】:Include within an included file is not working with relative paths包含在包含的文件中不适用于相对路径
【发布时间】:2012-12-26 12:05:33
【问题描述】:

这个错误已经耗尽了我过去 64 分钟的理性思考能力,我真的不知道我该怎么办。

当我在包含的文件中使用以下 3 行时:

var_dump(file_exists('G:/xampp/htdocs/myproject/public_html/includes/htmlPurifierAndMarkdown.php')); //retuurns true
var_dump(__FILE__);
include '../htmlPurifierAndMarkdown.php'; //gives error

我得到以下输出:

boolean true

string 'G:\xampp\htdocs\myproject\public_html\includes\classes\genral.class.php' (length=71)


( ! ) Warning: include(../htmlPurifierAndMarkdown.php) [function.include]: failed to open stream: No such file or directory in G:\xampp\htdocs\myproject\public_html\includes\classes\genral.class.php on line 4
Call Stack
#   Time    Memory  Function    Location
1   0.0005  345328  {main}( )   ..\add.php:0
2   0.0036  382408  include( 'G:\xampp\htdocs\myproject\public_html\includes\classes\events.class.php' )    ..\add.php:28
3   0.0041  398024  include( 'G:\xampp\htdocs\myproject\public_html\includes\classes\standardpost.class.php' )  ..\events.class.php:2
4   0.0047  413928  include( 'G:\xampp\htdocs\myproject\public_html\includes\classes\genral.class.php' )    ..\standardpost.class.php:2

简而言之:

  1. 第一行表明该文件不是我想象的一部分,它确实存在。
  2. 第二行告诉我调用脚本的位置,仔细检查路径后,您会注意到我试图包含的文件位于父目录中
  3. 包含函数表示文件不存在

我只是在想象一些东西还是这是一些严重的 php 错误?

更新

当我手动访问genral.class.php 时,不会产生错误。从包含的文件中包含时是否适用特殊规则?

更新 2

当我将包含路径设置为 '../includes/htmlPurifierAndMarkdown.php' 时,这是相对于主调用脚本的路径,而主调用脚本又包含一个包含 genral.class.php 的脚本,它可以工作,但由于这个新include 仅与许多调用脚本中的一个相关,它对其他脚本进行了分解。在包含文件中包含文件时是否适用特殊规则??

【问题讨论】:

    标签: php path include


    【解决方案1】:

    __FILE__ 常量返回包含该行的文件的完整路径和文件名。 此文件可能位于当前工作目录以外的目录中。在您的特定示例中,您可以使用:

    include dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'htmlPurifierAndMarkdown.php';
    

    一个可能发生的例子如下:

    1. 正在执行的文件是/example.com/public_html/index.php
    2. 当前工作目录为/example.com/public_html/
    3. 索引文件包含/example.com/public_html/includes/classes/genral.class.php
    4. 上述文件试图包含../htmlPurifierAndMarkdown.php
    5. .. 相对于当前工作目录进行转换,而不是相对于包含的文件。因此,您最终会收到 /example.com/htmlPurifierAndMarkdown.php 和一条令人讨厌的错误消息。

    【讨论】:

    【解决方案2】:

    ../ 是一个相对路径——相对于当前工作目录。当前工作目录是外部脚本(浏览器请求的那个)所在的目录。在上面的例子中,PHP 将解析相对于add.php 的路径。

    使用dirname(__FILE__) 获取当前文件的绝对路径(无论是请求的还是包含的)。您可以使用它来计算使用相对路径的已知文件的绝对路径。

    【讨论】:

    • 正确但有点晚了:)
    【解决方案3】:

    尝试像这样包含文件:

    include(realpath(dirname(__FILE__) . '/../') . 'htmlPurifierAndMarkdown.php');
    

    以其他方式你有这些文件::

    /index.php  
    /includes/classes/genral.class.php  
    /includes/htmlPurifierAndMarkdown.php 
    

    index.php

    include('/includes/classes/genral.class.php'); 
    

    genral.class.php

    include('/includes/htmlPurifierAndMarkdown.php');
    

    如果你从 index.php 开始,这会很好......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-08
      • 2016-07-22
      • 2011-12-08
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      相关资源
      最近更新 更多