Установка PHP 7.4 с компиляцией модуля v8js на ubuntu 22

В README файлах официальных репозиториях V8 и V8JS достаточно информации по установке/компиляции компонентов для PHP 8+, но эти инструкции не работают для PHP 7.4.

Ниже, проверенная инструкция для установки из исходников V8 и компиляция модуля V8JS для PHP 7.4 на операционной системе Ubuntu 22

Получаем рут права:

sudo su

Обновляем компоненты ОС ubuntu 22, чтобы работать с самыми актуальными версиями пакетов :

apt-get update -y --fix-missing && apt-get upgrade -y;

Добавляем репозитория для установки PHP и модулей (так как в стандартных репозитория нету PHP 7.4):

add-apt-repository ppa:ondrej/php

Устанавливаем PHP 7.4 с стандартными модулями:

apt install php7.4 php7.4-fpm php7.4-cli php7.4-common php7.4-json php7.4-opcache php7.4-mysql php7.4-mbstring php7.4-zip php7.4-curl php7.4-gd php7.4-xml php7.4-dev

Далее, устанавливаем инструмент для сборки программного обеспечения (V8)

apt install ninja-build

И другие, необходимые для сборки проекта V8, инструменты:

apt-get install -y --no-install-recommends \
    libtinfo5 libtinfo-dev \
    build-essential \
    curl \
    git \
    libglib2.0-dev \
    libxml2 \
    python2 \
    patchelf \
    && sudo ln -sf /usr/bin/python2.7 /usr/bin/python \
    && cd /tmp \
    \
    && git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git --progress --verbose \
    && export PATH="$PATH:/tmp/depot_tools" \
    \
    && fetch v8 \
    && cd v8 \
    && git checkout 8.9.255.25 \
    && gclient sync \
    \
    && tools/dev/v8gen.py -vv x64.release -- is_component_build=true use_custom_libcxx=false

В том числе Depot tools — набор утилит Гугла для сборки проектов (V8).

Из важного — используется не последняя версия V8 из репозитория, а версия 8.9.255.25

Процесс сборки представлен ниже:

