読者です 読者をやめる 読者になる 読者になる

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

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

PHP V8jsをCentOS7で使おうとして失敗した話

PHP CentOS

事の発端

会社で勉強会の発表をしないといけない。

PHPのドキュメントを読んでいたらV8jsなるものを見つける。

最近業務でNode.jsやったしこれいいんじゃねと飛びつく。

V8jsとは

V8jsとは、Googleが開発したJavaScriptエンジンであるV8をPHPから利用するためのモジュールです。
つまりどういうことかと言いますと、PHPからjavaScriptを実行できるようになります。何を言っているんだこいつはと思うかもしれませんが、そういうことです。
闇を感じますが、PHPの公式ドキュメントにもあるちゃんとしたライブラリです。でもPHPの闇の一部であることは間違いないと思います。
http://php.net/manual/ja/book.v8js.php

環境

Vagrant + CentOS 7.2

必要なもの

PythonGCCはCentOS7以上なら最初から入っていますので楽です。

  • Google V8
  • Python 2.7以上
  • GCC 4.6以上
  • PHP 7.0以上
  • Git
  • glib2-devel
  • build-essential(Development Tools)

準備

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

yum install git python glib2-devel
yum groupinstall "Development Tools"
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

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

コンパイル

公式ではninjaだけでコンパイルみたいに書いてますが、なぜかninjaでエラーが出てmakeじゃないと通らなかった。CentOSだと失敗するみたい。

ninjaでやる場合
tools/dev/v8gen.py -vv x64.release
echo is_component_build = true >> out.gn/x64.release/args.gn
echo v8_enable_i18n_support = false >> out.gn/x64.release/args.gn
ninja -C out.gn/x64.release

makeでやる場合
make library=shared i18nsupport=off native

こちらもかなり時間がかかりますのでV8エンジンの祈りでもして待ちましょう。

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

ninjaでコンパイルした場合
cp out.gn/x64.release/lib*.so out.gn/x64.release/*_blob.bin /usr/lib/
cp -R include/* /usr/include/

makeでコンパイルした場合
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以上が必要です。とりあえずPHP7.0を入れます。ここが重要で、リポジトリの指定によってはモジュールが読み込めなくなります。

yum install --enablerepo=remi-php70 php php-devel
# php -v
PHP 7.0.14 (cli) (built: Dec  7 2016 10:15:15) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

pearのインストール

V8jsはPECLを使ってインストールします。PECLを使うにはpearが必要です。なのでpearをインストールしてPECLでインストールします。
そのままyum installしてしまうと5.4が入ってしまうので、php70を指定します。

yum install php-pear --enablerepo=remi,remi-php70

V8jsのインストール

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

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

running: make INSTALL_ROOT="/var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3" install
Installing shared extensions:     /var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3/usr/lib64/php/modules/
running: find "/var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3" | xargs ls -dils
 2645281    0 drwxr-xr-x 3 root root      16 12月 13 12:04 /var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3
12754412    0 drwxr-xr-x 3 root root      18 12月 13 12:04 /var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3/usr
22128224    0 drwxr-xr-x 3 root root      16 12月 13 12:04 /var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3/usr/lib64
27375476    0 drwxr-xr-x 3 root root      20 12月 13 12:04 /var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3/usr/lib64/php
 2645299    0 drwxr-xr-x 2 root root      20 12月 13 12:04 /var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3/usr/lib64/php/modules
 2645300 2664 -rwxr-xr-x 1 root root 2727845 12月 13 12:04 /var/tmp/pear-build-vagrantSQuNiQ/install-v8js-1.3.3/usr/lib64/php/modules/v8js.so

Build process completed successfully
Installing '/usr/lib64/php/modules/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

ビルド通ったあああああ!
ここまで来るのに7日間くらい時間使ってます。火の七日間と呼んでもいいんじゃないかと思うくらい調べてやり直して調べての繰り返しでした。でも技術ってそうやって覚えていくものだよね!

php.iniの設定

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

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

確認してみる。

# php -m | grep v8js
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/v8js.so' - /usr/lib64/php/modules/v8js.so: undefined symbol: _ZN2v88platform21CreateDefaultPlatformEi in Unknown on line 0

なんやて工藤。ちょっと何言ってるのかわからないですね。
どうやらCentOS 7.2で発生する問題らしい。「通常は起こらないんだけど、V8jsは特殊なリンクを使っているから起こる」みたいなことを外人がGithubで言ってました。
Vagrantでやってるからなのか、それともCentOSだからなのか、それとも私のやり方がまずいのか。とりあえずubuntuでやってみようということでCentOS +V8jsはここで見切りをつけました。
まあ失敗は成功の母と言いますからね。何事もチャレンジが大事ですよ。
ubuntu編はまた後日公開します。