Как Создать Файл Phpinfo и Проверить Информацию о PHP. Отдаем файлы эффективно с помощью PHP Анналы info php

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

1. Используем readfile()

Метод хорош тем, что работает с коробки. Надо только написать свою функцию отправки файла (немного измененный пример из официальной документации):

Function file_force_download($file) { if (file_exists($file)) { // сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт // если этого не сделать файл будет читаться в память полностью! if (ob_get_level()) { ob_end_clean(); } // заставляем браузер показать окно сохранения файла header("Content-Description: File Transfer"); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=" . basename($file)); header("Content-Transfer-Encoding: binary"); header("Expires: 0"); header("Cache-Control: must-revalidate"); header("Pragma: public"); header("Content-Length: " . filesize($file)); // читаем файл и отправляем его пользователю readfile($file); exit; } }
Таким способом можно отправлять даже большие файлы, так как PHP будет читать файл и сразу отдавать его пользователю по частям. В документации четко сказано, что readfile() не должен создавать проблемы с памятью.

Особенности:

  • Файл читается в внутренний буфер функции readfile(), размер которого составляет 8кБ (спасибо 2fast4rabbit)

2. Читаем и отправляем файл вручную

Метод использует тот же Drupal при отправке файлов из приватной файловой системы (файлы недоступны напрямую по ссылкам):

Function file_force_download($file) { if (file_exists($file)) { // сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт // если этого не сделать файл будет читаться в память полностью! if (ob_get_level()) { ob_end_clean(); } // заставляем браузер показать окно сохранения файла header("Content-Description: File Transfer"); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=" . basename($file)); header("Content-Transfer-Encoding: binary"); header("Expires: 0"); header("Cache-Control: must-revalidate"); header("Pragma: public"); header("Content-Length: " . filesize($file)); // читаем файл и отправляем его пользователю if ($fd = fopen($file, "rb")) { while (!feof($fd)) { print fread($fd, 1024); } fclose($fd); } exit; } }
Особенности:

  • Скрипт ждет пока весь файл будет прочитан и отдан пользователю.
  • Позволяет сэкономить память сервера

3. Используем модуль веб сервера

3a. Apache
Модуль XSendFile позволяет с помощью специального заголовка передать отправку файла самому Apache. Существуют версии по Unix и Windows, под версии 2.0.*, 2.2.* и 2.4.*

В настройках хоста нужно включить перехват заголовка с помощью директивы:
XSendFile On
Также можно указать белый список директорий, файлы в которых могут быть обработаны. Важно: если у Вас сервер на базе Windows путь должен включать букву диска в верхнем регистре.

Описание возможных опций на сайте разработчика: https://tn123.org/mod_xsendfile/

Пример отправки файла:

Function file_force_download($file) { if (file_exists($file)) { header("X-SendFile: " . realpath($file)); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=" . basename($file)); exit; } }

3b. Nginx
Nginx умеет отправлять файлы из коробки через специальный заголовок.

Для корректной работы нужно запретить доступ к папку напрямую через конфигурационный файл:
location /protected/ { internal; root /some/path; }
Пример отправки файла (файл должен находиться в директории /some/path/protected):

Function file_force_download($file) { if (file_exists($file)) { header("X-Accel-Redirect: " . $file); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=" . basename($file)); exit; } }
Больше информации на странице официальной документации

Особенности:

  • Скрипт завершается сразу после выполнения всех инструкций
  • Физически файл отправляется модулем самого веб сервера, а не PHP
  • Минимальное потребление памяти и ресурсов сервера
  • Максимальное быстродействие

Update: Хабраюзер ilyaplot дает дельный совет, что лучше слать не application/octet-stream , а реальный mime type файла. Например, это позволит браузеру подставить нужные программы в диалог сохранение файла.

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

Функция phpinfo используется используется при проверке системы, так как каждый сервер в сети имеет свои уникальные настройки. Если скрипт нормально работал на одном сервере, и перестал работать на другом, то стоит проверить настройки конфигурации нового вервера при помощи данной функции.

Самый простой способ использовать данную функцию - создать отдельный файл:

Он покажет на экран примерно такую страницу:

Рисунок 1. Работа функции phpinfo().

И информации там ещё примерно на четыре экрана вниз.

phpinfo - функция, которая выводит полную информацию о текущей конфигурации PHP.

Функция PHP phpinfo
Имя (константа) Значение Описание
INFO_GENERAL 1 Общая информация о конфигурации, расположение php.ini, информация о Web-сервере, системе и др.
INFO_CREDITS 2 Информация о разработчики PHP. Её также можно получить использую функцию phpcredits() .
INFO_CONFIGURATION 4 Информация о текущих значениях основных и локальных PHP директив. Их также можно получить используя функцию ini_get() .
INFO_MODULES 8 Загруженные модули и их настройки. См. также get_loaded_extensions() .
INFO_ENVIRONMENT 16 Информация о переменных окружения, которая также доступна в $_ENV .
INFO_VARIABLES 32 Выводит все предопределенные переменные из EGPCS (Environment, GET, POST, Cookie, Server).
INFO_LICENSE 64 Информация о лицензии PHP.
INFO_ALL -1 Выводит все приведенное выше.

Вы видите, что функция phpinfo содержит EGPCS-данные, поэтому она может использоваться для отладки.

Значения являются битовыми, поэтому используются числа 2, 4, 8, 16, 32 и 64.

Примеры использования phpinfo() с аргументами:

Информация, предоставляемая функцией phpinfo() может быть использована злоумышленниками для приченения вреда вашему сайту. Поэтому файлы с этой функцией нужно обязательно удалить.

В 2010 году известный российский ресурс для программистов Хабрахабр опубликовал статью, в которой приводились данные весьма интересного исследования. Оказалось что 4.69% российских сайтов содержат файл phpinfo.php с функцией phpinfo . На то время рунет состоял 36804 сайтов, 1725 имели потенциальную уязвимость.

Если вам нужно просто узнать какая версия PHP на сервере, можно ипользовать функцию phpversion .

(PHP 3, PHP 4, PHP 5)

phpinfo - выводит много информации о PHP.

Описание

int phpinfo ()

Выводит большое количество информации о текущем статусе PHP. Сюда входит информация об опциях компиляции PHP и о расширениях, версии PHP, информация сервера и окружения (если скомпилирован как модуль), окружение PHP, версия ОС, пути, master и локальные переменные опций конфигурации, шапки HTTP и PHP License. Поскольку каждая система настроена по-своему, phpinfo() обычно используется для проверки установок конфигурации и доступности предопределённых переменных в данной системе.Также phpinfo() является важной отладочной утилитой, так как содержит все данные EGPCS (Environment, GET, POST, Cookie, Server). Вывод может быть специализирован путём передачи одной или более следующих константных битовых значений, суммированных в необязательном параметре what . Можно также комбинировать соответствующие константны или битовые значения операцией .

Таблица 1. Опции phpinfo()
Имя (константа)ЗначениеОписание INFO_GENERAL1Строка конфигурации, размещение php.ini , дата построения/build, Web-сервер, система и т.д.INFO_CREDITS2КредитыPHP 4.См. также phpcredits() .INFO_CONFIGURATION4Текущие Local и Master значения php-директив.См. также ini_get() .INFO_MODULES8Загруженные модули и их соответствующие настройки.INFO_ENVIRONMENT16Environment Variable информация, доступная также в $_ENV .INFO_VARIABLES32Показывает все предопределённые переменные из EGPCS (Environment, GET, POST, Cookie, Server).INFO_LICENSE64ИнформацияPHP License.См. также license faq .INFO_ALL-1Всё выше указанное.Это значение по умолчанию.

Примечание: части отображаемой информации отключаются, когда установка конфигурации expose_php имеет значение off . Сюда входят PHP и Zend-логосы и кредиты.См. также