export PATH="$PATH:/tmp/depot_tools" \
    && cd /tmp/v8 \
    && ninja -C out.gn/x64.release/ \
    && mkdir -p /opt/v8/lib && mkdir -p /opt/v8/include \
    && cp out.gn/x64.release/lib*.so out.gn/x64.release/*_blob.bin out.gn/x64.release/icudtl.dat /opt/v8/lib/ \
    && cp -R include/* /opt/v8/include/ \
    && apt-get install patchelf \
    && for A in /opt/v8/lib/*.so; do patchelf --set-rpath '$ORIGIN' $A;done

После этого, можем скачивать и компилировать модуль V8Js:

cd /tmp \
    && git clone https://github.com/phpv8/v8js.git \
    && cd v8js \
    && git reset --hard e648f43 \
    && git checkout  e648f43 \
    && phpize \
    && ./configure --with-v8js=/opt/v8 LDFLAGS="-lstdc++" CPPFLAGS="-DV8_COMPRESS_POINTERS" \
    && make \
    && make install

В результате успешного выполнения всех процедур будет файл v8js.so в папке /usr/lib/php/20190902

Необходимо добавить его в конфиги ini PHP:

cd /etc/php/7.4/cli/conf.d/

Создаем новый ini файл. Можно использовать любой редактор. В примере ниже используется nano:

nano 50-v8js.ini

Вводим всего одну строчку в свежем файле:

extension=v8js.so

И сохраняет этот файл.

Приступим к проверке работоспособности. Для этого переходим в любую временную папку на сервер и создаем тестовый php файл

cd /tmp
nano test_v8js.php

В который вставляем следующий PHP код, задействующий V8Js :

<?php
$v8js = new V8Js();
$JS = <<< EOT
  var s = 'Hello world';
  s;
EOT;
$r = $v8js->executeString($JS);
var_dump($r);

Сохраняем файл и запускаем:

php test_v8js.php

В случае успеха увидим вывод в консоли:

string(11) "Hello world"

Установка PHP 7.4 с компиляцией модуля v8js на ubuntu 20

В официальных репозиториях V8 и V8JS достаточно информации по PHP 8+, но инструкции не работают для PHP 7.4. Поэтому пришлось самому экспериментировать, чтобы добиться положительных результатов.

Ниже, инструкция для установки из источников V8 и компиляция модуля V8JS для PHP 7.4 на операционной системе Ubuntu 20

Получаем рут права:

sudo su

Обновляем операционную систему, чтобы работать с самыми актуальными версиями пакетов и ПО:

apt-get update -y --fix-missing && apt-get upgrade -y;

Устанавливаем PHP 7.4 с самыми типовыми, необходимыми модулями:

apt install php7.4 php7.4-fpm php7.4-cli php7.4-common php7.4-json php7.4-opcache php7.4-mysql php7.4-mbstring php7.4-zip php7.4-curl php7.4-gd php7.4-xml php7.4-dev

Далее, устанавливаем инструмент для сборки программного обеспечения (V8)

apt install ninja-build

И другие, необходимые для сборки проекта V8, инструменты:

apt-get install -y --no-install-recommends \
    libtinfo5 libtinfo-dev \
    build-essential \
    curl \
    git \
    libglib2.0-dev \
    libxml2 \
    python \
    patchelf \
    && cd /tmp \
    \
    && git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git --progress --verbose \
    && export PATH="$PATH:/tmp/depot_tools" \
    \
    && fetch v8 \
    && cd v8 \
    && git checkout 8.9.255.25 \
    && gclient sync \
    \
    && tools/dev/v8gen.py -vv x64.release -- is_component_build=true use_custom_libcxx=false

В том числе Depot tools — набор утилит Гугла для сборки проектов (V8).

Из важного — используется не последняя версия V8 из репозитория, а версия 8.9.255.25

Процесс сборки представлен ниже:

export PATH="$PATH:/tmp/depot_tools" \
    && cd /tmp/v8 \
    && ninja -C out.gn/x64.release/ \
    && mkdir -p /opt/v8/lib && mkdir -p /opt/v8/include \
    && cp out.gn/x64.release/lib*.so out.gn/x64.release/*_blob.bin out.gn/x64.release/icudtl.dat /opt/v8/lib/ \
    && cp -R include/* /opt/v8/include/ \
    && apt-get install patchelf \
    && for A in /opt/v8/lib/*.so; do patchelf --set-rpath '$ORIGIN' $A;done

После этого, можем скачивать и компилировать модуль V8Js:

cd /tmp \
    && git clone https://github.com/phpv8/v8js.git \
    && cd v8js \
    && git reset --hard e648f43 \
    && git checkout  e648f43 \
    && phpize \
    && ./configure --with-v8js=/opt/v8 LDFLAGS="-lstdc++" CPPFLAGS="-DV8_COMPRESS_POINTERS" \
    && make \
    && make install

В результате успешного выполнения всех процедур будет файл v8js.so в папке /usr/lib/php/20190902

Необходимо добавить его в конфиги ini PHP:

cd /etc/php/7.4/cli/conf.d/

Создаем новый ini файл. Можно использовать любой редактор. В примере ниже используется nano:

nano 50-v8js.ini

Вводим всего одну строчку в свежем файле:

extension=v8js.so

И сохраняет этот файл.

Приступим к проверке работоспособности. Для этого переходим в любую временную папку на сервер и создаем тестовый php файл

cd /tmp
nano test_v8js.php

В который вставляем следующий PHP код, задействующий V8Js :

<?php
$v8js = new V8Js();
$JS = <<< EOT
  var s = 'Hello world';
  s;
EOT;
$r = $v8js->executeString($JS);
var_dump($r);

Сохраняем файл и запускаем:

php test_v8js.php

В случае успеха увидим вывод в консоли:

string(11) "Hello world"

Установка скомпилированной версии v8js в Ubuntu или CentOS для server-side rendering

  • Скачаем архив со скомпилированной версией расширения v8js.so

Получаем рут права

> sudo su
  • Создаем временную папку для скачивания и заходим в нее
# mkdir -p /opt/google
# cd /opt/google
  • Сохраняем архив с расширением для рендеринга на серверной стороне
# wget https://blog.bayrell.org/media/files/archives/v8-ubuntu-18.04-x64-6.4.388.18-2.1.0.tar.gz
  • Распаковываем архив тут же
# tar xvf v8-ubuntu-18.04-x64-6.4.388.18-2.1.0.tar.gz
  • Далее необходимо скопировать расширение в папку расширений для вашего PHP
    Получить папку с расширениями можно следующей командой
# php -i | grep extension_dir

Ниже можно увидеть результат команды

тогда копируем расширение в эту папку, в нашем случае это:

# cp /opt/google/v8/6.4/v8js.so /usr/lib64/php/modules
  • А теперь нужно добавить это расширение в ini конфиг php
    получаем папку, в которой хранятся дополнительные ini конфиги
# php -i | grep "additional .ini files"

Вывод будет примерно как на скриншоте ниже

Заходим в папку и создаем ini файл для v8js расширения
В нашем случае это:

# cd /etc/php.d
# nano 50-v8js.ini

И вставляем в файл следюущий код:

extension=v8js.so

Сохраняем файл (CTRL+O, CTRL+X)

  • Теперь можем проверить работоспособность установленного расширения
    Переходим в какую то временную папку на сервер и создаем тестовый php файл
# nano test_v8js.php

В который вставляем следующий код:

<?php
$v8js = new V8Js();
$JS = <<< EOT
  var s = 'Hello world';
  s;
EOT;
$r = $v8js->executeString($JS);
var_dump($r);

В случае успеха увидим вывод в консоли:

string(11) "Hello world"

Если, в качестве менеджера процессов вы используете, например, php-fpm — необходимо его перезагрузить

# systemctl restart php-fpm

Если у вас PHP 7.4 или инструкции выше не работают, можно обратиться к процедуре компиляции V8Js из официальных репозиториев для Ubuntu 20 или Ubuntu 22