Установка v8js в Ubuntu 18.04
Процесс компиляции v8js для Ubuntu 18.04
Скомпилированная версия
Скачайте архив и разархивируйте его в /opt/google. Архив содержит библиотеку v8 и расширение v8js.so для php7.2.
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
Проверьте скачанный архив:
md5sum -b v8-ubuntu-18.04-x64-6.4.388.18-2.1.0.tar.gz
Должно быть:
5019edf488ace4c3a46449bf7cbb6e7b *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
В папке будет v8js.so его нужно скопировать в /usr/lib/php/20170718 и прописать в конфиге php:
cp /opt/google/v8/6.4/v8js.so /usr/lib/php/20170718
Например, nano /etc/php/7.2/cli/conf.d/50-v8js.ini
extension=v8js.so
Процесс компиляции
Выполнять компиляцию только в безопасном отдельном LXC контейнере.
Контейнер нужен, чтобы не сломать хост систему. Лучше собирать в контейнере. И скопировать готовый результат в хост систему.
Создайте контейнер, если ранее он не был создан:
lxc-create -t download -n test-ubuntu -- --dist ubuntu --release bionic --arch amd64
Запустите контейнер:
lxc-start test-ubuntu
Подключитесь к контейнеру:
lxc-attach test-ubuntu
Установка libv8 в контейнере:
apt update
apt install build-essential python python3 chrpath re2c git curl wget gcc-7 gcc-7-base libgcc-7-dev libglib2.0-dev -y
echo "mcgrathr:x:0:0:root:/root:/bin/bash" >> /etc/passwd
echo "thomasanderson:x:0:0:root:/root:/bin/bash" >> /etc/passwd
echo "eng:x:0:" >> /etc/group
echo "primarygroup:x:0:" >> /etc/group
# Установить depot_tools
mkdir -p /opt/google/src
cd /opt/google/src
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
# Включить инструменты depot_tools fetch and gclient
export PATH=/opt/google/src/depot_tools:"$PATH"
# Скачать v8
cd /opt/google/src
fetch v8
cd v8
# Остальные версии
# git checkout 5.6.326.12
# git checkout 6.4.388.18
# git checkout 7.5.288.23
# git checkout 7.9.335
# git checkout 8.4.49
# Рабочая версия
git checkout 6.4.388.18
gclient sync
# Компиляция
tools/dev/v8gen.py -vv x64.release -- is_component_build=true
ninja -C out.gn/x64.release libv8.so
# Прочие команды, которые не работают
# ./build/install-build-deps.sh
# tools/dev/gm.py x64.release
# ninja -C out/x64.release
# gn gen out.v8/x64 --args='use_custom_libcxx=false is_component_build=true is_debug=false target_cpu="x64" use_goma=false goma_dir="None" v8_enable_backtrace=true v8_enable_disassembler=true v8_enable_object_print=true v8_enable_verify_heap=true'
Скопируйте в /opt/google/src/v8 файлы:
cd /opt/google/src/v8
mkdir -p /opt/google/v8/6.4/{lib,include}
cp -v out.gn/x64.release/lib*.so out.gn/x64.release/*_blob.bin out.gn/x64.release/icudtl.dat /opt/google/v8/6.4/lib/
cp -vR include/* /opt/google/v8/6.4/include/
Сделайте патч библиотек. Это команда патчит пути поиска библиотек.
cd /opt/google/v8
apt-get install patchelf
for A in /opt/google/v8/6.4/lib/*.so; do patchelf --set-rpath '$ORIGIN' $A;done
Компиляция v8js
cd /opt/google/src
apt install php7.2-dev -y
git clone https://github.com/phpv8/v8js.git
cd v8js
# Версия для v8 6.4.388.18
git checkout 2.1.0
# Конфигурация
phpize
./configure --with-v8js=/opt/google/v8/6.4 LDFLAGS="-lstdc++"
# Компиляция и тестирование
make && make test
# Установка версии
make install
Далее нужно прописать в конфиге php nano /etc/php/7.2/cli/conf.d/50-v8js.ini
extension=v8js.so
Установка v8js через pecl
Данный способ не рекомендуется. Компилируйте через git, как указано выше
Выполните:
pecl install v8js-2.1.0
На вопрос где лежит libv8:
Please provide the installation prefix of libv8 [autodetect] :
укажите папку /opt/google/v8/6.4
Тестирование
Создайте файл test.php
<?php
$v8 = new V8Js();
$JS = <<< EOT
var s = 'Hello world';
s;
EOT;
$r = $v8->executeString($JS);
var_dump($r);
Запустите этот файл:
php test.php
Должно вывести:
string(11) "Hello world"