xmlhttprequest — выполнение вызываемого сценария php, как если бы он находился в том же рабочем каталоге, что и вызывающий сценарий.

Есть ли хитрость в запуске php-скрипта, как если бы он находился в другом каталоге, чем тот, в котором он сейчас находится?

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

контекст

структура файла:

| function/
|         function.php
|
| fragment/
|         import.php
|         export.php
|
| index.php

Все файлы php требуют function.php

<?php require_once 'function/function.php'; ?>

включая фрагменты внутри index.php работает просто отлично:

<?php include 'fragment/import.php'; ?>
<?php include 'fragment/export.php'; ?>

все они с радостью находят function / function.php благодаря выполнению index.php в базовом рабочем каталоге.

Тем не мение,

если я получу фрагмент / import.php, вызвав его из index.php с помощью сценария XMLHttpRequest, он больше не сможет найти function.php, поскольку текущий рабочий каталог теперь изменился на фрагмент / и ищет фрагмент / function / function.php

Я сейчас пользуюсь chdir() внутри каждого фрагмента / файла, чтобы вернуться обратно в базовый каталог. Но мое чувство ОКР покалывает.

// plus I have to hardcode the target directory
chdir( '/www/code/laboratory/' );

// as this makes bad things happen for the include in index.php
chdir( dirname( __dir__ );
// same as
include '../function/function.php';

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

Это вызывает столько хлопот, что я, должно быть, делаю что-то не так. Я попытался возиться с файлом .htaccess, но не очень далеко. Похоже, что RewriteRule в любом случае работает только с http-запросами, но не включает php, поэтому я как бы отказался от этой идеи. С использованием <база> тег из html, увы, тоже не сработал, так как фрагменты не являются полными HTML-документами и не имеют заголовка. Возможно, есть способ установить <база> используя setRequestHeader () в XMLHttpRequest, но я не смог его найти.

TLDR;

Может быть хитрость в том, чтобы сделать скрипты внутри фрагментов / думать, что они находятся в том же рабочем каталоге, что и index.php? В качестве альтернативы, можно ли что-то сделать с заголовком XMLHttpRequest, чтобы скрипт знал, в каком каталоге я хочу его запустить?

Или я должен думать в логике php, а не в семантике, и разделение моего кода — действительно плохая идея?

Любые советы и рекомендации приветствуются. Спасибо за ваше время.

0

Решение

Вы пытались добавить в включить путь где PHP ищет включает?

$path = '/www/code/laboratory/';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);

Подробнее об этом здесь

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector