2009-08-08 24 views
0

我在〜/ Dropbox/db /开发我的项目。我需要将该文件夹连续移动到/ var/www,以便能够在Firefox中查看结果,因为它是唯一拥有Apache的地方。为了开发PHP开发的类似LaTeX的PATH系统

我的文件树是在〜/ Dropbox的/ DB/

. 
|-- handlers 
| |-- login.php 
| |-- question.php 
| |-- question_answer.php 
| `-- register.php 
|-- index.php 
|-- forms 
| |-- login.php 
| |-- question.php 
| |-- question_answer.php 
| `-- register.php 

我有实例的文件在以下参考〜/ Dropbox的/ DB /表格/ login.php中:

include '../handlers/login.php'; 

这很糟糕,因为所有事情都会在一段时间后破裂。例如,我在index.php启动Firefox。这意味着所有的PATHS都与index.php相关。这使得上面的命令毫无意义。

也许,这个问题唯一的解决办法就是让所有路径在我的所有文件绝对的。 我试图避免这种情况,因为这会迫使我使用SED的替换命令。

我想有一个类似LaTeX的\graphicspath的命令,用于窗体和处理程序,这样我就可以简单地说在哪里可以找到给定的文件在一个文件中。我发现PHP有以下功能,需要在index.php开头。但是,这似乎还不够,因为我无法将其扩展到形式和处理程序。

$path_parts = pathinfo('/var/www/index.php'); 

你怎么能有一个类似LaTeX的PHP路径系统?

回答

4

如果你总是希望你的包括对相对于目前国内当前执行的文件驻留在该文件夹,您可以使用以下命令:

include(dirname(__FILE__) . '/../hello.php'); 

所以,如果代码是在x.php,你包括y.phpx.php,它不会在哪个目录没关系y.php是因为包含总是relati到目录x.php是在。

我个人认为这是最实现你想要的最省力的方式。您不需要任何特殊的配置或设置,并且所有路径都是“相对的”。

PHP Documentation

__FILE__:文件的完整路径和文件名。如果在包含内使用,则返回包含文件的填充路径和文件名。

1

我不知道到底乳胶做什么,但是我不知道为什么你描述的错误发生,或者是你认为会发生这种情况? 当你指向的Firefox的index.php的index.php中所有的路径将是相对的index.php然而,在所有的login.php的路径将(应该)是相对的login.php,即使login.php中被索引中。 PHP。另外一种不需要做这种事情的方法是使用一个变量来存储基本路径。但是对于你的布局来说这不太合适。

在另一方面我有一个解决方案,您的移动文件的问题,只需要重新配置Apache 对我来说是在/ etc/apache2的/站点启用文件需要编辑/ 000-默认 你需要做的

sudo gedit /etc/apache2/sites-enabled/000-default 

并输入您的密码。 将路径更改为Dropbox/db目录的完整路径

它最终应该是这样的,用您的用户名替换USERNAME。

<VirtualHost *:80> 
    ServerAdmin [email protected] 

    DocumentRoot /home/USERNAME/Dropbox/db 
    <Directory /> 
     Options FollowSymLinks 
     AllowOverride None 
    </Directory> 
    <Directory /home/USERNAME/Dropbox/db/> 
     Options Indexes FollowSymLinks MultiViews 
     AllowOverride None 
     Order deny,allow 
     deny from all 
     allow from 127.0.0.1 
    </Directory> 

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ 
    <Directory "/usr/lib/cgi-bin"> 
     AllowOverride None 
     Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch 
     Order allow,deny 
     Allow from all 
    </Directory> 

    ErrorLog /var/log/apache2/error.log 

    # Possible values include: debug, info, notice, warn, error, crit, 
    # alert, emerg. 
    LogLevel warn 

    CustomLog /var/log/apache2/access.log combined 

    Alias /doc/ "/usr/share/doc/" 
    <Directory "/usr/share/doc/"> 
     Options Indexes MultiViews FollowSymLinks 
     AllowOverride None 
     Order deny,allow 
     Deny from all 
     Allow from 127.0.0.0/255.0.0.0 ::1/128 
    </Directory> 

</VirtualHost> 

那么你不会有四处移动文件。

+0

**您应该运行哪个命令来查看Apache文件中的更新? - 文件更改后的URL是什么?**如果我们在/ home/masi/Dropbox/db/index.php文件夹中有index.php,它是'localhost/index.php'吗? – 2009-08-08 13:28:08

+0

在我的配置上面有一个错误,特别是DocumentRoot/home/USERNAME/Dropbox/db 我已经编辑它做检查。 (在DocumentRoot/home/USERNAMEDropbox/db之前)应该像现在一样。 命令是sudo /etc/init.d/apache2 restart或者如果这样做不起作用,那么sudo /etc/init.d/apache2停止跟着sudo /etc/init.d/apache2 start 所有的URL都会保留相同,是的,它将是本地主机/ index.php – user152247 2009-08-08 20:03:41

1

一个好的解决办法是让你的整个程序运行从一个文件,通常的index.php。在这种情况下,你会做的是接受一个GET参数,告诉你要做什么动作。这将使它可以包含与index.php相关的文件。

例如:?的index.php动作=登录或动作的index.php =注册。

这也使得唯一的网址,以便正常浏览行为被保留。

虽然这在forst中可能看起来有些不寻常,但有一些PHP程序以这种方式运行(例如DrupalSymfony),并且它工作得很好。

+0

你可以举一个例子如何使用GET参数,例如,请给文件'handler_login.php'。目前我在我的表格中使用POST方法。 - **如何用POST方法实现与GET相同的结果?** – 2009-08-08 13:13:31

2

方法1

include_path你在找什么?您可以设置它要么在php.ini,或者你的Apache虚拟主机:

<VirtualHost *:80> 
    ... 
    php_value include_path ".:/usr/share/php:/usr/share/pear:/usr/local/share/php" 
    ... 
</VirtualHost> 

不太一样好Kpathsea在(什么Τεχ使用),但接近你可以得到的。我更喜欢这种方法,因为它可以很容易地将包含文件保存在文档根目录之外(因此您不必担心有人直接执行它们)。

方法2

可以使用$_SERVER['DOCUMENT_ROOT']您的文档根得到。所以你可以用它来写一个完整的包含路径。

+0

您的意思是我应该有'php_value include_path'。:/ home/masi/Dropbox/db /:“'能够当我在'/ home/masi/Dropbox/db/index.php'有index.php时,通过'localhost/index.php'在Firefox中查看我的php -file? – 2009-08-08 13:33:00

+0

当您设置include_path时,您正在给PHP查找包含文件的位置列表。如果你将它设置为'/ home/masi/Dropbox/db /',并且你包含(“foo.php”)',那么PHP会查找'/ home/masi/Dropbox/db/foo.php' 。如果你有多个目录设置(':'-separated),那么它将按顺序搜索每个目录。 – derobert 2009-08-10 18:24:06

2

另一种方法是创建一个symbolink链接在/ var/WWW /〜/ Dropbox的/ DB/ (不要忘记设置htaccesss跟随符号连接)