могу ли я изменить значение $ _SERVER ?

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

Теперь все включенные файлы не найдены, поскольку они ссылаются через

 include($_SERVER['DOCUMENT_ROOT'].'/Includes/Connect.php'); 

И так далее.

Если вы не настроите совершенно новую учетную запись хостинга только для целей тестирования для этого конкретного клиента, могу ли я изменить значение $_SERVER['DOCUMENT_ROOT'] каким-то образом, чтобы включить вложенную папку iftc , в которой находятся файлы?

Мое предпочтительное решение

Есть несколько способов сделать это, но лучше всего просто найти и заменить все использование $_SERVER['DOCUMENT_ROOT'] простым вызовом функции.

Таким образом, ваш пример станет следующим:

 include(get_my_path() . '/Includes/Connect.php'); 

Определите текущий режим работы:

 define('RUN_MODE_PRODUCTION', true); // in live mode define('RUN_MODE_PRODUCTION', false); // debug mode 

Теперь для определения функции:

 function get_my_path() { if(RUN_MODE_PRODUCTION === true) { return '/my/path/'; } return '/my/other/path'; } 

Переопределение фактических значений в $_SERVER – плохая идея. Если кто-то еще позже приступит к работе над проектом, не будет ясно, что происходит.

Это очень упрощенная версия начальной загрузки среды, которую я использую в производстве каждый день.

Где вы не можете этого сделать

  • Семейство функций Apache SetEnv
  • mod_rewrite RewriteRule ^$ /home \[E=VAR:VAL\]

Другой способ, которым вы можете это сделать

Когда я настраивал свою массовую виртуальную среду для разработки, я столкнулся с этой проблемой. См. http://blog.simonholywell.com/post/1516566788/team-development-server#virtual_document_root

Поскольку я не мог переопределить $_SERVER['DOCUMENT_ROOT'] используя любой из вышеперечисленных методов, я должен был сделать это в auto_prepend_file .

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

Вы не можете изменить переменную среды DOCUMENT_ROOT до PHP. (Если вы не играете с скриптом CGI-оболочки).
У Apache есть директива SetEnv , но это не будет работать для DOCUMENT_ROOT (специальное требование CGI env). Может дать это альтернативное имя, но DOC_ROOT2 и т. Д.

Но вы можете глобально переопределить эту переменную в PHP, используя параметр php.ini auto_prepend_file , который также можно установить с помощью .htaccess:

 php_value auto_prepend_file ./override_docroot.php 

И этот скрипт затем «глобально» адаптирует вашу среду:

 <?php $_SERVER["DOCUMENT_ROOT"] = "..."; 

Это настроено через веб-сервер, а не через PHP. Например, в Apache это директива DocumentRoot .

Почему бы не использовать относительные пути вместо этого? Вы можете быть полностью независимы от того, где находится приложение, если вы используете пути, такие как ../Includes/Connect.php .