とあるサーバーサイドエンジニアの備忘録

バグのないプログラムは存在しないらしいですが、デバッグの不可能なプログラムもまた存在しないのですよ

PHP V8jsをubuntu 16.04で使おうとしたら失敗した話

前回の失敗を踏まえて、ubuntuならすんなりと動くという情報をキャッチした私は南米へ飛ばずubuntuで試してみることにしました。

試した環境

必要なもの

準備

必要になるツールをインストールします。

apt-get install build-essential git python libglib2.0-dev
cd /tmp
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=`pwd`/depot_tools:"$PATH"

V8のインストール

V8jsはV8を使うのでもちろんV8が必要です。なのでV8をインストールします。

ソースの取得

fetch v8
cd ./v8
git checkout 5.6.326.12
gclient sync

かなり時間がかかりますので、マッドマックス怒りのデスロードでも見て待ちましょう。今回は見ません。

コンパイル

コンパイルにはninjaというツールを使います。TAXi2のように「ニンジャ~!」と叫んでコンパイルを走らせるわけです。叫ばないですけど。

tools/dev/v8gen.py -vv x64.release
echo is_component_build = true >> out.gn/x64.release/args.gn
ninja -C out.gn/x64.release
make library=shared snapshot=off native

こちらもかなり時間がかかりますのでV8エンジンの祈りでもして待ちましょう。おいしい紅茶を飲むのもいいと思います。

必要なファイルをコピーする

mkdir -p /opt/v8/{lib,include}
cp out.gn/x64.release/lib*.so out.gn/x64.release/*_blob.bin /opt/v8/lib/
cp -R include/* /opt/v8/include/
cp out.gn/x64.release/lib*.so out.gn/x64.release/*_blob.bin /usr/lib/
cp -R include/* /usr/include/
cp out/native/lib.target/lib*.so /usr/lib/
cp out/native/*_blob.bin /usr/lib/
cp -R include/* /usr/include

PHPのインストール

PHPは7.0以上が必要です。とりあえず入れます。

apt-get install php php7.0-dev
# php -v
PHP 7.0.8-0ubuntu0.16.04.3 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.8-0ubuntu0.16.04.3, Copyright (c) 1999-2016, by Zend Technologies

pearのインストール

V8jsはPECLを使ってインストールします。PECLを使うにはpearが必要です。なのでpearをインストールしてPECLでインストールします。

apt-get install php-pear

V8jsのインストール

やっとここまで来ました。長かったですね。

pecl install v8js
Build complete.
Don't forget to run 'make test'.

running: make INSTALL_ROOT="/tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3" install
Installing shared extensions:     /tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3/usr/lib/php/20151012/
running: find "/tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3" | xargs ls -dils
296656    4 drwxr-xr-x 3 root root    4096 Dec 13 15:11 /tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3
296702    4 drwxr-xr-x 3 root root    4096 Dec 13 15:11 /tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3/usr
296703    4 drwxr-xr-x 3 root root    4096 Dec 13 15:11 /tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3/usr/lib
296704    4 drwxr-xr-x 3 root root    4096 Dec 13 15:11 /tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3/usr/lib/php
296705    4 drwxr-xr-x 2 root root    4096 Dec 13 15:11 /tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3/usr/lib/php/20151012
296701 2780 -rwxr-xr-x 1 root root 2846520 Dec 13 15:11 /tmp/pear/temp/pear-build-rootII1C92/install-v8js-1.3.3/usr/lib/php/20151012/v8js.so

Build process completed successfully
Installing '/usr/lib/php/20151012/v8js.so'
install ok: channel://pecl.php.net/v8js-1.3.3
configuration option "php_ini" is not set to php.ini location
You should add "extension=v8js.so" to php.ini

php.iniの設定

php.iniにextension=/usr/lib/v8js.soを追加します。

php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

確認してみる。

# php -m | grep v8js
v8js

やったね!
これでインストールは完了です。CentOSの時と違ってすごくスムーズにインストールできました。

PHPで動かす

とりあえず適当にPHPを書いて動かしてみましょう。

<?php
$v8 = new V8js();
php test.php
ここで動いてサンプルのコード載せて終わると思うじゃないですか。僕もそう思ってたんですよ。  
  
  
  
  
  
  
動きませんでした。  
何を言っているのかわからないと思いますが、私もなぜ動かないのかわかりません。  
エラーはCentOSの時と同じくシンボルが見つからないというエラーですが、何が何だかさっぱりわかりません……。  
違うバージョンのV8でも試してみましたが、同じエラーが出て動きませんでした。  
とりあえずV8jsはここでいったん終わりたいと思います。もう気力がない……