【问题标题】:To have LaTeX-like PATH -system for PHP development为 PHP 开发提供类似 LaTeX 的 PATH 系统
【发布时间】:2009-08-08 03:31:49
【问题描述】:

我在 ~/Dropbox/db/ 开发我的项目。我需要将文件夹连续移动到 /var/www 才能在 Firefox 中看到结果,因为它是我唯一拥有 Apache 的地方。

我的文件树位于 ~/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/forms/login.php 中有以下参考:

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

这太糟糕了,因为一段时间后一切都会中断。例如,我在 index.php 中启动 Firefox。这意味着所有的 PATHS 都是相对于 index.php 的。这使得上面的命令毫无意义。

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

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

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

如何才能拥有一个类似 LaTeX 的 PHP PATH 系统?

【问题讨论】:

    标签: php latex path


    【解决方案1】:

    如果您始终希望您的包含相对于当前执行文件当前所在的文件夹,您可以使用以下内容:

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

    因此,如果该代码位于 x.php 中,并且您包含来自 y.phpx.php,则 y.php 位于哪个目录中并不重要,因为包含始终与 x.php 所在的目录相关.

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

    来自PHP Documentation

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

    【讨论】:

      【解决方案2】:

      方法 1

      include_path 是您要找的吗?您可以在 php.ini 或 apache vhost 中设置它:

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

      不如 kpathsea(Τεχ 使用的)那么好,但尽可能接近。我更喜欢这种方法,因为它可以轻松地将包含文件保存在文档根目录之外(因此您不必担心有人直接执行它们)。

      方法2

      您可以使用$_SERVER['DOCUMENT_ROOT'] 获取您的文档根目录。因此,您可以使用它来编写完整的包含路径。

      【讨论】:

      • 你的意思是当我在/home/masi/Dropbox/db/index.php 有index.php 时,我应该有php_value include_path ".:/home/masi/Dropbox/db/:" 以便能够通过localhost/index.php 在Firefox 中看到我的php 文件?
      • 当你设置 include_path 时,你会给 PHP 一个查找包含文件的位置列表。如果您将其设置为/home/masi/Dropbox/db/,并且您将其设置为include("foo.php"),那么PHP 将寻找/home/masi/Dropbox/db/foo.php。如果您有多个目录集(:-separated),那么它将按顺序搜索每个目录。
      【解决方案3】:

      另一种方法是从 ~/Dropbox/db/ 创建指向 /var/www/ 的符号链接 (不要忘记将 htaccesss 设置为跟随符号链接)

      【讨论】:

        【解决方案4】:

        一个好的解决方案是让你的整个程序从一个文件运行,通常是 index.php。在这种情况下,您要做的是接受一个 GET 参数,该参数告诉您要执行什么操作。这将使您可以包含始终相对于 index.php 的文件。

        例如:index.php?action=login 或 index.php?action=register。

        这也使 URL 具有唯一性,因此可以保留正常的浏览行为。

        虽然这可能看起来有点不寻常,但有许多 PHP 程序以这种方式运行(例如 DrupalSymfony)并且运行良好。

        【讨论】:

        • 您能否举例说明如何使用 GET 参数,例如文件handler_login.php。我目前在我的表单中使用 POST 方法。 - 如何使用 POST 方法获得与使用 GET 方法相同的结果?
        【解决方案5】:

        我不知道 LaTeX 到底是做什么的,但是我不知道你描述的错误为什么会发生,或者你认为这会发生吗? 当您将 firefox 指向 index.php 时 index.php 中的所有路径都将相对于 index.php 但是 login.php 中的所有路径将(应该)相对于 login.php ,即使 login.php 包含在 index.php 中. 不必做这些事情的一种方法是使用变量来存储基本路径。但这不适用于您的布局。

        另一方面,我确实有解决您移动文件问题的方法,只需重新配置 apache 对我来说,需要编辑的文件是 /etc/apache2/sites-enabled/000-default 你需要这样做

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

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

        结果应该是这样的,用你的用户名替换 USERNAME。

        <VirtualHost *:80>
            ServerAdmin webmaster@localhost
        
            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>
        

        那么您就不必移动文件了。

        【讨论】:

        • 您应该运行哪个命令来查看 Apache 文件中的更新? - 文件更改后的URL是什么? 如果我们在文件夹/home/masi/Dropbox/db/index.php`中有index.php,是localhost/index.php吗?
        • 我上面的配置中有一个错误,特别是我编辑过的 DocumentRoot /home/USERNAME/Dropbox/db 行做检查。 (之前是 DocumentRoot /home/USERNAMEDropbox/db)应该是现在的样子。该命令是 sudo /etc/init.d/apache2 restart 或者如果这不起作用然后 sudo /etc/init.d/apache2 stop 然后 sudo /etc/init.d/apache2 start 所有网址将保持不变并且是的,它将是 localhost/index.php
        猜你喜欢
        • 2011-11-07
        • 2014-03-16
        • 1970-01-01
        • 1970-01-01
        • 2013-05-08
        • 2011-03-26
        • 2014-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多