PHP中相对路径的问题无法正常工作

时间:2011-05-27 22:07:44

标签: php

我正在测试我网站上的免费帮助台脚本。我在一些故障排除后能够安装脚本,但它仍然无法正常工作。

我尝试提交新票证时收到的错误是:

  

警告:require(./ hesk_settings.inc.php)[function.require]:无法打开流:第39行/home/onesourc/test/hesk/index.php中没有此类文件或&gt;目录< / p>      

致命错误:require()[function.require]:无法打开所需的'./hesk_settings.inc.php'(include_path ='。:/ usr / local / lib / php:/ usr / local / Zend / lib第39行/home/onesourc/test/hesk/index.php中的/ZendFramework-1.11.6/library')

我确实将hesk_settings.inc.php放在正确的位置,相对路径应该正常工作,但事实并非如此。

以下是php文件中的一段代码,它试图找到相对路径:

define('HESK_PATH','./');
require(HESK_PATH . 'hesk_settings.inc.php');

代码来自http://www.hesk.com。这是一个简单的安装,我能够在我的本地xampp设置上运行它。

我的Linux服务器上是否存在导致此问题的设置?一个php.ini设置还是其他什么?我想先问一下stackoverflow,因为这是一个与PHP相关的问题。

如果您需要更多信息,请告知我们。 谢谢你的时间!


更新

不确定在这里回答评论的最佳方式。 我能够做“ls -la / home / onesourc / test / hesk /”。有太多的子目录和文件在末尾添加星号。它制作了如此长的列表,我不确定如何轻松地检索它。

  

ls -la / home / onesourc / test / hesk /

drwxr-xr-x  9 onesourc onesourc  4096 May 27 18:33 ./ 
drwxr-xr-x 22 onesourc onesourc  4096 May 27 00:01 ../ 
drwxr-xr-x  2 onesourc onesourc  4096 May 27 02:06 admin/ 
drwxrwxrwx  2 onesourc onesourc  4096 May 27 01:43 attachments/
-rw-r--r--  1 onesourc onesourc  3191 May 27 02:06 change_status.php
-rw-r--r--  1 onesourc onesourc  3444 May 27 02:06 download_attachment.php
-rw-r--r--  1 onesourc onesourc     0 May 27 00:07 footer.txt
-rw-r--r--  1 onesourc onesourc   657 May 27 02:06 gd_test.php
-rw-r--r--  1 onesourc onesourc     0 May 27 00:07 header.txt 
drwxr-xr-x  2 onesourc onesourc  4096 May 27 00:08 help_files/
-rw-r--r--  1 onesourc onesourc  7394 May 27 02:06 hesk_javascript.js
-rw-rw-rw-  1 onesourc onesourc  5117 May 27 02:09 hesk_settings.inc.php
-rw-r--r--  1 onesourc onesourc 10791 May 27 02:06 hesk_style.css 
drwxr-xr-x 3 onesourc onesourc  4096 May 27 00:04 img/ 
drwxr-xr-x  3 onesourc onesourc  4096 May 27 00:08 inc/
-rw-r--r--  1 onesourc onesourc 32213 May 27 18:33 index.php
-rw-r--r--  1 onesourc onesourc 23401 May 27 02:06 knowledgebase.php 
drwxr-xr-x  3 onesourc onesourc  4096 May 27 00:08 language/
-rw-r--r--  1 onesourc onesourc  5843 May 27 02:06 print.php
-rw-r--r--  1 onesourc onesourc  2246 May 27 02:06 print_sec_img.php
-rw-r--r--  1 onesourc onesourc  3724 May 27 02:06 rate.php
-rw-r--r--  1 onesourc onesourc 34057 May 27 02:06 readme.html
-rw-r--r--  1 onesourc onesourc  6158 May 27 02:06 reply_ticket.php
-rw-r--r--  1 onesourc onesourc  3273 May 27 02:06 secimg.inc.php
-rw-r--r--  1 onesourc onesourc 12564 May 27 02:06 submit_ticket.php
-rw-r--r--  1 onesourc onesourc  3270 May 27 02:06 suggest_articles.php
-rw-r--r--  1 onesourc onesourc 18174 May 27 02:06 ticket.php 
drwxr-xr-x  2 onesourc onesourc  4096 May 27 02:13 tmp/
-rw-r--r--  1 onesourc onesourc 22181 May 27 02:06 TreeMenu.js

