Материалы по программированию
« Содержание »
Установка PHP7 на Windows

В статье описывается ручная portable установка языка PHP 7.1, 7.2 и 7.^ на Windows из zip архива. Показаны все основные шаги инсталляции последней версии PHP, начиная от выбора необходимой сборки дистрибутива PHP и его развертывания в Windows, до настройки самого языка и WEB сервера Apache 2.4 для работы с PHP скриптами для обработки http запросов. Описана структура и назначение основных файлов дистрибутива PHP и приведены основные команды для работы с PHP из командой строки. Продемонстрировано использование встроенного в PHP HTTP WEB сервера. Статья содержит скринкаст, где, все описанное в статье, выполнено на примерах в Windows7.

 

PHP7

Язык программирования PHP сейчас является наиболее распространенным языком для WEB приложений. PHP сочетает в себе большой накопленный опыт его использования и надежность, что позволяет реализовывать на нем не только малые и средние проекты, но и большие. Нужно вспомнить, что изначально, Facebook и ВКонтакте были написаны на PHP, и только потом были переведены на собственные компилируемые языки, основой для которых послужил PHP. Язык PHP не стоит на месте и постоянно развивается, но это делается разумно и осторожно, что обеспечивает пользователям легкий переход на новые версии языка, получая при этом улучшение в скорости и надежности. Основные действия по установке PHP7, описанные в этой статье, подойдут как для PHP 7.1.0, так и для PHP 7.2.0 и любых версий PHP 7.^. В примерах статьи используются версия PHP 7.1.0 (01.12.2016). Более подробно о нововведениях языка PHP7 рекомендую посмотреть в докладе Дмитрия Стогова (Zend Technologies) - "Развитие ветки PHP-7". Здесь приведу из доклада Дмитрия только факты о том, что, по результатам тестов, PHP сейчас является самым быстрым из интерпретируемых языков и дальнейшее направление развития - это приближение по скорости к языкам C.

Перейти к скринкасту "УСТАНОВКА PHP7 на Windows"

 

PHP на Windows

Несмотря на то, что в большинстве случаев PHP используют на Linux операционных системах, он с таким же успехом может использоваться и на Windows, как в сочетании с Apache, так и с Windows IIS WEB серверами. Например, если вы работаете на Windows, но вам необходимо выполнять запуск и тестирование PHP скриптов и CMS на основе PHP, то вы можете самостоятельно установить и вручную настроить все необходимые компоненты, включая и PHP. Такой подход является хорошей альтернативой против использования уже готовых сборок Win+AMP, так как вы получаете полнофункциональные версии компонентов и приобретаете реальный опыт по настройке PHP и Apache. В интернете присутствуют различные инсталляторы PHP, но не один из них не одобрен PHP.net. На официальном сайте PHP (php.net) рекомендуют выполнять именно ручную инсталляцию PHP на Windows из оригинального дистрибутива PHP в zip архиве, так как это является безопасным в отношении заражения системы троянами и вирусами. Ручная инсталляция PHP на Windows позволяет хорошо изучить структуру дистрибутива PHP и назначение его основных файлов и настроек, что будет несомненным плюсом в дальнейшем, при развертывании LAMP сервера на Linux и для выполнения WEB разработки на PHP.

 

 

ШАГ 1 скачать дистрибутив PHP для Windows

Скачивать дистрибутив PHP для Windows нужно с официального сайта PHP, где на странице "PHP For Windows" выложены сборки PHP для Windows в виде zip архива.

В примерах этой статьи PHP будет настраиваться в Windows7 на работу с WEB сервером Apache через его собственный, специализированный SAPI модуль вызова PHP, поэтому мною будет использован следующий дистрибутив PHP 7.1.0:

VC14 x64 Thread Safe (2016-Dec-02 07:19:53)
Zip [23.28MB] http://windows.php.net/downloads/releases/php-7.1.0-Win32-VC14-x64.zip
sha1: 48b99e4aae06b6ca4933689277bd3ff836398eb8

файл дистрибутива имеет название: php-7.1.0-Win32-VC14-x64.zip

Данная сборка выполнена в Visual Studio 2015 с пакетом VC14 - Visual C++ 2015 x64 Redistributable Package, который должен быть установлен в вашей системе. Компоненты VC14, обычно уже имеются в системе, но если они не установлены, то скачать VC14 для инсталляции можно на официальном сайте Microsoft по ссылке: Распространяемый компонент Microsoft Visual C++ 2015 Update 3 RC.

Эта сборка является Thread Safe (потоково безопасной) версией и обеспечивает корректное функционирование PHP при использовании его из нескольких потоков одновременно, что как раз и нужно при работе PHP через SAPI модуль Apache на Windows. Это связано с тем, что, в зависимости от подхода и операционной системы, параллельная обработка может быть реализована через параллельные процессы или через параллельные потоки. Эти подходы имеют отличия и накладывают некоторые требования к исполнению как в PHP, так и в других программах. Так, например, потоки имеют общее адресное пространство, процессы же имеют разное. Для процессов вообще безразлично, что внутри каждого из них происходит т.к. они не влияют друг на друга. Поэтому, там, где PHP может исполняться в несколько параллельных потоков, необходимо использовать версию Thread Safe для безопасного разделения переменных окружения, адресного пространства и т.п. Если же PHP будет исполняться только внутри параллельных процессов, то можно использовать Non Thread Safe версию PHP, хотя это и не обязательно.

О том, какой вариант PHP использовать, Thread Safe или Non Thread Safe, так же написано на странице загрузки PHP в секции под заголовком: Which version do I choose?. Там сказано, что:

  • если вы планируете использовать PHP на Windows через встроенный SAPI модуль WEB сервера Apache (или другого WEB сервера), то необходимо использовать Thread Safe версию PHP, т.к. SAPI модуля WEB серверов являются много поточными и PHP может выполняться в нескольких параллельных потоках;
  • если вы планируете использовать PHP только как внешнее CGI или CLI приложение через FastCGI/CGI или CLI (в них PHP запускается только как параллельный процесс), то можно выбрать и Non Thread Safe версию PHP.

Эта сборка содержит в своем составе SAPI модуль Apache, который взят от сборки Apache от Apache Lounge http://www.apachelounge.com/. Данная сборка PHP будет корректно работать как с Apache от Apache Lounge, так и с сборкой Apache 2.4.23 x64 от Apache Haus, инсталляция которой на Windows была описана мною в статье и скринкасте: "Установка Apache на Windows" Andew.ru/pages/page/install-apache-on-windows.php.

 

В PHP 7.1.0, все mcrypt_ * функции будут поднимать E_DEPRECATED уведомление - это пока предупреждение, что функция устарела (все работает при этом), а в PHP 7.2 mcrypt расширение БУДЕТ УДАЛЕНО, соответственно и код php не будет работать. Поэтому нужно переходить на openssl php расширение, которое предоставляет все тоже, но одобрено к использованию и работает лучше.

 

 

ШАГ 2 размещение PHP в Windows

