Чтение и вывод файлов вне директории сервера

Доброго времени суток.

Мне необходимо выводить различные файлы, а именно css, js, xml, png, jpg и все другие, которые могут располагаться и использоваться на сервере.

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

Файлы контента при этом расположены в папке Content, а именно Content\Theme\Default, либо же и вовсе в другой папке, которая находиться на уровень ниже папки public.

Структура проекта приблизительно следующая:

web/
... public
... ... index.php
... Content
... ... Theme
... ... ... Default
... ... ... ... image.png
... ... ... ... styles.css
... ... ... ... main.js

Какие есть варианты "прочитать" и "скормить" браузеру файлы, которые лежат вне папки public?

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

Но возникают другие проблемы, к примеру проблемы с памятью PHP, ведь ему придется постоянно читать, запоминать и отдавать множество данных файла. Пара мегабайт памяти будет испорчена, ко всему этому время ответа от сервера значительно увеличивается - от пары картинок переданных с помощью readfile($png) ответ сервера увеличился с 50mc до 2сек.

Возможно существуют различные библиотеки для PHP, которые подойдут для моих целей, либо же есть куда более простые способы подготовки файлов для браузера вне папки public?

P.S: Заранее благодарю ответы и любые советы.


Ответы (2 шт):

Автор решения: Alex Khonko
  1. делаете ссылку(симлинк) на вашу директорию в директории public, получится примерно так: ln -s /yourDirPath /publicDirPath
  2. осознаете, что точка входа - ваша же директория public, и строите пути к файлам исходя из этого
→ Ссылка
Автор решения: Alex Khonko

давайте более детально опишем ещё этот момент:

на самом деле меня до сих пор интересуют малозатратные по ресурсам способы доступа к определенным файлам вне папки сервера, но тем не менее - ссылка на папку на данный момент меня устраивает

итак, есть общепринятая практика хранить все ассеты(js,css) в директориях типа public (там, где в 99.9% проектов лежит единая точка входа index.php)

делается примерно следующее: вы свои файлы грузите в папки как хотите, разные фреймворки зачастую копируют свои ассеты в директорию assets, тоесть, получится public/assets

такой подход обеспечивает следующие преимущества:

  • все ассеты лежат в доступной(и подходящей) для этого директории
  • не надо шаманить с доступом, хедерами типа вашего и т.п
  • если вам надо посмотреть ассет сторонней 3й библиотеки, она будет располагатъся(согласно правил выше в public/assets/{3dlibname}/js/file.js) например
  • так же, предыдущее правило отлично работает, когда надо отладить какие-то сторонние скрипты, и не трогать при этом оригинальные

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

→ Ссылка