можно ли использовать символические ссылки как актуальные каталоги при их включении в PHP?

У меня есть папка, которая выглядит как эта сортировка

/optik |- shadow - auth.ini |- htdocs |- index.php 

и у меня есть фактический каталог

 / |- skel |- include.php 

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

Но теперь я искал, может ли в моем index.php сделать что-то вроде этого

index.php

 <? include "/optik/shadow/include.php"; // content 

и в моем include.php

 <? include "../auth.ini"; // some stuff with auth.ini 

Моя цель состоит в том, что я хочу знать, могу ли я использовать символическую ссылку, как фактический каталог в PHP. Поскольку с точки зрения символических ссылок ему нужно перейти в 1 каталог для доступа к auth.ini, но в фактическом каталоге skel этот файл не существует, и мне нужно будет указать весь путь каталога к моему auth.ini. Но поскольку пользовательские папки будут отличаться, невозможно узнать, какой путь к каталогу указать.

Как я могу заставить что-то подобное работать?

PHP должен уважать символические ссылки и следовать им, как если бы они были стандартными каталогами.

Тем не менее, вы все еще работаете с исходным каталогом, в котором находится index.php . Это означает, что include "../auth.ini"; вызов будет искать /optik (каталог выше htdocs ), а не каталог выше, в котором находится включенный файл.

Вы можете использовать комбинацию realpath () и dirname () для вычисления фактических канонических путей файлов, к которым вы хотите получить.

Учитывая ваш пример, чтобы включить optik/auth.ini из вашего optik/shadow/include.php который сам включен в index.php , вы можете использовать следующие

 // optik/htdocs/index.php // First, add the `optik` directory to the include path set_include_path(implode(PATH_SEPARATOR, array( realpath(dirname(dirname(__FILE__))), get_include_path() )); include 'shadow/include.php'; // optik/shadow/include.php include 'auth.ini'; 

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

Теперь, в отношении символических ссылок, то, что вы предлагаете, должно работать нормально. То, что вы должны иметь в виду (и это массивный PITA), состоит в том, что __FILE__ и __FILE__ будут разрешать символические ссылки. PHP не предлагает абсолютно никакого способа определить неразрешенный путь к символически связанному файлу или каталогу.

Чтобы проиллюстрировать, даже если вы включили свой файл include.php через shadow символическую ссылку, использование __FILE__ в этом файле всегда будет возвращать /skel/include.php

См. https://bugs.php.net/bug.php?id=38790