В 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"