Скачанный дистрибутив PHP необходимо распаковать с сохранением его структуры в выбранный вами каталог, который может располагаться в любом месте файловой системы (не обязательно в системных каталогах Windows). Путь до папки, где будет размешаться PHP, желательно выбирать как можно короче, без пробелов и других недопустимых символов. Лучше использовать только EN буквы и цифры. Например: "C:\PHP".

В статьях, связанных с темой установки PHP на Windows: "Установка Apache на Windows""Portable MySQL 5.7 в Windows" и "Установка Gulp в WEB проект сайта", мною, во всех примерах, используется для разрешения дистрибутивов Apache, MySQL и Gulp корневой каталог "Z:\WebDevelopment". Поэтому, в продолжении этих тем, для примеров этой статьи, мною будет использован для инсталяции PHP каталог вида: "Z:\WebDevelopment\PHP". Таким образом, эта статья дополнит предыдущие и объединит их вокруг темы по самостоятельной организации собственного WinAMP сервера на Windows.

Для удобства работы с PHP через командную строку нужно добавить в конец системной переменной PATH, через точку с запятой, путь к директории с инсталляцией PHP, например, ;Z:\WebDevelopment\PHP. Это можно сделать в настройках Windows: Computer > Properties > Advanced > System Properties > System Variables, где выбрать редактирование системной переменной Path. После этого PHP станет доступен из командной строки в любом месте файловой системы.

 

Структура файлов и каталогов дистрибутива PHP7 для Windows

PHP 7 package structure с комментариями к файлам:

\php
   |
   +--dev
   |  |
   |  |-php7ts.lib
   |
   +--ext                 -- extension DLLs for PHP
   |  |
   |  |-php_bz2.dll
   |  |
   |  |-php_cpdf.dll
   |  |
   |  |-..
   |
   +--extras
   |  |
   |  +--mibs             -- support files for SNMP
   |  |
   |  +--openssl          -- support files for Openssl
   |  |
   |  +--pdf-related      -- support files for PDF
   |  |
   |  |-mime.magic
   |
   +--pear                -- initial copy of PEAR
   |
   |
   |-go-pear.bat          -- PEAR setup script для подключения PEAR репозитория PHP
   |
   |-fdftk.dll
   |
   |-..
   |-deplister.exe        -- CLI утилита для определения зависимостей разных модулей, которые можно подключить в PHP
   |-php-cgi.exe          -- CGI/FastCGI исполняемый файл для вызова PHP через FastCGI или CGI
   |-phpdbg.exe           -- интерактивный PHP debugger
   |-php-win.exe          -- исполняемый файл для вызова PHP из оконных приложений без использования командной строки
   |
   |-php.exe              -- CLI исполняемый файл для вызова PHP только из командной строки
   |
   |-..
   |
   |-php.ini-development  -- development php.ini settings - заготовка для php.ini
   |
   |-php.ini-production   -- recommended php.ini settings for production - заготовка для php.ini
   |
   |-php5activescript.dll
   |
   |-php7apache2_4.dll     -- Apache 2.4.x module SAPI - модуль Apache для работы с PHP
   |
   |-..
   |
   |-php5ts.dll           -- core PHP DLL
   |
   |-php7ts.dll  -- все CGI, CLI бинарники и модули веб-сервера требуют обязательного наличия этой библиотеки т.к. используют ее

 

Общие замечания по установке PHP

Перед началом установки, нужно понимать для каких целей и задач может быть использован PHP.

Выделяют три направления использования PHP

  • Веб-сайты и веб-приложения, где PHP используется как язык сценариев на стороне сервера для генерации динамического web содержимого;
  • Командная строка сценариев, где PHP вызывается через командную строку (CLI) и выполняет различные сценарии, как на локальном компьютере, так и на сервере;
  • Desktop (GUI) приложения, где PHP используется для создания оконных приложений.

Не смотря на то, что наибольшее распространение имеет первый вариант использования PHP для веб приложений, PHP может с успехом применяться и для написания сценариев командной строки. Например, можно написать сценарии для генерации изображений, обработки текстовые файлов, системные манипуляции и т.п. Также, в PHP можно создавать приложения с графическим интерфейсом с помощью PHP-GTK расширения.

 

Подключение PHP к WEB серверу

Для первого, наиболее распространенного варианта использования PHP, как языка программирования web приложений, необходимо организовать связь между PHP и WEB сервером. PHP имеет два способа подключения к WEB серверу:

PHP как SAPI или ISAPI модуль WEB сервера

В качестве собственного PHP модуля SAPI (Server Application Programming Interface) или ISAPI (Internet Server Application Programming Interface) для различных WEB серверов, которые представляет собой интерфейс прикладного программирования (API), расширявший возможности веб-сервера в части взаимодействия с PHP. Это подход реализуется через прямой SAPI/ISAPI модуль самого WEB сервера, который поставляется с PHP или с WEB сервером и реализует взаимодействие между веб-сервером и языком программирования PHP напрямую. Использование прямого модуля для конкретного web сервера является самым эффективным и высокопроизводительным (при большом количестве запросов) способом взаимодействия между web сервером и PHP. Такие SAPI модуля имеются для WEB серверов: Apache, Microsoft Internet Information Server, Netscape и IPlanet. Многие другие серверы имеют поддержку ISAPI, например, OmniHTTPd. Для Apache работа с PHP через SAPI модуль, из-за длительного их совместного сотрудничества, является самым распространенным и эффективным решением. В данную сборку PHP php-7.1.0-Win32-VC14-x64 для Windows уже включен модуль SAPI для Apache с названием файла php7apache2_4.dll. Несмотря на удобство и скорость работы такой подход имеет и свои недостатки. Например, запуск php скриптов от имени web сервера, а не от имени пользователя владельца файла. Но для Apache в Ubuntu этот недостаток можно устранить использованием пакета libapache2-mpm-itk (multiuser module for Apache). Это дополнительный модуль для Apache, который есть в universe репозиториях Ubuntu и он позволяет Apache запускать PHP скрипты от имени владельца файла.

PHP как внешнее FastCGI/CGI приложение

FastCGI (Fast Common Gateway Interface) и CGI (Common Gateway Interface - общий интерфейс шлюза) интерфейсы - это второй вариант взаимодействия между WEB сервером и PHP. FastCGI это клиент серверный протокол взаимодействия веб сервера и приложения, который является продолжением развития технологии CGI. Этот протокол предоставляет общий и универсальный способ взаимодействия PHP с любым WEB сервером, и в новой версии не уступает по скорости прямому модулю SAPI. Для некоторых серверов, например, IIS, FastCGI значительно более стабилен и может быть быстрее, чем модуль ISAPI. Если PHP не имеет модуль поддержки для вашего веб сервера, то вы всегда можете использовать PHP через FastCGI или CGI интерфейсы. Для использования PHP с web сервером через FastCGI/CGI понадобиться настроить веб сервер на обработку запросов через файл-обработчик php-cgi.exe, который входит и в дистрибутив PHP для Windows. Использование FastCGI имеет много преимуществ и является более экономичным и безопасным подходом в отношении прав доступа и возникновения ошибок в работе скриптов. Единственным, незначительным и относительным недостатком для FastCGI является то, что он может уступать в скорости, при большом количестве запросов, по сравнению с SAPI модулем Apache. Для других же web серверов FastCGI может быть даже более лучшим выбором.

 

 

