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