Intereting Posts
Условная проверка диапазона дат mysqli для печати цены в sql Можно ли выполнить SQL-инъекцию (HIGH Level) в Damn Vulnerable Web App? PHP увеличивает переменную в функции. Функция запускается в forloop. сбрасывается до 0? Делает ли mysql_query все внедрить систему журналов в symfony2 Длительный фоновый скрипт PHP блокирует другие страницы PHP до тех пор, пока он не будет завершен Задайте переменные MySQL с MySQLi (а не переменными PHP) Специальные символы и двойные кавычки в PHP Отключить Close Modal на внешнем клике Очистка HTML путем удаления лишних / избыточных тегов форматирования Столбец не найден: 1054 Неизвестный столбец, используя соединение Почему файл журнала Symfony2 указывает время, отличное от времени сервера? Php получить строку между тегами Как я могу отобразить изображение из вложений документа в CouchDB? даты данных в верхней части и ячейки данных, идущие слева направо

Абсолютные или относительные пути

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

Какое решение здесь? Вы настраиваете файл конфигурации, который содержит корневой путь и отходит оттуда? Или у вас есть правило вроде: никогда не перемещайте файлы вокруг?

Я видел в некоторых проектах, что люди используют dirname ( FILE ). В чем смысл этого, я имею в виду, почему бы просто не оставить его, поскольку dirname является относительным в любом случае (в зависимости от того, где находится файл)?

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

root / App / Plugins

внутри корневого каталога: app-config.php

 if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/'); 

теперь предположим, что вы должны включить файл плагина, поэтому

внутри вашего плагина плагина: my-plugin.php

 require_once '../../app-config.php'; 

теперь все ниже этой строки может использовать ABSPATH

Например, вы хотите загрузить изображение

 <img src='".ABSPATH."Public/images/demo.png' alt=''/> 

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

 plugin-widget-1.php 

так что все внутри этого файла или любого другого файла, загруженного файлом my-plugin.php может использовать ABSPATH без включения каждого файла app-config.php .

имея в виду, что вы можете использовать все короткие руки в примере app-config.php

 define('UPLOAD_PATH', ABSPATH. 'Public/uploads/'); define('IMAGES_PATH', ABSPATH. 'Public/images/'); define('HELPERS_PATH', ABSPATH. 'App/helpers/'); ... 

так что теперь, когда вы все определили, если вам нужно переместить файл, скажем, пример с одной папкой вперед:

root / App / Plugins / Utils

просто inlucde require_once '../../../app-config.php';

очевидно, я полагаю, что вы не меняете пути каждый раз =) в любом случае, если вам нужно сделать это, всегда проще изменить одно включение файла вместо сотен.

надеюсь, это имеет смысл для вас =)

Я видел в некоторых проектах, что люди используют dirname (FILE). В чем смысл этого, я имею в виду, почему бы просто не оставить его, поскольку dirname является относительным в любом случае (в зависимости от того, где находится файл)?

Во всяком случае, это касается пути включения. Имя dirname( __FILE__ ) (или просто __DIR__ в PHP> = 5.3) существует, поэтому вы можете запускать файл из любого места. Если вы используете относительные пути, значение «.» может поменяться. Видеть:

berry @ berry-pc: ~% cat so.php

 <?php var_dump( realpath( '.' ) ); var_dump( realpath( __DIR__ ) ); 

berry @ berry-pc: ~% php so.php

 string(11) "/home/berry" string(11) "/home/berry" 

berry @ berry-pc: ~% cd foo

berry @ berry-pc: ~ / foo% php ../so.php

 string(15) "/home/berry/foo" string(11) "/home/berry" 

Таким образом, он относительный, но он относится к текущему рабочему каталогу, а не к каталогу, в котором находится файл. Вот почему вы хотите использовать __DIR__ для этого. И кстати; да, я не перемещаю файлы вокруг очень много. Если я это сделаю, мне нужно будет обновить каждый вызов этого файла, хотя я больше не требую или не включаю в себя огромное количество сборов, так как я использую автозагрузчик .

Что касается других файлов, которые я имею в виду (например, файлы шаблонов), я устанавливаю путь вручную, но один раз . Затем я ссылаюсь на $path . '/filename.php'; $path . '/filename.php'; , поэтому его легче изменить позже.

Зависит от вашего использования, определить константу для хранения пути приложения является одной из распространенных практик

Не используйте переменную, так как она может переопределить место в вашем приложении и может разорвать ваше приложение