ШАГ 3 создание php.ini

Следующий шаг, после развертывания дистрибутива PHP, это создание файла (или файлов) конфигурации PHP, который для Windows, в большинстве случаев, имеет название php.ini и, в основном, располагается в каталоге с инстанцией PHP. Но возможны так же и другие варианты названия и расположения (см. ниже). Файл php.ini является основным конфигом PHP в Windows и, в зависимости от способа использования PHP, читается интерпретатором PHP, или каждый раз при старте/вызове PHP, или только одни раз при старте web сервера.

  • Если PHP вызывается и работает как SAPI модуль WEB сервера, то файл php.ini читается только один раз, когда WEB сервер стартует. И пока WEB сервер работает, файл php.ini больше не перечитывается. Поэтому, если PHP у вас работает как модуль сервера, не забывайте пере запускать web сервер после внесения изменений в php.ini;
  • Если же PHP работает как внешнее CGI или CLI приложение через FastCGI/CGI или CLI, то файл php.ini перечитывается заново при каждом вызове и обращению к PHP.

 

php.ini

При инсталяции PHP на Windows, в основном, используют для конфигурации PHP один конфиг файл с именем php.ini, который располагают в каталоге установки PHP. Однако, нужно так же понимать, что одна инсталляция PHP может одновременно использоваться и как SAPI модуль веб сервера и как внешнее FastCGI/CGI или CLI приложение. Для таких случаев, многоцелевого использования PHP, можно задать разные файлы конфигурации PHP как по имени (php.ini или php-SAPI.ini), расположению, так и по их количеству. Например, для SAPI модуля веб сервера, можно сделать отдельный php.ini файл (название файла может быть и вида php-SAPI.ini, см. ниже) и разместить его в каталоге web сервера или сайта, указав PHPIniDir директиву для Apache. Тогда, при вызове PHP через SAPI модуль Apache, будет использоваться этот конфиг, а при вызове PHP через FastCGI/CGI или CLI будет использоваться другой конфиг, например, php.ini из каталога инсталяции PHP.

 

php.ini и php-SAPI.ini

Имя файла конфигурации php.ini используется в PHP на Windows по умолчанию. Именно конфиг с именем php.ini PHP будет искать, если отсутствуют другие варианты. Однако, можно использовать другое имя файла конфигурации PHP, задав его в формате php-SAPI.ini, где часть SAPI это имя вызывающего PHP модуля или интерфейса. Это имя модуля/интерфейса можно узнать при помощи PHP функции php_sapi_name(), которая вернет строку с именем вызвавшего PHP модуля или интерфейса. Могут быть значения вида: apache, apache2filter, apache2handler, cgi-fcgi, cli, cli-server и т.п. Соответственно, узнав имя вызывающего PHP модуля или интерфейса для конкретного варианта использования PHP, вы можете создать для него отдельный конфиг, например, php-cli.ini, php-apache.ini. Тогда, при вызове PHP через этот модуль или интерфейс, PHP будет сначала использовать соответствующий ему конфиг, если он существует. Если такого файла нет в указанных искомых расположениях, то будет использоваться php.ini имя файла конфига. Иными словами, PHP сначала всегда пытается найти и использовать конфиг с именем, соответствующий вызывающему модулю или интерфейсу, и только при отсутствии такового, использует конфиг с именем php.ini.

 

.user.ini

С версии PHP 5.3.0 добавлена поддержка PHP INI файлов .user.ini уровня каталога, по аналогии с .htaccess конфигами в Apache. Эти файлы ищутся и применяются только для CGI/FastCGI вызова PHP, когда, помимо основного php.ini файла, PHP дополнительно ищет INI файлы в каждой директории, начиная с директории вызываемого PHP файла и далее по каталогам в верх до корневой директории из $_SERVER['DOCUMENT_ROOT']. Если запрошенный PHP файл находится вне корневой директории, то сканируется только директория этого запрошенного файла. В таких, .user.ini PHP конфигах, уровня директории, могут применяться только PHP директивы режимов PHP_INI_PERDIR и PHP_INI_USER (см. описание режимов ниже).

PHP директивы user_ini.filename и user_ini.cache_ttl настраивают использование этих конфигов уровня директории:

  • user_ini.filename - задет имя файла, который PHP будет искать в каждой директории. Если значение директивы пустая строка, то поиск файла не производится. По умолчанию значение user_ini.filename = ".user.ini". Если нужно, чтобы PHP не выполнял поиск INI файла в директориях, то установите эту директиву как user_ini.filename =
  • user_ini.cache_ttl - задет частоту обновления пользовательского INI файла каталога. По умолчанию, директива имеет значение user_ini.cache_ttl = 300, что соответствует 5 минутам.

 

Последовательность поиска конфига PHP в локализациях

Выше был рассмотрен принцип выбора имени конфига PHP. Здесь будет уже рассмотрен порядок и механизм того, как PHP определяет месторасположение конфигурационного файла для разных вариантов вызова PHP.

PHP на Windows ищет файл(файлы) php.ini и php-SAPI.ini по порядку в следующих локализация:

  • если PHP вызван как SAPI модуль web сервера, то путь к файлу php-SAPI.ini/php.ini будет браться из значения соответствующей директивы конфига web сервера. Для Apache это директива PHPIniDir, в которой задается путь к каталогу с файлом конфигурации PHP;
  • если PHP вызван из CGI и CLI, то путь будет браться из параметра -c опции для CGI и CLI, если такой параметр указан;
  • в системной переменной окружения PHPRC. Для Apache, при работе PHP как CGI, ее можно задать директивой SetEnv PHPRC. Что бы создать эту переменную для операционной системы и добавить в нее путь к каталогу с конфигом PHP в Windows нужно зайти в Start -> Settings -> Control Panel -> System, перейти в вкладку Advanced, и нажать кнопку 'Environment Variables' и перейти в 'System variables' панель, где выбрать создать 'New' переменную, и задать для нее имя PHPRC и значение пути до каталога с файлом php.ini, например,  C:\php, сохранить и перезагрузить систему. Этот вариант позволяет указать каталог расположения дефолтового php-SAPI.ini и php.ini файлов конфигурации PHP. Обычно, это каталог инсталяции PHP на Windows.
  • в ключах реестра KEY_LOCAL_MACHINE\SOFTWARE\PHP\IniFilePath и других;
  • в текущей рабочей директории, кроме вызова через CLI
  • в директории web сервера (для варианта вызова через SAPI модуль) или в директории инсталяции PHP для вариантов вызова через CGI, CLI, GUI. Это, как раз и есть, наиболее распространенный вариант расположения конфигов PHP.
  • в директории C:\windows

 

Создание php.ini

Учитывая вышеописанную логику поиска имени и расположения конфигов PHP, получается, что самым простым будет использование файла конфигурации с именем php.ini, который будет располагаться в каталоге инсталяции PHP на Windows. При таком подходе PHP будет использовать одни конфиг php.ini в дефолтовом расположении для всех вариантов вызова. Соответственно, нужно будет указать только путь к инсталяции PHP в директиве PHPIniDir WEB сервера Apache, для случая запуска PHP через его модуль. Так же, нужно убедиться, что Apache имеет права на чтение файла php.ini. Других настроек для указания пути к конфигу PHP в этом варианте не потребуется.