2 个答案:

答案 0 :(得分:8)

PHP包含路径是一个棘手的主题。简而言之,requireinclude函数可以从调用者脚本以及定义的PHP包含路径开始工作,这些路径可能不是实际的脚本本身。举例来说,test.php包括libs/library.php,其中包含functions/helpers/helper.php

<强> test.php的

require_once('libs/library.php');

<强>库/ library.php

require_once('../functions/helpers/helper.php');

现在,看看这段代码,你期望library.php的相对包括工作。不幸的是,这种情况并非如此。实际上,要求将与 test.php 的位置相关,因此您的包含中会出现致命错误。

解决此问题的一种方法是使用包含文件列出各种常用目录的绝对路径。例如:

<强> global.php

define("APP_ROOT", "/home/user/site");
define("LIB_DIR", APP_ROOT . "/libs");
define("FUNCTION_DIR", APP_ROOT . "/functions");

既然路径是绝对的,我们就不会有问题,包括文件:

<强> test.php的

require_once('global.php');
require_once(LIB_DIR . '/library.php');

<强> library.php

require_once(FUNCTION_DIR . '/helpers/helper.php');

另一种选择,虽然我认为不太喜欢的方法,是使用dirname(__FILE__),它为您提供当前文件的绝对路径,然后您可以将其用于相对包含:

<强> library.php

require_once(dirname(__FILE__) . '/../functions/helpers/helper.php');

这不像上面显示的常量名称方法那样清晰。

答案 1 :(得分:1)

如果有人为了解决这个问题而保持清醒,我想发布我在睡觉前找到的解决方案。

经过大量搜索apache和php设置后,我终于看到了.htaccess文件的信息。对于那些不了解(像我)的人来说,这里的.htaccess是apache.org网站的定义:

  

.htaccess文件(或“分布式配置文件”)提供了一种基于每个目录进行配置更改的方法。包含一个或多个配置指令的文件放在特定的文档目录中,并且指令适用于该目录及其所有子目录。

在我的hesk脚本所在的父目录中,我有一个.htaccess文件,其中包含以下行:

    Options +FollowSymlinks
    RewriteEngine on
    RewriteRule ^filename/([A-Za-z0-9_%\s\.-]+)/([0-9]+)/([0-9]+)/oneSOURCE\.html$ /functions/download2.php?file=$2&filename=$1&key=$3 [L]
    RewriteCond %{REQUEST_URI} "/userfiles/documents/"
      RewriteRule (.*) index.html [L]
    RewriteCond %{REQUEST_URI} "/functions/download2.php"
      RewriteRule (.*) $1 [L]
    RewriteCond %{REQUEST_URI} "/functions/databaseDump.php"
      RewriteRule (.*) $1 [L]
    RewriteCond %{REQUEST_URI} "/functions/queryResults.php"
      RewriteRule (.*) $1 [L]
    RewriteCond %{REQUEST_URI} "/functions/checkForDocs.php"
      RewriteRule (.*) $1 [L]
    RewriteCond %{REQUEST_URI} "/reports/"
      RewriteRule (.*) $1 [L]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule \.(php)$ index.php/$1 [L]
    RewriteRule \.(html)$ index.php/$1 [L]
    RewriteRule (.*) - [L]
    RewriteRule (.*) index.php/$1 [L]

我创建了一个.htaccess文件,其中包含“RewriteEngine off”并上传到hesk目录。现在,原始脚本的相对路径工作正常。

如果此问题和答案不属于stackoverflow,我道歉。我最初认为这个问题与php和编码有关,但它似乎与目录的apache配置有关。

PS如果有人对我采取的路线感到好奇,可以在评论中随意询问。