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

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

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はここでいったん終わりたいと思います。もう気力がない……

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

事の発端

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

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編はまた後日公開します。

ごあいさつ

あぶさんと申します。とりあえず自己紹介をします。

 

略歴

コンピュータ系の専門学校に3年通いプログラミングを学びました。このころはC、C++C#がメインでしたが、仕事で使えるようなレベルではないと思います(ブランクがあるというのもあります)。

不動産ポータルサイト開発、Web系のシステム開発を4年と2ヵ月やってきました。PHPJavaScriptCSS、HTML、MySQLPostgreSQLLinuxを覚えました。おまけとして賃貸のことに詳しくなりました。

今はPHPを武器にしてゲーム会社でサーバーサイドエンジニアをやっています。テーブル設計やら、いろんなミドルウェアやら、やらなきゃいけないことがいっぱいです。

Androidでゲームを作ったこともありますが、ライブラリを一切使わずネイティブで全部書いてました。ソースもapkも消失してしまったのが残念。

 

なぜブログを始めるか

もうそろそろプログラマーという職になってから5年ですが、今まで技術的な情報を発信するということをやってきませんでした。環境がだいぶアレでしたので、自分のことで精いっぱいだったというのもありますが、これではいかんということで始めた次第です。

目標は1日1記事と言いたいところですが、1週間に1記事くらいで勘弁してください。よく言うじゃないですか。最初から強気な計画立てると痛い目見るって。

たまに技術と関係ない記事もあるかと思いますが、よろしくお願いします。