Еще лучше комбинировать с symlink (символическое создание ветвей)

 application dirs =============================== /home/latest -> symlink /home/testing -> symlink /home/20111202000000 -> latest development version /home/20111201000000 -> yesterday stable release 

Таким образом, вы можете использовать символическую ссылку
/ home / testing -> / home / 20111202000000, сохраняя стабильную версию,
/ главная / последняя -> / home / 20111201000000

При этом вам не нужно рисковать, чтобы разорвать ваш производственный сайт, выполняя некоторые испытания / разработки, и вы можете легко сменить каталог разработки

Абсолютные пути лучше с точки зрения производительности при использовании кеша кода операции или множества операторов require / include (хотя это только заметно, когда вы начинаете включать сотни файлов, что может произойти при использовании такой структуры, как Zend / Symfony / etc) ,

При относительном пути кеш-код операции и php должны обрабатывать файлы realpath каждый раз, прежде чем он сможет работать, если он уже знает о файле, и если ему нужно снова загрузить его. PHP внутренне поддерживает хэш-файл файлов для размещения файлов, что очень быстро, так как он не должен каждый раз выполнять вышеуказанные вычисления.

Я всегда использую абсолютные пути, но я также запускаю любой пользовательский PHP-проект с файлом начальной загрузки, где я определяю наиболее часто используемые пути как константы, основанные на значениях, извлеченных из $_SERVER .

Вот как я определяю свои корневые пути:

 define("LOCAL_PATH_ROOT", $_SERVER["DOCUMENT_ROOT"]); define("HTTP_PATH_ROOT", isset($_SERVER["HTTP_HOST"]) ? $_SERVER["HTTP_HOST"] : (isset($_SERVER["SERVER_NAME"]) ? $_SERVER["SERVER_NAME"] : '_UNKNOWN_')); 

Путь LOCAL_PATH_ROOT – это корень документа. Путь HTTP_PATH_ROOT эквивалентен при доступе к одному и тому же пути через HTTP.

В этот момент преобразование любого локального пути в HTTP-путь можно выполнить с помощью следующего кода:

 str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, $my_path) 

Если вы хотите обеспечить совместимость с серверами на базе Windows, вам также нужно будет заменить селектор каталогов на разделитель URL:

 str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, str_replace(DIRECTORY_SEPARATOR, '/', $my_path)) 