Файл php.ini можно создать на основе файлов примеров php.ini-development и php.ini-production, входящих в дистрибутив PHP для Windows. Более предпочтительнее использовать файл php.ini-production, т.к. он имеет оптимизированные настройки по умолчанию для лучшей производительности и безопасности, и PHP будет прекрасно работать с этими настройками. Создайте из этого файла (php.ini-production) копированием и переименованием свой php.ini конфиг в каталоге вашей инсталляции PHP. Для примеров этой статьи и скринкаста путь для php.ini будет как "Z:\WebDevelopment\PHP\php.ini".

Рекомендуется прочесть php.ini файл, так как он хорошо комментирован. Обратите внимание, что в этом файле директивы display_errors и magic_quotes_gpc выключены (off). В секции Windows extensions файла php.ini можно настроить загрузку модулей PHP, с которыми вы хотите запускать PHP. По умолчанию, для модулей PHP на Windows задан extension_dir = "ext" каталог. Нужно заметить, что модуля PHP можно подключать и загружать не только через конфигурационный файл php.ini, но и динамически в скриптах, по ходу их исполнения при помощи PHP функции dl(). Для этого функция dl() должна быть разрешена в php.ini (по умолчанию enable_dl = Off). В php.ini-production уже оптимально настроены необходимые модуля и поэтому, в начале, лучше проверить работу PHP с этими дефолтовыми настройками. Если PHP будет работать нормально с этими настройками по умолчанию, то уже можно будет выполнять активацию других, необходимых вам дополнительных модулей и директив. Лучше это делать по шагам, выполняя проверку работы PHP после каждого изменения блока настроек, что бы иметь возможность быстро найти причину, если PHP не запуститься или будет работать не корректно. Если вам приходится постоянно выполнять много изменений в конфигурационных файлах (не только PHP, но и других), то можно порекомендовать создать для конфигов отдельный репозиторий GIT, что бы было удобно отслеживать и протоколировать все изменения. Это очень хорошая практика и часто используется на продуктивных серверах.

 

Способы изменения конфигурации PHP

Конфигурационные директивы PHP могут быть установлены и/или изменены в файлах конфигурации php (php.ini и т.п.), в PHP скриптах, в конфигах Apache. Что бы понять, где и на каком уровне, может быть задана та или иная конфигурационная директива PHP, необходимо знать режим этой директивы. Режим директивы определяет где (php.ini или php скрипт или конфиг Apache) эта директива может быть установлена или изменена. В PHP имеются следующие режимы директив.

Режимы директив PHP

  • PHP_INI_USER - директива может быть установлена только в пользовательских php скриптах при помощи функции  ini_set(), в пользовательском .user.ini;
  • PHP_INI_PERDIR - директива может быть установлена только в php.ini(главный конфиг), httpd.conf и/или .htaccess;
  • PHP_INI_SYSTEM - директива может быть установлена только в  php.ini и/или httpd.conf;
  • PHP_INI_ALL - директива может быть задана в любом месте

Конфигурационные директивы PHP можно задать и /или изменить в:

  • в главном php.ini файле для данного вызова PHP;
  • в php-SAPI.ini файле для соответствующего вызывающего модуля SAPI;
  • в локальном файле .user.ini каталога (только для CGI/FastCGI SAPI);
  • в php скриптах при их выполнении (ini_set());
  • в конфигах Apache (httpd.conf, .htaccess);

 

ini_set() - настройка PHP в скриптах

Функция PHP ini_set() позволяет выполнять установку и/или изменение значений конфигурационных директив PHP с режимом PHP_INI_USER в php скриптах при их исполнении. Заданная при помощи этой функции настройка будет жить только пока исполняется сделавший ее PHP скрипт. По завершению работы скрипта настройка будет восстановлена к исходному состоянию.

 

Настройка PHP в конфигах Apache

Когда PHP используется как SAPI модуль Apache возможно выполнять изменение настроек PHP не только через php.ini файлы и php скрипты, но и напрямую в конфигурационных файлах Apache разного уровня - httpd.conf, httpd-vhosts.conf, .htaccess и т.д. В конфигах Apache могут быть установлены таким образом только директивы PHP, соответствующие режимам PHP_INI_ALL, PHP_INI_PERDIR и PHP_INI_SYSTEM.

Директивы Apache для изменения настроек PHP:

  • php_value name value - позволяет установить значение(кроме true/false) для директивы PHP уровня/режима PHP_INI_ALL и PHP_INI_PERDIR. Для сброса значения ставят none;
  • php_flag name on|off - позволяет установить логическое значение для директивы PHP уровня PHP_INI_ALL и PHP_INI_PERDIR;
  • php_admin_value name value - позволяет установить значение(кроме true/false) для директивы PHP уровня PHP_INI_ALL и PHP_INI_PERDIR. Для сброса значения ставят none. Директива не допустима в .htaccess (игнорируется) и, будучи ранее установленной, не может быть переопределена в .htaccess или в ini_set() функции php скрипта;
  • php_admin_flag name on|off - позволяет установить логическое значение для директивы PHP уровня PHP_INI_ALL и PHP_INI_PERDIR. Директива не допустима в .htaccess (игнорируется) и, будучи ранее установленной, не может быть переопределена в .htaccess или в ini_set() функции php скрипта.

 

Пример настроек PHP в конфиге виртуального хоста Apache.

В примере использованы директивы Apache php_admin_value и php_admin_flag, следовательно, сделанные через них настройки PHP не могут быть изменены пользователем в .htaccess или в ini_set(). Таким образом, администратор сервера может повысить безопасность сайта и не опасаться, что настройки, сделанные им для виртуального хоста будет переопределены на уровне каталога сайта его пользователем.

# Пример настройки виртуального хоста Apache для test.ru домена
<VirtualHost 127.0.0.1:80>
    DocumentRoot "Z:/WebDevelopment/Projects/Site1"
    ServerName test.ru
    <Directory "Z:/WebDevelopment/Projects/Site1">
        Options -ExecCGI -Indexes -Includes +FollowSymLinks
        AllowOverride All
        AddDefaultCharset UTF-8
        DirectoryIndex index.php index.html
        Require all granted

        # пример настройки PHP в конфиге виртуального хоста Apache
        <IfModule mod_php7.c>
            # Запрещаем php за пределы директории сайта
            php_admin_value open_basedir "Z:/WebDevelopment/Projects/Site1"
            php_admin_value doc_root "Z:/WebDevelopment/Projects/Site1"

            # Сохраняем временные файлы и сессии в корневом каталоге в папке tmp
            php_admin_value upload_tmp_dir "Z:/WebDevelopment/Projects/Site1/temp"
            php_admin_value session.save_path "Z:/WebDevelopment/Projects/Site1/temp"

            # Отключаем возможность include по URL
            php_admin_flag allow_url_include off

            # Отключаем возможность динамической загрузки модулей PHP
            php_admin_flag enable_dl off
        </IfModule>
    </Directory>
