Сегодня мы будем с вам устанавливать PHP 8.1 на Windows Server 2016 для web-сервера IIS 10.
Начиная с этой версии PHP установка сильно усложнилась. Microsoft Web Platform Installer (WebPI), которым раньше я пользовался для установки PHP больше не работает, так что устанавливать приходится вручную. Возня с дополнительными расширениями тоже приключение. Очень печально, что для Windows Server 2016 нет нормальных способов установки.
Дистрибутив PHP 8.1
Переходим на официальный сайт PHP в раздел загрузок, находим PHP 8.1, и тыкаем в ссылку Windows downloads.
https://windows.php.net/download#php-8.1
Попадаем на windows.php.net, можно было и сразу сюда пойти.
Доступны две версии PHP:
- Non Thread Safe
- Thread Safe
По какой-то странной причине в большинстве инструкций показывают, что нужно ставить версию Thread Safe, это в корне неверно. Примечательно, что про "TS and NTS" на той же странице загрузок всё написано.
Версию нужно выбирать в зависимости от того, как вы интегрируете PHP c веб-сервером. Когда вы используете mod_php, у вас модуль и PHP всегда загружены в память и каждый запрос обрабатывается в отдельном потоке. Из-за этого mod_php работает быстрее, чем CGI. В данном случае нужно использовать потокобезопасную реализацию (thread-safe) поскольку каждый поток имеет доступ к памяти другого потока. Здесь мы мягко намекаем на Linux.
Когда вы работаете с IIS, здесь мы мягко намекаем на Windows, у вас PHP запускается в виде отдельного процесса посредством CGI. В таком случае потокобезопасность не имеет смысла, поскольку у вас один процесс и один поток созданный этим процессом. Операционная система изолирует память процессов по умолчанию, NTS в этом случае работает быстрее.
В случае модели с FastCGI, потокобезопасность также не имеет смысла, поскольку тот же PHP-FPM держит несколько отдельных процессов PHP в памяти, но не потоков. Тоже имейте в виду.
В нашем случае (Windows, IIS, CGI) нам нужна версия PHP NTS — Non Thread Safe. Скачиваем соответствующий ZIP архив, распаковываем.
Создаём папку C:\Program Files\PHP\v8.1, копируем в неё содержимое архива.
Права доступа
В папке C:\Program Files\PHP выше уровнем у вас может находиться несколько версий PHP. На неё нужно дать права IIS. Удобнее вешать права на неё, чтобы они применялись ко всем версиям PHP через наследование.
Не помню каким точно юзерам надо права, напишите уточнение в комментариях, кто знает, я даю двум юзерам IUSR и IIS_IUSRS права:
- чтение
- чтение и выполнение
- чтение списка содержимого директории
Серверные переменные
Настроим серверные переменные. Свойства компьютера или Control Panel → System and Security → System. Advanced System Settings.
Вкладка Advanced, кнопка Environment Variables...
Блок System variables, находим переменную Path, выделяем её. Edit.
Добавляем новый путь:
C:\Program Files\PHP\v8.1
Кнопкой Move Up поднимаем его выше остальных версий PHP, если они у вас есть. OK, OK, OK.
В командной строке проверяем:
php --version
По умолчанию теперь используется PHP 8.1.26.
PHP и IIS
IIS и PHP можно подружить вручную, но мне лень. Использую для этих целей PHP Manager for IIS.
https://github.com/phpmanager/phpmanager/releases
Я уже ставил его ранее, приведу инструкцию для версии 2.4:
Запускаю инсталлятор.
Next.
Принимаем лицензионное соглашение, Next.
Next.
Install.
Ждём.
Finish.
В IIS появляется новая оснастка под названием PHP Manager.
Для каждого сайта можно выбирать свою PHP версию, регистрировать новые, управлять расширениями и т.д.
Однако, если вы собираетесь обновить версию PHP Manager for IIS, то сначала удаляйте старую, потом устанавливайте новую. Я обновил до версии 2.12.
Выбираем в IIS сайт или сам сервер, запускаем оснастку PHP Manager.
Зарегистрируем новую версию PHP. Register new PHP version.
Указываем путь к php-cgi.exe.
C:\Program Files\PHP\v8.1\php-cgi.exe
OK.
Путь к файлу php.ini и логу ошибок подставляется автоматически.
php.ini
Теперь нужно настроить php.ini я уже не помню что раньше настраивал для прежней версии PHP, поэтому воспользуюсь сравнением файлов с помощью Total Commander.
Сравнить файлы с помощью Total Commander
Расширения можно искать здесь: