Установка 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

Ошибка об отсутствии класса исчезла, но появилась новая. Это произошло лишь потому, что в коснтруктор не был передан обязательный параметр

Информация

Автор конспекта


Дата создания: 01.01.2019
Категория: Веб-разработка