</VirtualHost>

Данный пример с настройками витального хоста можно рекомендовать как для разработческого так и продуктивного однопользовательского web сервера.

 

 

ШАГ 4 CLI вызов PHP

После развертывания дистрибутива PHP, создания php.ini файла и указания пути к инсталяции PHP в системной переменной PATH, установка PHP на Windows считаться выполненной. Теперь можно использовать PHP через CLI, обратившись к бинарнику php.exe (CLI исполняемый файл для вызова PHP только из командной строки) в командной строке.

Пример CLI вызова PHP в командной строке Windows

В примере ниже продемонстрирован CLI вызов PHP и выполнение команды >php --help, которая выводит краткий help по использованию PHP через CLI. Если вы прописали в системной переменой PATH путь до инсталяции PHP, как было указано выше, то вы можете открыть командную строку в любом месте файловой системы и обращаться к PHP. Если же у вас не задан в PATH путь до инсталяции PHP, то командную строку необходимо открыть в каталоге с инсталляцией PHP, где расположен файл php.exe или добавить тогда этот путь в команду вызова PHP.

Примеры в статье и скринкасте приводятся с учетом того, что в PATH уже прописан путь до каталога инсталяции PHP.

Z:\WebDevelopment\Projects\Site1>php -h

Usage: php [options] [-f] <file> [--] [args...]
   php [options] -r <code> [--] [args...]
   php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...]
   php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...]
   php [options] -S <addr>:<port> [-t docroot]
   php [options] -- [args...]
   php [options] -a

  -a               Run as interactive shell
  -c <path>|<file> Look for php.ini file in this directory
  -n               No configuration (ini) files will be used
  -d foo[=bar]     Define INI entry foo with value 'bar'
  -e               Generate extended information for debugger/profiler
  -f <file>        Parse and execute <file>.
  -h               This help
  -i               PHP information
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -r <code>        Run PHP <code> without using script tags <?..?>
  -B <begin_code>  Run PHP <begin_code> before processing input lines
  -R <code>        Run PHP <code> for every input line
  -F <file>        Parse and execute <file> for every input line
  -E <end_code>    Run PHP <end_code> after processing all input lines
  -H               Hide any passed arguments from external tools.
  -S <addr>:<port> Run with built-in web server.
  -t <docroot>     Specify document root <docroot> for built-in web server.
  -s               Output HTML syntax highlighted source.
  -v               Version number
  -w               Output source with stripped comments and whitespace.
  -z <file>        Load Zend extension <file>.

  args...          Arguments passed to script. Use -- args when first argument
                   starts with - or script is read from stdin

  --ini            Show configuration file names

  --rf <name>      Show information about function <name>.
  --rc <name>      Show information about class <name>.
  --re <name>      Show information about extension <name>.
  --rz <name>      Show information about Zend extension <name>.
  --ri <name>      Show configuration for extension <name>.

Как видно, даже из этой краткой справки, PHP предоставляет большой набор команд для работы через CLI. Наибольший практический интерес предоставляет команда:

>php -S <addr>:<port>

которая позволяет запустить встроенный в PHP  WEB сервер.

Этот встроенный в PHP WEB сервер можно успешно использовать для разработки и тестирования PHP скриптов и сайтов на PHP. Работа с ним будет похожа на использование WEB сервера в Node.js. Можно запустить несколько экземпляров встроенного в PHP веб сервера для разных каталогов/сайтов, задав каждому свое сочетание хост:порт. Каждый, запущенный экземпляр, будет обслуживать свой каталог/сайт, для которого он был запущен (см. пример ниже). Несмотря на простоту и удобство встроенного в PHP WEB сервера его, все же, не рекомендуют использовать для Production эксплуатации сайтов, а использовать для этих целей специализированные WEB сервера, например, Apache. Также, если вы используете в каталогах сайта файлы конфигурации Apache .htaccess, то при работе со встроенным в PHP веб сервером нужно понимать, что конфигурационные директивы Apache из этих файлов и из файлов виртуальных хостов не будут работать.

Пример запуска встроенного PHP web сервера для сайта и каталога Z:\WebDevelopment\Projects\Site1 на localhost:80

Непосредственно запуск

Z:\WebDevelopment\Projects\Site1>php -S localhost:80
PHP 7.1.0 Development Server started at Tue Dec 20 22:59:05 2016
Listening on http://localhost:80
Document root is Z:\WebDevelopment\Projects\Site1
Press Ctrl-C to quit.

Сообщения в командной строке при обращении в браузере по адресу localhost

[Tue Dec 20 22:59:17 2016] ::1:51206 [200]: /
[Tue Dec 20 22:59:17 2016] ::1:51207 [200]: /favicon.ico
[Tue Dec 20 22:59:17 2016] ::1:51208 [200]: /favicon.ico
[Tue Dec 20 22:59:23 2016] ::1:51209 Invalid request (Unexpected EOF)

Как видите, внешне, запуск и работа встроенного в PHP WEB сервера очень похожа на работу встроенного в Node.js сервера. Выбираем каталог с сайтом и запускаем PHP веб сервер на нужном хосте (не забываем в файле C:\WINDOWS\system32\drivers\etc\hosts прописать этот хост) и порту. Наблюдаем сообщения в командной строке от PHP WEB сервера. Смотрите так же демонстрацию работы встроенного в PHP веб сервера в скринкасте к этой статье.

 

 

ШАГ 5 настройка работы PHP с web сервером Apache2.4 на Windows

Для работы PHP с веб сервером необходимо будет выполнить уже дополнительные настройки в конфигурации самого WEB сервера, которые описаны ниже. В примерах этой статьи и скринкаста мною будет выполняться настройка PHP для работы с WEB сервером Apache 2.4.23 x64 от Apache Haus, инсталляция которого описана скринкасте и статье: Установка Apache на Windows.

 

Настройка Apache2.4 для работы с PHP

Как уже было описано выше, PHP может работать с web сервером Apache как через SAPI Apache модуль DLL (php7apache2_4.dll), так и через CGI/FastCGI бинарник PHP (php-cgi.exe). Но в любом случае необходимо будет сделать соответствующие настройки в httpd.conf файле веб сервера, и перезапустить сервер. Не забываете перезапускать Apache после правок файлов его конфигурации и конфигов PHP, если php вызывается как модуль Apache.

В данном дистрибутиве PHP от php.net имеется файл php7apache2_4.dll из сборки Apache от Apache Lounge (см. выше). Этот файл, собственно, и является SAPI модулем WEB сервера Apache и обеспечивает взаимодействие между веб сервером и PHP. Данный модуль php7apache2_4.dll будет так же корректно работать и с дистрибутивом Apache 2.4.23 x64 от Apache Haus, сборка которого используется в моих примерах. Нужно сказать, что этот SAPI модуль DLL работает достаточно стабильно на Windows и обеспечивает хорошую безопасность в сравнении с CGI.

 

PHP как Apache модуль

Для того, что бы указать Apache на использование SAPI модуля PHP для вызова и обработки всех .php файлов, необходимо в главном конфигурационном файле WEB сервера Apache httpd.conf дописать нижеследующие строки, которые можно разместить, например, поле блока директив подключения модулей Apache.

