Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
894
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как включить PHP файлов, которые требуют абсолютного пути?
У меня есть структура каталогов, как показано ниже;
script.php
inc/include1.php
inc/include2.phpobjects/object1.php
objects/object2.phpsoap/soap.php
Теперь я использую эти объекты как в script.php , так и в /soap/soap.php , я мог бы переместить их, но мне нужна такая структура каталогов по определенной причине. При выполнении script.php путь включения - это inc/include.php , а при выполнении /soap/soap.php -это ../inc, абсолютные пути работают, /mnt/webdev/[project name]/inc/include1.php... , но это уродливое решение, если я когда-нибудь захочу переместить каталог в другое место.
Итак, есть ли способ использовать относительные пути или способ программно генерировать "/mnt/webdev/[project name]/" ?
Это должно сработать
$root = realpath($_SERVER["DOCUMENT_ROOT"]);
include "$root/inc/include1.php";
Edit: добавлено улучшение от aussieviking
Вы можете использовать относительные пути. Попробовать __FILE__ . Это константа PHP, которая всегда возвращает путь / имя файла скрипта, в котором она находится. Итак, в soap.php году вы могли бы сделать:
include dirname(__FILE__).'/../inc/include.php';
Полный путь и имя файла программы файл. Если используется внутри include, то возвращается имя включенного файла. Начиная с PHP 4.0.2,
__FILE__всегда содержит абсолютный путь с символьные ссылки разрешены, тогда как в более старых версии он содержал относительный путь при некоторых обстоятельствах. (источник)
Другим решением было бы установить путь включения в вашем файле httpd.conf или .htaccess.
взгляните на http://au.php.net/reserved.variables
Я думаю, что переменная, которую вы ищете, это: $_SERVER["DOCUMENT_ROOT"]
Еще один способ справиться с этим, который устраняет любую необходимость в включении вообще, - это использовать функцию автоматической загрузки. В том числе все, что нужно вашему сценарию "Just in Case" может препятствовать производительности. Если вы включаете все определения классов или интерфейсов и хотите загружать их только в случае необходимости, вы можете перегрузить функцию __autoload() своим собственным кодом, чтобы найти соответствующий файл класса и загрузить его только при вызове. Вот пример из руководства:
function __autoload($class_name) {
require_once $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
Пока вы устанавливаете переменные include_path соответствующим образом, вам никогда не нужно снова включать файл класса.
Другой вариант, связанный с Kevin's, - использовать __FILE__ , но вместо этого заменить имя файла php из него:
<?php
$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');
?>
Я уже давно этим пользуюсь. Единственная проблема заключается в том, что иногда у вас нет $_SERVER['SCRIPT_NAME'] , но иногда есть другая переменная, похожая.
Я обнаружил, что это работает очень хорошо!
function findRoot() {
return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}
Воспользуйся:
<?php
function findRoot() {
return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}
include(findRoot() . 'Post.php');
$posts = getPosts(findRoot() . 'posts_content');
include(findRoot() . 'includes/head.php');
for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
$posts[$i]->displayArticle();
}
include(findRoot() . 'includes/footer.php');
?>
Я думаю, лучший способ-это положить ваши включает в свой PHP пути. Есть различные способы сделать это в зависимости от вашей установки.
Тогда вы можете просто обратиться к
require_once 'inc1.php';
из любого файла, независимо от того, где он находится, будь то в вашем includes или в ваших веб-доступных файлах, или на любом уровне вложенных подкаталогов.
Это позволяет иметь включаемые файлы вне корневого каталога веб-сервера, что является оптимальной практикой.
напр.
site directory
html (web root)
your web-accessible files
includes
your include files
Кроме того, проверьте _ _ autoload для ленивой загрузки файлов класса
http://www.google.com/search?q=настройка+php+включить + путь
http://www.google.com/search?вопрос=__Автозагрузка
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");
Я использую эту строку кода. Он возвращается к "top" дерева сайта, а затем переходит к нужному файлу.
Например, предположим, что у меня есть это файловое дерево:
domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
domain.com/_resources/functions.php
Я могу включить файл functions.php из любого места, где я нахожусь, просто скопировав вставку
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");
Если вам нужно использовать этот код много раз, вы можете создать функцию, которая возвращает часть str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1)) . Затем просто вставьте эту функцию в первый включенный файл. У меня есть файл" initialize.php", который я включаю в самом верху каждой страницы php и который содержит эту функцию. В следующий раз, когда мне нужно будет включить файлы, я фактически просто использую функцию (с именем path_back ):
require(path_back()."/_resources/another_php_file.php");
@Flubba, позволяет ли это мне иметь папки внутри моего каталога include? плоские каталоги вклю - чают мне кошмары. поскольку весь каталог объектов должен находиться в каталоге inc.
@Flubba, позволяет ли это мне иметь папки внутри моего каталога include? плоские каталоги вклю - чают мне кошмары. поскольку весь каталог объектов должен находиться в каталоге inc.
О да, конечно. Так, например, мы используем один слой вложенных папок, как правило:
require_once('library/string.class.php')
Вы должны быть осторожны, полагаясь на include path слишком много в действительно высоких трафиковых сайтах, потому что php должен охотиться через текущий каталог, а затем все каталоги на include path, чтобы увидеть, есть ли ваш файл, и это может замедлить работу, если вы получаете молотком.
Так, например, если вы делаете MVC, вы бы поместили путь к вашему приложению directoy в поле include path, а затем указали бы ссылку на вещи в форме
'model/user.class'
'controllers/front.php'
или еще что-нибудь.
Но вообще говоря, это просто позволяет вам работать с очень короткими путями в вашем PHP, которые будут работать из любого места,и это намного легче читать, чем все эти корневые Маларки realpath document.
Преимущество этих альтернативных сценариев, предложенных другими, заключается в том, что они работают в любом месте, даже на общих ящиках; установка пути включения требует немного больше размышлений и усилий, но, как я уже упоминал, позволяет начать использовать __autoload, который просто самый крутой.
Если вы собираетесь включить определенный путь в большинство файлов вашего приложения, создайте глобальную переменную в корневой папке.
define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));
Теперь эта глобальная переменная "APPLICATION_PATH" может использоваться для включения всех файлов вместо вызова realpath() каждый раз, когда вы включаете новый файл.
EX:
include(APPLICATION_PATH ."/config/config.ini";
Надеюсь, это поможет ;-)