Иметь LaTeX-подобную PATH-систему для разработки PHP - PullRequest
0 голосов
/ 08 августа 2009

Я разрабатываю свой проект в ~ / 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';

, что ужасно, потому что через некоторое время все ломается. Например, я запускаю Firefox на index.php. Это означает, что все PATHS относятся к index.php. Это делает приведенную выше команду бессмысленной.

Возможно, единственное решение проблемы - сделать все PATH абсолютными во всех моих файлах. Я пытался избежать этого, потому что это заставило бы меня использовать команду замены SED.

Я хотел бы иметь команду, аналогичную \graphicspath LaTeX для форм и обработчиков, чтобы я мог просто сказать, где найти указанные файлы в одном файле. Я обнаружил, что PHP имеет следующую функцию, которая должна быть в начале index.php. Однако этого недостаточно, поскольку я не могу, например, распространить его на формы и обработчики.

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

Как у вас может быть LaTeX-подобная PATH -система для PHP?

Ответы [ 5 ]

4 голосов
/ 09 августа 2009

Если вы всегда хотите, чтобы ваши включения относились к папке, в которой находится текущий исполняемый файл, вы можете использовать следующее:

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

Таким образом, если этот код находится в x.php и вы включаете x.php из y.php, не имеет значения, в каком каталоге находится y.php, так как include всегда относительно каталога, в котором x.php .

Лично я считаю, что это самый простой способ достичь именно того, чего вы хотите. Вам не нужны никакие специальные настройки или настройки, и все пути являются «относительными».

Из документации PHP

__FILE__: полный путь и имя файла файла. При использовании внутри включения возвращается путь заполнения и имя файла включенного файла.

2 голосов
/ 08 августа 2009

Другим подходом было бы создать символьную ссылку на / var / www / из ~ / Dropbox / db / (Не забудьте настроить htaccesss для перехода по символическим ссылкам)

2 голосов
/ 08 августа 2009

Подход 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']. Таким образом, вы можете использовать это, чтобы написать полный путь включения.

1 голос
/ 08 августа 2009

Хорошее решение - запустить всю программу из одного файла, обычно index.php. В этом случае вы должны принять параметр GET, который скажет вам, что делать. Это позволило бы включать файлы всегда относительно index.php.

Например: index.php? Action = login или index.php? Action = register.

Это также относится к уникальным URL, поэтому нормальное поведение при просмотре сохраняется.

Хотя вначале это может показаться немного необычным, существует ряд программ на PHP, которые работают таким образом (например, Drupal или Symfony ) и работают очень хорошо.

1 голос
/ 08 августа 2009

Я не знаю точно, что делает 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>

Тогда вам не придется перемещать файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...