Доброго времени суток дамы и господа. Сегодня я хочу написать про установку из исходников последней версии PHP 7. В марте я уже писал про установку PHP 7.1.3 и эта статья ничем не будет отличаться от предыдущей, за исключением версии PHP и одной маленькой детали. На днях я озаботился проблемой быстрой развертки серверного окружения. Мне нужно было максимально быстро получить VPS/VDS с установленными и настроенными на совместную работу Nginx, PHP 7 и Mari­aDB с возможностью удобного обновления, а также быстрой развертки полученной конфигурации на других машинах. Если с Mari­aDB все было довольно просто - установил через apt, настроил и забыл, то с Nginx и PHP все по другому, поскольку их я устанавливаю из исходников, где все только нужное и нет ничего лишнего.

Постоянно собирать вручную, особенно когда делаешь это по нескольку раз на день, как-то не очень, знаете ли. Вот я и решил хоть как-то облегчить и ускорить сей процесс, а по возможности даже автоматизировать. Как водится, за ответом я обратился к великому и могучему Google, немного подумав, он выдал решение всех моих проблем, в виде утилиты Check­in­stall. Подробнее о Check­in­stall можно прочитать здесь. Это и есть та деталь, которой отличается эта установка от предыдущей.

Сборка и установка PHP

Установим набор необходимых пакетов вместе с Check­in­stall.

Перейдем в рабочий каталог /usr/local/src.

Скачаем архив с последней версией PHP.

Распакуем архив и сразу перейдем в распакованный каталог.

Собираем PHP. Для себя я использую следующую конфигурацию. В отличии от предыдущей статьи я выкинул опции GD (Графическая библиотека), она мне пока без надобности.

Задаем конфигурацию одной командой. Тут с --with-openssl=/usr/local/ssl/, если нужно поменяйте.

Если у вас возникли какие либо ошибки, это значит, что вы что-то забыли установить из списка пакетов в начале статьи. Найдите ошибку в списке, установите необходимый пакет и выполните ./configure заново.

Если после выполнения ./configure не было никаких ошибок и вы получили нечто похожее, то все в порядке, конфигурация прошла успешно.

Скомпилируем PHP, просто запускаем make.

Если раньше после команды make мы выполняли make install, то теперь выполним check­in­stall c некоторыми дополнительными опциями: --pkg­name php7 - имя пакета, --pkgver­sion 7.1.5 - версия пакета, --install=no - указывает что пакет будет создан, но не установлен, установим его потом отдельной командой.

Во время выполнения check­in­stall будет предложено ответить на несколько вопросов. Сначала будет вопрос про создание каталога для документации, если нужен нажимаем y потом Enter, если не нужен то просто Enter.

Далее будет предложено ввести описание пакета. Задается по желанию. В первой строке пишем, во второй просто нажимаем Enter, потому что описание должно завершаться пустой строкой. Если описание не нужно, то везде жмем Enter.

Теперь утилита предупреждает что пакет будет создан вместе со следующими значениями. Чтобы заполнить значение, введите его номер и нажмите Enter. Например для заполнения значения Main­tan­er (Поддержка) вводим его номер и нажимаем Enter и так пока не введете все нужные данные.

Если просто нажать Enter то сразу начнется установка, скорее даже не установка, а просто создание нужных каталогов и копирование в них файлов.

Вывод check­in­stall

В конце будет создан пакет и указана команда для его установки.

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

Просмотр списка установленных в системе пакетов.

Установленный таким образом пакет может быть совершенно безболезненно удален из системы не оставляя после себя мусора. Точно также он может быть заменен на более новую или пересобранную версию PHP. Обратите внимание что при удалении пакета используется другое имя, то под которым он числится в системе управления пакетами dpkg.

С установкой закончили. Осталось доработать напильником создать несколько каталогов, написать конфигурационные файлы, сделать несколько ссылок и службу php7.service.

Конфигурационные файлы PHP

Создаем директорию для конфигурационных файлов PHP, она была задана при сборке "--with-con­fig-file-path=/etc/php7/conf". Данный каталог не создается при установке ни через make install, ни через check­in­stall, поэтому делаем ручками.

Из каталога с исходниками копируем файл php.ini.production c попутным переименованием в php.ini и помещаем в /etc/php7/conf.

Сразу отредактируем php.ini внеся в него некоторые изменения.
Создадим файл php-fpm.conf в каталоге /etc/php7/conf.
Содержание файла php-fpm.conf.
Создадим файл php-пула pool.conf в каталоге /etc/php7/pool.
Содержание файла pool.conf.

Нужно создать каталог /var/log/php-fpm, он указан в одном из конфигурационных файлов, если его не будет, то при запуске php выдаст ошибку.

Создадим несколько ссылок на файлы в каталоге bin.

Осталось создать системную службу php7.service. Для этого нужно создать одноименный файл в каталоге /lib/sys­temd/sys­tem.

Содержание файла php7.service
Для запуска PHP нужен пользователь nginx, потому что он указан в файле php-пула. Создаем системного пользователя nginx.
Добавляем службу php7.service в автозагрузку и запускаем ее.

Проверка PHP

Проверяем работу php командой sta­tus.

Команда php -v покажет установленную версию.

Команда php -i выведет подробный отчет по установленной версии.

Вывод php -i

Автоматизированная установка пакета

Как было написано в начале статьи, я хотел ускорить процесс установки и Check­in­stall здорово в этом помог. По крайней мере в дальнейшем, про сборку уже можно было забыть, половина дела была сделана. Но оставалась вторая половина: конфигурационные файлы, каталоги, ссылки, системный юнит. Вроде ничего сложного нет, но время-то отнимается, да и сам процесс тоже муторный.

По сравнению с настройкой конфигурационных файлов Nginx, у PHP есть одно неоспоримое преимущество, все файлы пишутся или изменяются только один раз, во время или после установки, потом их можно использовать где угодно, менять больше ничего не придется. Это тоже здорово облегчает процесс установки & настройки, ведь если все нужные файлы уже есть, то их можно скопировать, а потом рассовать по местам на другой машине. Что касается каталогов и ссылок, это вообще просто.

Но хочу напомнить что я очень ленив. И даже такие простые вещи, особенно при многократном их повторении, начинают меня раздражать. Я хотел нажать всего лишь несколько кнопок и поставить все автоматически. Собственно это я и сделал. Я собрал все нужные файлы в один каталог, поместил туда же пакет с PHP, а потом взял и написал простенький bash-скриптик. По сути это просто набор команд, выполняющихся почти в том же порядке, в котором они описаны в данной статье. Но зато каков результат! Максимум комфорта и экономии времени, при минимуме затрат.

Как сделать подобное у себя. Перейдите в в домашний каталог пользователя, например /root. Создайте каталог в котором будет находится все нужное, например /php_7.1.5.

Скопируйте в созданный каталог все необходимое.

Перейдите в каталог php_7.1.5 и напишите скрипт.

Содержание скрипта php_install.sh.

Собственно на этом все. Каталог со всем его содержимым можно заархивировать и перенести на другую машину.

На другой машине выполняем следующие действия.

По завершению работы скрипта получим настроенный и готовый к дальнейшей работе PHP.