Чтение и вывод файлов вне директории сервера
Доброго времени суток. Мне необходимо выводить различные файлы, а именно 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: Заранее благодарю ответы и любые советы.
Где хранить конфигурацию php приложения?
Самый оптимальный вариант хранения настроек php приложения. В примерах для начинающих разработчиков, конфигурация приложения задаётся в начале исполняемого файла. Но для серьёзного Web приложения с множеством настроек такой вид конфигурации не удобен.
Рассмотрим на простом примере как оптимизировать хранение настроек приложения.
Создадим файл index.php со следующим содержимым:
// Настройки для подключения к базе данных $dbHost = 'localhost'; $dbUser = 'tester'; $dbPassword = 'fB8vh83gHj4'; $dbDatabase = 'my_base'; // Настройки для отправки почты через SMTP $mailerHost = 'smtp.yandex.ru'; $mailerUsername = 'sender@test.ru'; $mailerPassword = 'fdDj3gf4Hbh'; $mailerPort = '465'; $mailerEncryption = 'SSL';
Мы видим 2 группы переменных: первая для подключения к базе данных, а вторая для отправки письма по smtp протоколу. Избавимся от многочисленных переменных, объединив все значения в один многомерный ассоциативный массив.
$config = [ 'db' => [ 'host' => 'localhost', 'user' => 'tester', 'password' => 'fB8vh83gHj4', 'database' => 'my_base' ], 'mailer' => [ 'host' => 'smtp.yandex.ru', 'username' => 'sender@test.ru', 'password' => 'Vbs3Hts42sdh', 'port' => '465', 'encryption' => 'SSL' ] ];
Уже лучше. В современных Web приложениях конфигурацию принято хранить в отдельном файле / файлах. Давайте создадим файл config.php, перенесём туда наш массив и подгрузим его в index.php
Подключать будем с помощью конструкциии require, использовав её полезную особенность — возможно выполнить выражение return внутри включаемого файла. Делать это нужно следующим образом:
// Код файла config.php return [ 'db' => [ 'host' => 'localhost', 'user' => 'tester', 'password' => 'fB8vh83gHj4', 'database' => 'my_base' ], 'mailer' => [ 'host' => 'smtp.yandex.ru', 'username' => 'sender@test.ru', 'password' => 'Vbs3Hts42sdh', 'port' => '465', 'encryption' => 'SSL' ] ];
В файле конфигурации мы сделали return нашего массива. А в index.php присвоим этот массив переменной $config, используя выражение require.
// Код файла index.php $config = require 'config.php'; print_r($config);
С помощью print_r выведем результат. Вот что у нас получилось:

Если конфиг слишком большой, разбивать его на несколько файлов и собирайте с помощью require.
Хранение файла конфигурации в репозитории
При работе с git или mercurial репозиторием нужно придерживаться следующему правилу — не хранить реальные настройки приложения в репозитории. Добавлять в репозиторий только структуру файла конфигурации, так называемый скелет.
Это нужно сделать по следующим причинам:
- При хранении боевых настроек в репозитории они могут попасть не в те руки.
- Если вы работаете в команде, у каждого её члена должны быть свои индивидуальный настройки (например конфиг для подключения к базе данных на локальном компьютере).
Перейдём к практике. Создайте файл «config.sample.php». Скопируйте туда созержимое вашего файла конфигурации и удалите как минимум значения важных (в нашем случае — паролей).
// Код файла config.sample.php return [ 'db' => [ 'host' => 'localhost', 'user' => '', 'password' => '', 'database' => '' ], 'mailer' => [ 'host' => '', 'username' => '', 'password' => '', 'port' => '465', 'encryption' => 'SSL' ] ];
Добавьте файл config.sample.php в репозиторий. А боевой файл конфигурации config.php не должен туда попадать, поэтому исключите его из индексации, добавив строчку в файл «.gitignore«:
config.php
Хранение классов в отдельных файлах в PHP
До этого урока мы писали наши классы в том же файле, где и вызывали их. В реальной жизни классы обычно хранятся в отдельных файлах, причем каждый класс в своем отдельном файле. При этом существует соглашение о том, что файл с классом следует называть так же, как и сам класс. Давайте посмотрим на практике. Сделаем файл User.php с классом User :
Пусть теперь у нас есть файл index.php , в котором мы хотим воспользоваться нашим классом User . Мы не можем в этом файле просто взять и создать объект класса User — это вызовет ошибку, так как PHP не сможет найди код этого класса:
Для того, чтобы класс User был доступен в файле index.php , нужно подключить этому нему файл с нашим классом. Сделаем это с помощью команды require_once :
Сделайте несколько классов в разных файлах. Подключите ваши классы к файлу index.php .
Вопрос / ответ

Панель управления хостингом

- Управление E-mail аккаунтами
- MX-записи
- Почтовый веб-клиент: Roundcube
- Перенаправления
- Автоответчики
- Списки рассылок
- Черный список E-Mail
- Сообщения об отсутствии
- Универсальный почтовый адрес

Базы данных MySQL
- phpMyAdmin
- Создание базы данных
- Удаление базы данных
- Добавление пользователей
- Изменение пароля базы данных

SSL защита сайта
- Установка сертификата Let’s Encrypt
- Установка купленного сертификата
- Использование сертификатов сервера
- Создание самоподписанного сертификата
- Загрузка файлов на защищенный сайт

Управление DNS
- DNS записи
- Изменение параметров DNS
- Информация для новичков

FTP аккаунты
- Создание FTP аккаунта
- Изменение и удаление FTP аккаунтов
- Создание FTP аккаунта с доступом к конкретному поддомену

Поддомены
- Создание поддоменов
- Удаление поддоменов
- Статистика поддоменов
- Лог использования и лог ошибок
- Создание FTP аккаунта с доступом к конкретному поддомену

Резервные копии
- Создание резервной копии
- Хранение резервных копий
- Выбор того, что необходимо сохранить в резервной копии
- Восстановление из резервной копии

Менеджер файлов
- Навигация
- Загрузка файлов
- Создание новых папок и файлов
- Копирование и перемещение файлов
- Редактирование файлов
- Переименование файлов
- Изменение прав доступа к файлам
- Удаление файлов и папок

Загрузка файлов сайта на сервер
- Структура директорий
- Загрузка через FTP
- Загрузка с помощью файлового менеджера
- Основной файл сайта (index)

Статистика сайта
- Дисковое пространство
- Системные логи
- Статистика Webalizer
- Информация об аккаунте

Выполнение скриптов
- Программные пути
- PHP скрипты
- CGI скрипты
- Установленные модули Perl
- Общие сведения о правах доступа

С чего начать
- Вход в панель управления
- Выход из панели управления

Разное
- Дополнительные домены
- Перенаправление сайта
- Доменные указатели
- Cron задачи
- Страницы ошибок
- Запароленные папки
- Mime-типы
- Обработчики Apache
- Ключи входа

Технические вопросы

SSH, FTP, SFTP
- Подключение по SSH
- Подключение по FTP
- Подключение по SFTP
- Установка composer

Базы данных MySQL
- Хост для подключения к MySQL
- Подключение к MySQL извне
- Подключение на внешний сервер Mysql
- Логин/пароль для входа в PhpMyAdmin

Почта
- Настройка отправки писем с сайта
- Пересылка почты
- Адрес авторизации в почте
- Сайт рассылает спам
- Лимит на отправку писем
- Статистика отправки писем
- Настройка почтового клиента
- Настройка заголовка From

Memcached
- Как заказать Memcached сервер
- Использование Memcached
- Memcached и WordPress
- Memcached и Joomla
- Memcached и Bitrix

Почтовый хостинг

SSL-сертификаты
- Подтверждение сертификата

Домены
- NS сервера

Оплата услуг, тарифы
- Изменение тарифного плана

CMS хостинг
- WordPress хостинг
- 1С хостинг

Партнерская программа

Бухгалтерия, документы
- Заключение бумажного договора
- Акты выполненных работ
- Отказ от услуг

БелГИЭ
- Регистрация сайта в БелГИЭ
- Изменение данных о сайте
- Удаление сайта из БелГИЭ
- Регистрация субдоменов

Другие вопросы
- Чем открыть файл PDF
Основной файл сайта (index)
index.html — файл по умолчанию для любой веб-папки. Это означает, что когда посетитель переходит по адресу http://site.by, в действительности сервер открывает файл http://site.by/index.html. Это актуально для любой общедоступной папки, включая поддомены.
При загрузке основного файла веб-сайта, не забудьте назвать его index.html. Могут использоваться и другие расширения для главного файла index (index.php, index.shtml и др.), в зависимости от того какой язык используется.