【问题标题】:Relative paths in PHP not working on server [closed]PHP中的相对路径在服务器上不起作用[关闭]
【发布时间】:2012-04-30 14:18:42
【问题描述】:

背景信息: 我一直在我自己的服务器(本地主机)上开发一个自托管的 Facebook 应用程序,并且一切正常。最近,我将文件上传到我的共享托管在线服务器 (hostgator) 并弹出一个奇怪的错误。

我的 require_once() 函数似乎忽略了 hostgator 服务器上的相对路径。例如,在 index.php 中,我有 require_once('fb/login.php')。这会引发错误,指出找不到 example.com/login.php 中的文件。为什么 require() 会忽略我路径的 fb 部分?请记住,这在我的私人 localhost 服务器上运行良好。 我做了一些谷歌搜索并通过进入 php.ini 并打开 include_path=".:" 解决了一半的问题。这摆脱了第一个错误,但现在 login.php 也有 require_once('fb/sdk/Facebook.php') 并且无法找到该文件。我知道它会因嵌套需求而变得混乱,但这确实适用于我的本地主机服务器。 两台服务器都是 PHP5,我确保 php.ini 文件是相似的。默认情况下,localhost php.ini 已包含 include_path 注释。我什至已经用我的本地主机替换了在线 php.ini 文件。依然没有。 我尝试过使用绝对路径,它们确实有效,但是我的代码中有很多包含和要求,并且不想手动编写每条路径的代码。有什么见解吗?这是一个非常令人恼火的问题,我希望有一个简单的解决方案。

谢谢!


好吧,我进行了大量研究,最终使用 $_SERVER['DOCUMENT_ROOT'].'fb/login.php' 作为我所有需求和包含的路径。解决了我所有的问题,感谢上帝

【问题讨论】:

    标签: php path include require


    【解决方案1】:

    我很久以前就停止使用相对路径,以避免您现在遇到的那种麻烦。考虑像所有 PHP 框架那样做 - 它们定义一个变量来指示服务器的根的确切位置,然后您可以使用它来构建文件的绝对路径。

    您可以通过将其添加到您的根 index.php 文件来做到这一点:

    define('DOCROOT', realpath(dirname(__FILE__)).'/');
    

    那么只需遍历所有require 语句并首先添加 DOCROOT:

    require_once('fb/login.php');
    

    变成:

    require_once(DOCROOT . 'fb/login.php');
    

    您甚至可以通过将require_once(' 替换为require_once(DOCROOT . ' 来进行全局搜索和替换

    【讨论】:

    • 好吧,这太奇怪了。如果我将 ROOT 设置为 dirname(FILE) 并要求 ROOT 。 “fb/login.php”;它不起作用,但如果我先回显 ROOT 。 “fb/login.php”;然后要求它,它工作正常。怎么回事?
    • 这确实很奇怪。当您说它不起作用时,您的意思是它什么都不做,还是显示一些错误消息?如果未显示错误消息,请尝试使用 error_reporting(E_ALL | E_STRICT) 更改报告级别。
    • 好吧,我进行了大量研究,最终使用 $_SERVER['DOCUMENT_ROOT'].'fb/login.php' 作为我所有需求和包含的路径。解决了我所有的问题,感谢上帝。
    【解决方案2】:

    我不能说我知道如何解决它,但这是我多次处理目录问题的方法:

    首先在你使用require_once的文件中调用getcwd(),看看你是否真的在你认为的位置。

    其次,尝试./fb/ 而不是fb/

    【讨论】:

    • 发生了一些非常奇怪的事情。当我在 index.php 的顶部添加 echo getcwd() 时,它加载了一切正常,但仍然抛出 www.example.com/login.php 丢失的错误。非常非常奇怪。当我只添加 getcwd() 时它不起作用。
    • 好吧,这太奇怪了。如果我需要 ROOT 。 “fb/login.php”;它不起作用,但如果我先回显 ROOT 。 “fb/login.php”;然后要求它,它工作正常。怎么回事?
    【解决方案3】:

    您为什么不尝试require_once('../fb/login.php'); 而不是更改 php.ini 文件?

    或者只是require_once('/fb/login.php');

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-18
      • 2016-01-12
      • 2013-10-22
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      相关资源
      最近更新 更多