Как вы знаете правильный путь для использования в инструкции PHP require_once()
У многих из них есть файл config.php в корневом каталоге веб-приложения, которое я хочу включить почти в любой другой php файл. Поэтому у большинства из них есть строка, например:
require_once("config.php");
или иногда
require_once("../config.php");
или даже
require_once("../../config.php");
Но я никогда не ошибаюсь в первый раз. Я не могу понять, что php будет рассматривать как текущий рабочий каталог при чтении одного из этих файлов. Это, по-видимому, не каталог, в котором создается файл, содержащий вызов require_once(), потому что у меня есть два файла в том же каталоге, у которых есть разные пути для config.php.
Как у меня ситуация, когда один путь правильный для обновления страницы, но ajax может обновить часть страницы, требует другого пути к config.php в заявлении require_once():
Какой секрет? Откуда находится этот путь?
Стреляйте, я боялся, что это не будет обычной проблемой. Это происходит под apache 2.2.8 и PHP 5.2.6, запущенных в Windows.
Ответы
Ответ 1
Текущий рабочий каталог для PHP - это каталог, в котором находится названный файл script. Если ваши файлы выглядели следующим образом:
/A
foo.php
tar.php
B/
bar.php
Если вы вызываете foo.php(ex: http://example.com/foo.php), то рабочий каталог будет /A/. Если вы вызываете bar.php(ex: http://example.com/B/bar.php), рабочим каталогом будет /A/B/.
Там, где это становится сложно. Скажем, что foo.php таково:
<?php
require_once( 'B/bar.php' );
?>
И bar.php:
<?php
require_once( 'tar.php');
?>
Если мы вызываем foo.php, то bar.php успешно вызовет tar.php, поскольку tar.php и foo.php находятся в том же каталоге, который является рабочим каталогом. Если вместо этого вы вызовете bar.php, это не сработает.
Как правило, вы увидите либо во всех файлах:
require_once( realpath( dirname( __FILE__ ) ).'/../../path/to/file.php' );
или с конфигурационным файлом:
// config file
define( "APP_ROOT", realpath( dirname( __FILE__ ) ).'/' );
с остальными файлами, используя:
require_once( APP_ROOT.'../../path/to/file.php' );
Ответ 2
Мне нравится делать это:
require_once(dirname(__FILE__)."/../_include/header.inc");
Таким образом, ваши пути всегда будут относиться к текущему расположению файла.
Ответ 3
Я использую dirname(__FILE__
)
вещь, например bobwienholt, но то, что она может заплатить, - это базовая точка входа, которая загружает весь ваш другой код, определяющий константу, ссылающуюся на корень проекта, т.е.
define("ROOT",dirname(__FILE__).'/' );
а затем все, что вам нужно знать, - это путь, который находится по отношению к корню, то есть:
require(ROOT . "/lib/tool/error.php");
note,
вы должны ДЕЙСТВИТЕЛЬНО избегать путей с "../" в начале их, они не относятся к файлу, но по отношению к тому, где вы ARE, и это создает код неисправности.
cd foo
php bar/baz.php
-> some error saying it cant find the file
cd bar
php baz.php
-> suddenly working.
Внимание!
Если вы используете нотацию "../", требуется complete игнорирование PHP Include Path, а ТОЛЬКО, где находится человек, который его запускает.
Ответ 4
Я включаю этот код вверху каждой страницы:
//get basic page variables
$self=$_SERVER['PHP_SELF'];
$thispath=dirname($_SERVER['PHP_SELF']);
$sitebasepath=$_SERVER['DOCUMENT_ROOT'];
//include the global settings, variables and includes
include_once("$sitebasepath/globals/global.include.php");
Включить и потребовать, чтобы оба выполняли либо относительный путь, либо полный путь. Я предпочитаю работать с полным путем и делать все мои ссылки, как приведенное выше выражение inlcude. Это позволяет мне ввести общую переменную $sitebasepath, которая обрабатывает специфичную для учетной записи информацию, которая может измениться с машины на машину, а затем просто введите путь из webroot, т.е. /globals/whatever _file.php
Я также использую переменную $self в формах, которые могут называть себя обработкой ввода данных.
Надеюсь, что это поможет.
Ответ 5
Так как require и require_once очень похожи на include и include_once, вся документация отправляется в разделе "include" функций doc на php.net. который страница
Сначала отображаются файлы для включения в каждой строке include_path относительно текущего рабочего каталога, а затем в каталоге тока script. Например. если ваш include_path - это библиотеки, текущие Рабочий каталог -/www/, вы включая include/a.php, и есть включить "b.php" в этот файл, b.php сначала просматривается в /www/libraries/ а затем в /www/include/. Если имя файла начинается с./или../, это выглядит только в текущем рабочем каталоге.
Кроме того, вы можете найти все текущие пути include, выполнив "php -i" из командной строки. Вы можете отредактировать путь include в файле php.ini, а также через ini_set(). Вы также можете запустить функцию php_info() на своей странице, чтобы получить распечатку ваших env vars, если CLI неудобен.
Ответ 6
Если у вас есть достаточные права доступа, попробуйте изменить настройку PHP include_path
для всего сайта. Если вы не можете этого сделать, вам придется либо маршрутизировать каждый запрос через тот же PHP скрипт (например, с помощью Apache mod_rewrite), либо вам придется использовать "инициализацию" script, которая устанавливает include_path:
$includeDir = realpath(dirname(__FILE__) . '/include');
ini_set('include_path', $includeDir . PATH_SEPARATOR . ini_get('include_path'));
После того, как этот файл включен, используйте пути относительно каталога include:
require_once '../init.php'; // The init-script
require_once 'MyFile.php'; // Includes /include/MyFile.php
Ответ 7
Единственное место, где я видел путь, который вы оценили, это файл, который вы сейчас редактируете. У меня никогда не было никаких проблем с этим, но если да, вы можете предоставить дополнительную информацию (версия PHP, ОС и т.д.).
Ответ 8
Путь файла PHP, запрошенный в исходном GET или POST, по существу является "рабочим каталогом" этого script. Любые "включенные" или "требуемые" сценарии наследуют это как их рабочий каталог.
Я либо использую абсолютные пути в require require, либо модифицирую PHP include_path, чтобы включить какой-либо путь в мое приложение, которое я могу использовать, чтобы сохранить дополнительную запись. Вы найдете это в php.ini.
include_path = ".:/list/of/paths/:/другой/путь/:/и/другой/один"
Я не знаю, поможет ли это вам в этом конкретном случае, но волшебные константы, такие как FILE и DIR, могут пригодиться, если вам когда-либо понадобится знать путь, в котором работает определенный файл.
http://us2.php.net/manual/en/language.constants.predefined.php
Ответ 9
Взгляните на функцию getcwd. http://us2.php.net/getcwd