#httpd.conf блок кода
# подключаем модуль SAPI
LoadModule php7_module "Z:/WebDevelopment/PHP/php7apache2_4.dll"
# задаем MIME тип для файлов расширения .php
AddType application/x-httpd-php .php
# задаем каталог расположения конфигурационного файла PHP
PHPIniDir "Z:/WebDevelopment/PHP"

где:

  • LoadModule директива загружает SAPI модуль Apache, через который и будет вызываться PHP;
  • AddType директива ассоциирует указанный (application/x-httpd-php) MIME тип с файлами расширения .php;
  • PHPIniDir определяет путь, где располагаются конфигурационные файлы php.ini или php-SAPI.ini при работе PHP как модуля Apache. Обычно это директория инсталяции PHP. Apache должен иметь доступ на чтение php.ini файла;
  • пути в директивах должны иметь прямые слеши и не содержать пробелов. Желательно использовать только EN символы и цифры.

 

PHP как FastCGI/CGI с Apache

Что бы настроить Apache для работы с PHP через FastCGI/CGI необходимо добавить в httpd.conf настройки, разрешающие выполнение CGI программ.

Apache предоставляет несколько вариантов настройки внешних CGI обработчиков:

  • директива Action модуля mod_actions, которая напрямую активирует исполнение скрипта как внешней CGI программы и позволяет назначить MIME типу CGI обработчик;
  • директивы AddHandler или SetHandler, которые позволяют установить обработчик для файлов с расширениями, которые планируются обрабатываться как CGI программа. Затем, этому обработчику нужно будет директивой Action назначить CGI исполняемый файл бинарник php-cgi.exe. Так же, директива Options +ExecCGI позволяет разрешить выполнения CGI программ в указанном каталоге;
  • ScriptAlias директива, которая позволяет связать URL с каталогом файловой системы и назначить исполнение запрошенного файла как CGI программы. Эта директива используется в сочетании с другими директивами;
  • сочетание нескольких директив и подходов позволяет в Apache выполнить и более сложную, комбинированную на разных уровнях конфигурации (глобальном, сайта, каталога) настройку для CGI, когда только часть сайтов (виртуальных хостов) или отдельных каталогов будут обрабатываться через CGI, а остальные скрипты будут вызваться через SAPI модуль PHP. Но любом случае, всегда нужно будет задать через директиву AddType MIME тип или через директивы AddHandler, SetHandler обработчик, ассоциированный с файлами расширений, которые будут обрабатываться через CGI/FastCGI и назначить этому MIME типу/обработчику директивой Action файл-бинарник php-cgi.exe.

 

Чтобы настроить Apache для обработки всех PHP файлов через FastCGI/CGI интерфейсы необходимо в httpd.conf конфиге Apache добавить нижеследующие строки:

#httpd.conf блок кода
# задаем MIME тип для файлов расширения .php                                    
AddType application/x-httpd-php .php
# задаем CGI обработчик для MIME типа ассоциированного с .php файлами
Action application/x-httpd-php "Z:/WebDevelopment/PHP/php-cgi.exe"
# Указываем директорию php.ini для CGI
SetEnv PHPRC "Z:/WebDevelopment/PHP"

где:

  • AddType директива связывает указанный MIME тип с файлами расширения .php;
  • Action директива задет внешний CGI обработчик для MIME типа ассоциированного с .php файлами;
  • SetEnv директива задает переменную окружения PHPRC, в значении которой указывается путь к каталогу инсталяции PHP. В примере это "Z:/WebDevelopment/PHP"

После этой настройки Apache будет все PHP файлы обрабатывать как внешние CGI программы через FastCGI/CGI бинарник php-cgi.exe.

 

 

ШАГ 6 настройка виртуального хоста Apache

После настройки работы PHP с Apache как модуля SAPI целесообразно выполнить настройку виртуального хоста для каталога сайта, который будет обслуживаться WEB сервером и PHP. Настройка виртуального хоста для сайта уже относиться исключительно к настройке WEB сервера Apache и приводится здесь для целостности понимания организации собственного разработческого WinAMP веб сервера на Windows для разработки и тестирования скриптов и сайтов, работающих на PHP в связке и Apache.

Об установки других компонентов Win+AMP сборки написано в статьях:

 

Создание и настройка виртуального хоста Apache2.4

Все примеры статьи и скринкаста по настройке виртуального хоста будут приведены для сборки Apache 2.4.23 x64 от Apache Haus, инсталляция которого описана в статье: Установка Apache на Windows,

где:

  • Z:\WebDevelopment\Apache24 это ServerRoot - домашний каталог Apache2.4;
  • Z:\WebDevelopment\Apache24\conf\httpd.conf - главный конфиг данной инсталяции Apache2.4;
  • Z:\WebDevelopment\Apache24\conf\extra\httpd-vhosts.conf - конфиг для настройки виртуальных хостов в Apache2.4 на Windows.

 

Файл hosts

Файл hosts - это обычный текстовый локальный файл без расширения, в котором настраивается соответствие доменных имен сетевым IP адресам узлов. Таким образом, файл hosts - это простой вариант локального DNS и запрос к этому файлу выполняется в первую очередь, а запрос к внешним DNS серверам выполняется уже во вторую очередь.

В примере статьи и скринкаста виртуальный хост будет настраиваться для сайта из каталога "Z:\WebDevelopment\Projects\Site1" и тестового домена text.ru для этого сайта. Для того, чтобы браузер на вашем компьютере открывал этот локальный сайт по доменному имени text.ru необходимо в файл C:\WINDOWS\system32\drivers\etc\hosts добавить соответствующий этому домену IP адрес как 127.0.0.1 - локальных хост.

# блок кода из файла C:\WINDOWS\system32\drivers\etc\hosts

# localhost name resolution is handled within DNS itself.
127.0.0.1       localhost
::1             localhost
#
# Укажем IP для test.ru для настраиваемого виртуального хоста
127.0.0.1       test.ru www.test.ru

 

Файл httpd-vhosts.conf

В Apache2.4 настройка конфигурации виртуальных хостов вынесена в отдельный файл конфигурации: conf\extra\httpd-vhosts.conf относительно домашней директории веб сервера. Это сделано для удобства, чтобы не писать все в главном конфиге Apache2.4. Поэтому принято логически связанные блоки конфигурации веб сервера выносить в отдельные специализированные файлы конфигурации (смотри обзор конфигурации Apache в Ubuntu), которые подключаются в главном конфиге Apache при помощи директивы Include. Следуя этой логике, конфигурация виртуальных хостов вынесена в отдельный файл с именем conf\extra\httpd-vhosts.conf, а в главном конфиге Apache в секции с комментарием "Virtual hosts" выполнено подключение этого конфига:

# блок кода из файла httpd.conf
# Virtual hosts
Include conf/extra/httpd-vhosts.conf

Найдите в главном конфиге Apache conf\httpd.conf приведенный выше блок кода и убедитесь, что директива Include для httpd-vhosts.conf файла не закомментирована. По умолчанию она закомментирована, поэтому раскомментируйте ее для того, чтобы при старте Apache файл с конфигурацией виртуальных хостов был прочитан и добавлен в конфигурацию веб сервера.

 

