Установка PHP из исходников в Linux (PHP, FPM, Extensions)
В этом конспекте будет описан процесс установки PHP, загруженного с официального сайта "php.net", также будет установлен FPM и несколько расширений для PHP из исходников. Развертывание будет происходить в Docker контейнере.
Если вы хотите увидеть видео - лекцию о том, как происходит установка PHP из исходников, вы можете найти ее в лектории или просто перейти по ссылке. Также вы сможете получить методичку и перезентацию в рамках видео - урока.
Dockerfile выглядит следующим образом:
FROM ubuntu RUN apt-get update RUN apt-get install wget -y RUN apt-get install curl -y RUN apt-get install autoconf -y RUN apt install php7.0-dev -y RUN apt-get install tar -y RUN apt-get install libxml2-dev -y RUN apt-get install nginx -y RUN apt-get install vim -y
Создадим в корне контейнера директорию "Installs"
mkdir Installs cd Installs/
Затем загрузим последнюю на момент написания записи версию PHP
wget http://php.net/get/php-7.1.7.tar.bz2/from/this/mirror
Распакуем архив
tar -xf mirror
Переходим в директорию с PHP
cd php-7.1.7/
Перед тем как приступить к компиляции, необходимо произвести конфигурацию PHP при помощи программы "configure". Данная программа создаст определенный make файл основываясь на введенной конфигурации. Подробную информацию о всех опциях программы "configure", а также о конфигурировании как таковом можно узнать запустив команду
./configure --help
В данной заметке будут использоваться значения конфигурации по умолчанию с включенным fpm
./configure --enable-fpm
Запускаем компиляцию
make
Откидываемся на спинку кресла и ждем результата. Время компиляции зависит от того, насколько "быстрой" является машина, где производится компиляция. Необходимо ожидать вывод "Build complete" При желании можно запустить прогон тестов:
make test
Запускаем установку
make install
Создаем конфигурацию PHP
cp php.ini-production /usr/local/lib/php.ini
Проверяем php
php -v
Видим что PHP CLI работает
PHP 7.1.7 (cli)
Копируем init.d сервис для старта FPM
cp sapi/fpm/init.d.php-fpm.in /etc/init.d/php-fpm
Даем право владельцу на исполнения
chmod u+x /etc/init.d/php-fpm
Теперь нужно немного модифицировать init.d скрипт php-fpm
vim /etc/init.d/php-fpm
Открыв файл в редакторе можно увидеть следующее
prefix=@prefix@ exec_prefix=@exec_prefix@ php_fpm_BIN=@sbindir@/php-fpm php_fpm_CONF=@sysconfdir@/php-fpm.conf php_fpm_PID=@localstatedir@/run/php-fpm.pid
все что обрамлено символом "@" должно быть заменено на пути, которые использовались при конфигурации PHP. В данной заметке пути при конфигурировании PHP не менялись, а значит используются значения по умолчанию
prefix=/usr/local exec_prefix=/usr/local php_fpm_BIN=/usr/local/sbin/php-fpm php_fpm_CONF=/usr/local/etc/php-fpm.conf php_fpm_PID=/usr/local/var/run/php-fpm.pid
Теперь нужно создать файл конфигурации для php-fpm
cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf
Небольшая модификация конфигурационного файла php-fpm.conf
vim /usr/local/etc/php-fpm.conf
Необходимо раскоментировать строчку
;pid = run/php-fpm.pid
И модифицировать строчку "include"
/usr/local/etc/php-fpm.d/*.conf
После модификации создать подключаемый конфигурационный файл
cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf
Внести изменения в директивы "user" и "group" в "www.conf"
user = www-data group = www-data
Создадим виртуальных хост в nginx
cp /etc/nginx/sites-available/default /etc/nginx/sites-available/test
Вносим
server { listen 80; root /test; index index.php; server_name test.loc; location / { try_files $uri $uri/ =404; } location ~ \.php$ { try_files $uri =404; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; } }
Активируем виртуальный хост
ln -s /etc/nginx/sites-available/test /etc/nginx/sites-enabled/
Правим /etc/hosts
127.0.0.1 test.loc
Создаем директорию и файл
mkdir /test touch /test/index.php
Вносим в index.php следующее
echo "Hello World \n";
Запускаем сервисы
service nginx restart service php-fpm start
Проверяем:
curl http://test.loc
Видим результат
Hello World
Установим расширение "soap" Модифицируем "index.php"
$soapClient = new SoapClient(); echo "Hello World \n";
Убедимся, что PHP ругается на отсутствие расширения "soap"
curl http://test.loc Fatal error: Uncaught Error: Class 'SoapClient' not found in /test/index.php:3
Переходим в директорию с нужным расширением
cd /Installs/php-7.1.7/ext/soap
Компилируем и устанавливаем
phpize ./configure make make install
подключаем в php.ini
extension=soap.so
Производим обновление конфигураций nginx и перезагружаем fpm
service nginx reload service php-fpm restart
Проверяем, пропала ли ошибка об отсуствии класса
curl http://test.loc Fatal error: Uncaught SoapFault exception: [Client] SoapClient::SoapClient(): Invalid parameters in /test/index.php:3
Ошибка об отсутствии класса исчезла, но появилась новая. Это произошло лишь потому, что в коснтруктор не был передан обязательный параметр