Вот полный код начальной загрузки, который я использую для шаблона PHP PowerTools :

 defined('LOCAL_PATH_BOOTSTRAP') || define("LOCAL_PATH_BOOTSTRAP", __DIR__); // ----------------------------------------------------------------------- // DEFINE SEPERATOR ALIASES // ----------------------------------------------------------------------- define("URL_SEPARATOR", '/'); define("DS", DIRECTORY_SEPARATOR); define("PS", PATH_SEPARATOR); define("US", URL_SEPARATOR); // ----------------------------------------------------------------------- // DEFINE ROOT PATHS // ----------------------------------------------------------------------- define("RELATIVE_PATH_ROOT", ''); define("LOCAL_PATH_ROOT", $_SERVER["DOCUMENT_ROOT"]); define("HTTP_PATH_ROOT", isset($_SERVER["HTTP_HOST"]) ? $_SERVER["HTTP_HOST"] : ( isset($_SERVER["SERVER_NAME"]) ? $_SERVER["SERVER_NAME"] : '_UNKNOWN_')); // ----------------------------------------------------------------------- // DEFINE RELATIVE PATHS // ----------------------------------------------------------------------- define("RELATIVE_PATH_BASE", str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, getcwd())); define("RELATIVE_PATH_APP", dirname(RELATIVE_PATH_BASE)); define("RELATIVE_PATH_LIBRARY", RELATIVE_PATH_APP . DS . 'vendor'); define("RELATIVE_PATH_HELPERS", RELATIVE_PATH_BASE); define("RELATIVE_PATH_TEMPLATE", RELATIVE_PATH_BASE . DS . 'templates'); define("RELATIVE_PATH_CONFIG", RELATIVE_PATH_BASE . DS . 'config'); define("RELATIVE_PATH_PAGES", RELATIVE_PATH_BASE . DS . 'pages'); define("RELATIVE_PATH_ASSET", RELATIVE_PATH_BASE . DS . 'assets'); define("RELATIVE_PATH_ASSET_IMG", RELATIVE_PATH_ASSET . DS . 'img'); define("RELATIVE_PATH_ASSET_CSS", RELATIVE_PATH_ASSET . DS . 'css'); define("RELATIVE_PATH_ASSET_JS", RELATIVE_PATH_ASSET . DS . 'js'); // ----------------------------------------------------------------------- // DEFINE LOCAL PATHS // ----------------------------------------------------------------------- define("LOCAL_PATH_BASE", LOCAL_PATH_ROOT . RELATIVE_PATH_BASE); define("LOCAL_PATH_APP", LOCAL_PATH_ROOT . RELATIVE_PATH_APP); define("LOCAL_PATH_LIBRARY", LOCAL_PATH_ROOT . RELATIVE_PATH_LIBRARY); define("LOCAL_PATH_HELPERS", LOCAL_PATH_ROOT . RELATIVE_PATH_HELPERS); define("LOCAL_PATH_TEMPLATE", LOCAL_PATH_ROOT . RELATIVE_PATH_TEMPLATE); define("LOCAL_PATH_CONFIG", LOCAL_PATH_ROOT . RELATIVE_PATH_CONFIG); define("LOCAL_PATH_PAGES", LOCAL_PATH_ROOT . RELATIVE_PATH_PAGES); define("LOCAL_PATH_ASSET", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET); define("LOCAL_PATH_ASSET_IMG", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_IMG); define("LOCAL_PATH_ASSET_CSS", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_CSS); define("LOCAL_PATH_ASSET_JS", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_JS); // ----------------------------------------------------------------------- // DEFINE URL PATHS // ----------------------------------------------------------------------- if (US === DS) { // needed for compatibility with windows define("HTTP_PATH_BASE", HTTP_PATH_ROOT . RELATIVE_PATH_BASE); define("HTTP_PATH_APP", HTTP_PATH_ROOT . RELATIVE_PATH_APP); define("HTTP_PATH_LIBRARY", false); define("HTTP_PATH_HELPERS", false); define("HTTP_PATH_TEMPLATE", false); define("HTTP_PATH_CONFIG", false); define("HTTP_PATH_PAGES", false); define("HTTP_PATH_ASSET", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET); define("HTTP_PATH_ASSET_IMG", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_IMG); define("HTTP_PATH_ASSET_CSS", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_CSS); define("HTTP_PATH_ASSET_JS", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_JS); } else { define("HTTP_PATH_BASE", HTTP_PATH_ROOT . str_replace(DS, US, RELATIVE_PATH_BASE)); define("HTTP_PATH_APP", HTTP_PATH_ROOT . str_replace(DS, US, RELATIVE_PATH_APP)); define("HTTP_PATH_LIBRARY", false); define("HTTP_PATH_HELPERS", false); define("HTTP_PATH_TEMPLATE", false); define("HTTP_PATH_CONFIG", false); define("HTTP_PATH_PAGES", false); define("HTTP_PATH_ASSET", HTTP_PATH_ROOT . str_replace(DS, US, RELATIVE_PATH_ASSET)); define("HTTP_PATH_ASSET_IMG", HTTP_PATH_ROOT . str_replace(DS, US, RELATIVE_PATH_ASSET_IMG)); define("HTTP_PATH_ASSET_CSS", HTTP_PATH_ROOT . str_replace(DS, US, RELATIVE_PATH_ASSET_CSS)); define("HTTP_PATH_ASSET_JS", HTTP_PATH_ROOT . str_replace(DS, US, RELATIVE_PATH_ASSET_JS)); } // ----------------------------------------------------------------------- // DEFINE REQUEST PARAMETERS // ----------------------------------------------------------------------- define("REQUEST_QUERY", isset($_SERVER["QUERY_STRING"]) && $_SERVER["QUERY_STRING"] != '' ? $_SERVER["QUERY_STRING"] : false); define("REQUEST_METHOD", isset($_SERVER["REQUEST_METHOD"]) ? strtoupper($_SERVER["REQUEST_METHOD"]) : false); define("REQUEST_STATUS", isset($_SERVER["REDIRECT_STATUS"]) ? $_SERVER["REDIRECT_STATUS"] : false); define("REQUEST_PROTOCOL", isset($_SERVER["HTTP_ORIGIN"]) ? substr($_SERVER["HTTP_ORIGIN"], 0, strpos($_SERVER["HTTP_ORIGIN"], '://') + 3) : 'http://'); define("REQUEST_PATH", isset($_SERVER["REQUEST_URI"]) ? str_replace(RELATIVE_PATH_BASE, '', $_SERVER["REQUEST_URI"]) : '_UNKNOWN_'); define("REQUEST_PATH_STRIP_QUERY", REQUEST_QUERY ? str_replace('?' . REQUEST_QUERY, '', REQUEST_PATH) : REQUEST_PATH); // ----------------------------------------------------------------------- // DEFINE SITE PARAMETERS // ----------------------------------------------------------------------- define("PRODUCTION", false); define("PAGE_PATH_DEFAULT", US . 'index'); define("PAGE_PATH", (REQUEST_PATH_STRIP_QUERY === US) ? PAGE_PATH_DEFAULT : REQUEST_PATH_STRIP_QUERY); 

Если вы добавите вышеуказанный код в свой собственный проект, вывод всех пользовательских констант в этот момент (что может сделать с get_defined_constants(true) должен дать результат, который выглядит примерно так:

 array ( 'LOCAL_PATH_BOOTSTRAP' => '/var/www/libraries/backend/Data/examples', 'URL_SEPARATOR' => '/', 'DS' => '/', 'PS' => ':', 'US' => '/', 'RELATIVE_PATH_ROOT' => '', 'LOCAL_PATH_ROOT' => '/var/www', 'HTTP_PATH_ROOT' => 'localhost:8888', 'RELATIVE_PATH_BASE' => '/libraries/backend/Data/examples', 'RELATIVE_PATH_APP' => '/libraries/backend/Data', 'RELATIVE_PATH_LIBRARY' => '/libraries/backend/Data/vendor', 'RELATIVE_PATH_HELPERS' => '/libraries/backend/Data/examples', 'RELATIVE_PATH_TEMPLATE' => '/libraries/backend/Data/examples/templates', 'RELATIVE_PATH_CONFIG' => '/libraries/backend/Data/examples/config', 'RELATIVE_PATH_PAGES' => '/libraries/backend/Data/examples/pages', 'RELATIVE_PATH_ASSET' => '/libraries/backend/Data/examples/assets', 'RELATIVE_PATH_ASSET_IMG' => '/libraries/backend/Data/examples/assets/img', 'RELATIVE_PATH_ASSET_CSS' => '/libraries/backend/Data/examples/assets/css', 'RELATIVE_PATH_ASSET_JS' => '/libraries/backend/Data/examples/assets/js', 'LOCAL_PATH_BASE' => '/var/www/libraries/backend/Data/examples', 'LOCAL_PATH_APP' => '/var/www/libraries/backend/Data', 'LOCAL_PATH_LIBRARY' => '/var/www/libraries/backend/Data/vendor', 'LOCAL_PATH_HELPERS' => '/var/www/libraries/backend/Data/examples', 'LOCAL_PATH_TEMPLATE' => '/var/www/libraries/backend/Data/examples/templates', 'LOCAL_PATH_CONFIG' => '/var/www/libraries/backend/Data/examples/config', 'LOCAL_PATH_PAGES' => '/var/www/libraries/backend/Data/examples/pages', 'LOCAL_PATH_ASSET' => '/var/www/libraries/backend/Data/examples/assets', 'LOCAL_PATH_ASSET_IMG' => '/var/www/libraries/backend/Data/examples/assets/img', 'LOCAL_PATH_ASSET_CSS' => '/var/www/libraries/backend/Data/examples/assets/css', 'LOCAL_PATH_ASSET_JS' => '/var/www/libraries/backend/Data/examples/assets/js', 'HTTP_PATH_BASE' => 'localhost:8888/libraries/backend/Data/examples', 'HTTP_PATH_APP' => 'localhost:8888/libraries/backend/Data', 'HTTP_PATH_LIBRARY' => false, 'HTTP_PATH_HELPERS' => false, 'HTTP_PATH_TEMPLATE' => false, 'HTTP_PATH_CONFIG' => false, 'HTTP_PATH_PAGES' => false, 'HTTP_PATH_ASSET' => 'localhost:8888/libraries/backend/Data/examples/assets', 'HTTP_PATH_ASSET_IMG' => 'localhost:8888/libraries/backend/Data/examples/assets/img', 'HTTP_PATH_ASSET_CSS' => 'localhost:8888/libraries/backend/Data/examples/assets/css', 'HTTP_PATH_ASSET_JS' => 'localhost:8888/libraries/backend/Data/examples/assets/js', 'REQUEST_QUERY' => false, 'REQUEST_METHOD' => 'GET', 'REQUEST_STATUS' => false, 'REQUEST_PROTOCOL' => 'http://', 'REQUEST_PATH' => '/', 'REQUEST_PATH_STRIP_QUERY' => '/', 'PRODUCTION' => false, 'PAGE_PATH_DEFAULT' => '/index', 'PAGE_PATH' => '/index', )