<VirtualHost> директива Apache

Для создания и управления виртуальными хотами в Apache используется директива <VirtualHost>...</VirtualHost>, которая создает контейнер для директив, применимых только к указанному в VirtualHost hostname или IP адресу. Это позволяет на одном компьютере для одного и того же IP/hostname назначить разные сайты, разделив их по значению директивы ServerName, указав в ней разные доменные имена сайтов для разных виртуальных хостов.

Общий вид директивы <VirtualHost> :

Синтаксис:    <VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost>
Контекст:    server config
Статус:    Core
Модуль:    core

В открывающем теге директивы <VirtualHost addr[:port] [addr[:port]] ...> можно указать:

  • IP адрес, с которым будет ассоциирован данный виртуальный хост. Это IP одного из сетевых интерфейсов данного сервера/компьютера. Например, <VirtualHost 127.0.0.1> будет применяться к локальному сетевому интерфейсу (сетевому адаптеру) данного сервера;
  • FQDN (Fully Qualified Domain Name) - полное доменное имя одного из сетевых интерфейсов данного сервера/компьютера вместо его IP адреса, с которым будет ассоциирован данный виртуальный хост. Например, <VirtualHost localhost>. Здесь нужно понимать, что указанный домен должен быть связан с IP адресом одного из сетевых интерфейсов данного сервера/компьютера. Однако, предпочтительно все же указывать именно IP адрес, а не доменное имя, т.к. при указании доменного имени Apache должен будет все равно определить его IP, а это требует уверенности, что все настройки DNS сделаны правильно. Также расходуется время на дополнительную операцию по получению IP адреса для доменного имени. Поэтому, при настройках, обычно предпочитают указывать именно IP адрес;
  • можно, опционально, указать порт для адреса, например <VirtualHost 127.0.0.1:80>;
  • можно указать несколько addr[:port] [addr[:port]] значений, например, <VirtualHost 127.0.0.1:80 192.168.0.4>;
  • можно использовать для задания IP адреса символ подстановки * звездочку, которая будет означать любое значение. Звездочкой можно заменять только IP адрес. Например, <VirtualHost *:80> будет применен для всех IP интерфейсов данного сервера;
  • вместо *  звездочки можно использовать строку _default_, которая, в данном случае, является алиасом звездочки. Например, <VirtualHost _default_:80> будет равносильно <VirtualHost *:80>.

После того, как выполнено подключения конфига виртуальных хостов в главном конфиге Apache, необходимо открыть файл conf\extra\httpd-vhosts.conf на редактирование, перейти в его конец и добавить новый блок кода для нужного виртуального хоста (в примере для test.ru). Для подсказки можно пользоваться приведенными в конце этого файла закомментированными заготовками кода для создания виртуальных хостов.

 

VirtualHost _default_

Обязательно первым, в списке виртуальных хостов, должен быть указан виртуальный хост по умолчанию как: <VirtualHost _default_:80> или <VirtualHost *:80>. Это связано с тем, что если Apache не найдет виртуального хоста, сопоставимого по параметру ServerName с доменом URL запроса, то в этом случае Apache отдаст первый из списка виртуальный хост. Поэтому позаботьтесь, чтобы первый, в списке виртуальных хостов, хост был правильно настроен и отдавал нужную вам страницу. Именно поэтому первым всегда записывают, так называемый, дефолтовый хост. Если настройка виртуальных хостов вынесена в отдельные файлы, где для каждого виртуального хоста имеется свой конфигурационный файл, то Apache будет читать эти файлы согласно порядку их подключения в своем главном конфиге. И если подключение выполнено через подключение директории с конфигами виртуальных хостов, то Apache будет читать эти конфиги виртуальных хостов согласно алфавитному порядку файлов в директории. Поэтому, всегда нужно обращать внимание, в какой последовательности Apache прочитает конфигурацию виртуальных хостов, т.к. если он не найдет для запроса соответствующего виртуального хоста, то он отдаст первый прочитанный виртуальный хост. Поэтому, если подключают конфиги виртуальных хостов сразу целой директорией, то в этой директории создают файл с именем 000-default-vhosts.conf, в котором задают виртуальный хост по умолчанию. Имя файла специально начинается с 000, что бы этот файл был первым в алфавитном порядке, и соответственно был первым прочитан Apache.

 

Блок кода из файла httpd-vhosts.conf, где продемонстрирована простая, минимальная, начальная настройка виртуальных хостов для сайта test.ru из примера статьи и скринкаста:

# Блок кода из httpd-vhosts.conf примера статьи и скринкаста
# ПЕРВЫМ из всех виртуальных хостов должен быть записан default хост,
# который будет отдаваться, если Apache не нашел VirtualHost, сопоставимый
# с доменным именем в URL запроса, т.к. в этом случае Apache покажет именно
# ПЕРВЫЙ по рядку записанный здесь виртуальный хост. Поэтому default хост
# нужно указать ПЕРВЫМ в списке виртуальных хостов, так как порядок в этом
# случае имеет значение.

<VirtualHost 127.0.0.1:80>
    # default сайт/хост задан как стартовая страница данной сборки Apache
    DocumentRoot "${SRVROOT}/htdocs"
</VirtualHost>

#задал <VirtualHost 127.0.0.1:80> т.к. в примере Apache слушает только 127.0.0.1 IP,
#но можно и как <VirtualHost *:80> или <VirtualHost _default_:80> сразу для всех IP.
#Примечание: Знак звездочка * значит любой IP,
# _default_ это алиас *, поэтому выражения:
#<VirtualHost _default_:80> будет равносильно <VirtualHost *:80>


#Виртуальный хост для test.ru из каталога Z:\WebDevelopment\Projects\Site1
<VirtualHost *:80>
    ServerAdmin webmaster@test.ru
    DocumentRoot "Z:/WebDevelopment/Projects/Site1"
    ServerName test.ru
# Можно задать отдельные log файлы только для этого хоста
# Если их не указать, то логи будут писаться в общие файлы
#   ErrorLog "logs/test.ru-error.log"
#   CustomLog "logs/test.ru-access.log" common
</VirtualHost>

 

Команды проверки конфигурации виртуальных хостов Apache

Для проверки конфигурации виртуальных хостов Apache предоставляет специальные команды, которые выводят в терминале информацию о том, как Apache обработал файл конфигурации виртуальных хостов.

Для Linux
apachectl -S
Для Windows
httpd.exe -S

 

Теперь, после настроек виртуальных хостов (дефолтового и test.ru) и добавления домена test.ru в hosts файл можно запустить Apache и обратиться в браузере к сайту примера из каталога Z:\WebDevelopment\Projects\Site1 по URL http://test.ru или http://test.ru/index.php.

 

Использование несколько версий PHP

Если вам требуется использовать несколько версий PHP, обслуживаемых одним web сервером Apache, то вам необходимо выполнить установку в систему как описано выше нескольких, нужных вам версий PHP, например PHP 7.2 и PHP 5.6, использовав для каждой из версий свой каталог. После этого вы можете в конфигурационном файле вашего Apache указать подключение нужной версии PHP. Тогда для смены версии PHP вам нужно будет остановить web сервер Apache, открыть его конфиг и сделать правки подключения PHP указав путь к нужной вам в данный момент версии PHP. Можно для этого заранее сделать в конфиге Apache заготовленные блоки подключения для каждой версии PHP, но держать их закомментированными, а активной только один блок, используемый в данный момент. Это будет такой простой ручной особ смены версий PHP.

Если вы хотите эти операции по смене версии PHP автоматизировать, то можно использовать такой вариант, когда инсталлировать ваш Apache как системную службу Windows, но сделать это для каждой версии PHP. Для этого нужно будет создать несколько полноценных конфигов Apache, в каждом подключив нужную версию PHP. После этого инсталлируем Apache с разными конфигами как системные службы:

Z:\WebDevelopment\Apache24\bin\httpd.exe -k install -n "Apache PHP5.6" -f "Z:\WebDevelopment\Apache24\conf\httpd5.conf"
Z:\WebDevelopment\Apache24\bin\httpd.exe -k install -n "Apache PHP7.2" -f "Z:\WebDevelopment\Apache24\conf\httpd7.conf"

После этого нужно созданные службы настроить так, что бы автостарт был только у одной, или вообще, что бы все службы имели только ручной запуск, что бы не получить ситуацию, когда система будет пытаться запустить одновременно несколько служб Apache с разными конфигами и получится конфликт. В данный момент времени должна быть запущена только одна служба Apache. Детали по настройке Apache как службы Windows смотрите в статье: Установка Apache на Windows.

 

 

ШАГ 7 FTP EMAIL

На этом установку PHP на Windows и базовую настройку Apache для запуска PHP скриптов можно считать законченной. Все описанное ниже является не обязательным и приведено в качестве дополнения. Можно добавить MySQL, GULP, FTP и EMAIL, что бы получить полноценный разработческий WAMP сервер на Windows. Ссылки на установку MySQL и GULP были приведены выше.

 

EMAIL

В качестве тестового EMAIL сервера для перехвата email сообщений, отправленных из PHP, можно порекомендовать старенький инструмент от набора Denwer, который представляет собой заглушку-эмулятор sendmail сервера. Этот инструмент слушает 25 порт и перехватывает email сообщения отправленные из PHP, и складывает их в локальный каталог, который настроен в конфиге скрипта. Это позволит вам локально выполнять тестирование отправки почты из PHP.

Структура каталогов инструмента из набора Denwer для перехвата email из PHP:

denwer\tools\sendmail
 |--common.pm
 |--README.txt
 |--sendmail.exe
 |--sendmail.pl
 |--sendmail_daemon.ico
 |--sendmail_daemon.pl
 |--sendmail_daemon_start.exe
 |--sendmail_daemon_stop.exe
 |--sendmail_stub.pl
 |--sendmail_stub_onefile.pl

 

FTP сервер для Windows

Если необходимо работать в PHP с функциями FTP, то тогда нужно установить дополнительно FTP сервер. Для разработки и тестирования в качестве FTP сервера для Windows можно порекомендовать: "Baby FTP Server".

 

 

Дополнения и инструменты PHP

deplister.exe

В составе данной сборки PHP7 присутствует утилита командной строки с именем файла deplister.exe. Эта утилита предназначена для определения зависимостей модулей PHP. Если вызвать эту утилиту в командной строке и передать ей в виде аргумента файл модуля PHP, то будет выдан список файлов-зависимостей для этого модуля и результат проверки их на соответствие этому модулю. Таки образом, данная утилита может быть полезна для поиска проблем в работе подключаемых модулей PHP. Обычно, для модулей поставляемых в составе одной сборки PHP проблем не возникает, но они могут быть при добавлении отдельно скачанных модулей PHP. Здесь эта утилита может и пригодиться.

Пример работы утилиты deplister.exe для модуля PHP:

Z:\WebDevelopment\PHP>deplister.exe ext\php_ftp.dll
php7ts.dll,OK
SSLEAY32.dll,OK
LIBEAY32.dll,OK
WS2_32.dll,OK
VCRUNTIME140.dll,OK
api-ms-win-crt-string-l1-1-0.dll,OK
api-ms-win-crt-time-l1-1-0.dll,OK
api-ms-win-crt-convert-l1-1-0.dll,OK
api-ms-win-crt-runtime-l1-1-0.dll,OK
api-ms-win-crt-stdio-l1-1-0.dll,OK
KERNEL32.dll,OK

 

Отладчик phpdbg

В состав дистрибутива PHP включен файл phpdbg.exe и php7phpdbg.dll, который является легким, мощным, простым в использовании интерактивным отладчиком для PHP скриптов. Будучи реализованным и как модуль SAPI (php7phpdbg.dll), phpdbg может осуществлять полный контроль над окружением, не оказывая влияния на функциональность и производительность PHP кода.

Отладчик phpdbg предоставляет следующие возможности для отладки PHP скриптов:

  • Пошаговая отладка;
  • Гибкое размещение точек останова в методах класса, в функциях, в строках файла, Address, Opcode;
  • Легкий доступ к PHP со встроенным Eval ();
  • Легкий доступ к выполняемому в данный момент коду;
  • Userland API;
  • SAPI Agnostic - Легко Интегрированный;
  • Поддержка файлов PHP конфигурации;
  • JIT Super Globals - установить свой собственный;
  • Optional readline Support - удобно в терминале;
  • Remote Debugging Support - GUI Java;
  • Простое управление отладчиком

 

PECL extensions

PHP дистрибутив содержит основные необходимые расширения PHP. Однако, может возникнуть потребность установить дополнительные расширения и модули, отсутствующие в данном дистрибутиве. Для расширений PHP существует PECL репозиторий, доступный через PEAR пакетный менеджер и напрямую, в браузере. Поэтому, дополнительные модули и библиотеки PHP под Windows можно скачать на php.net и pecl.php.net, где можно найти скомпилированные бинарники нужной библиотеки как .dll файла. Скачанную библиотеку или модуль нужно поместить в директорию для расширений PHP на Windows (PHP/ext). Затем, добавленное расширение нужно подключить в файле php.ini как extension=php_extname.dll и перезапустить WEB сервер для вступления изменений с силу.

 

Скринкаст: Установка PHP7 на Windows

В скринкасте продемонстрирована инсталляция и настройка PHP 7.1.0 php-7.1.0-Win32-VC14-x64 на Windows7, интеграция с Apache. Показы все основные шаги - выбор сборки дистрибутива PHP, размещение PHP в Windows7, обзор состава дистрибутива PHP, настройка PHP, работа с PHP из командной строки, использование встроенного в PHP WEB сервера, настройка работы PHP как модуля Apache, настройка виртуального хоста в Apache. Дополнительно даны примеры и ссылки по самостоятельной организации WinAMP сборки. В конце добавлена информация о новшествах PHP7 и перспективах развития языка PHP.

Смотреть на YouTube скринкаст: Установка PHP7 на Windows 

Содержание скринкаста: