c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Scrapbox で公表中です。

Programming は GitHub で開發中です。

PHP で V8js を使ひ JavaScript を実行する

PHPJavaScript を実行したい。裏で node.js を動かすと云ふ方法がある。毎回 node command を走らせてるとバカだから、裏で node.js の server を立ち上げておいて、其所と socket なり HTTP なりで通信する。めんどい。
其所でPHPから直接V8を呼び出す事ができる。試しにやってみる。

cf. PECL :: Package :: v8js http://pecl.php.net/package/v8js
cf. PHP: V8js - Manual http://www.php.net/manual/en/book.v8js.php

Install

Debian 7.5 に入れる。

cf. Running JavaScript inside PHP code | Web Builder Zone http://css.dzone.com/articles/running-javascript-inside-php

sudo apt-get install php5 php-pear php5-dev libv8-dev libv8-dbg build-essential
sudo pecl install v8js-0.1.3
sudo vi /etc/php5/cli/php.ini

php5 は PHP 本体です。
php-pearpear command と pecl command をinstallします。
php5-dev は PHP extention の build に必要です。
libv8-dev は libv8 (V8 JavaScript Engine) を読み込む software の build に必要な header file です。
libv8-dbg は libv8 の debug 用 symbol で、libv8 が一緒に入ります。libv8-3.8.9.20 が入りました。
build-essential は、gcc とか make とかの、標準的な build に必要な tool 一式です。

PECL で V8js module を install するのですが、V8js module には stable 版が無く、beta 迄しか無いので、 v8js-beta をinstall する必要があります。又、最新の beta (0.1.5) と 0.1.4 は libv8 の 3.17.11 に依存するので、 v8js-0.1.3 を入れてゐます。
cf. PHP: 共有 PECL 拡張モジュールを、pecl コマンドを用いてコンパイルする - Manual http://www.php.net/manual/ja/install.pecl.pear.php

最後に php.ini を開き、末尾に

extension=v8js.so

を追記しました。

php -m | grep v8js

追加されてゐます。install に成功したやうです。php -iphpinfo(); を見ると、

$ php -i
...

v8js

V8 Javascript Engine => enabled
V8 Engine Compiled Version => 3.8.9.20
V8 Engine Linked Version => 3.8.9.20
Version => 0.1.3

Directive => Local Value => Master Value
v8js.flags => no value => no value
v8js.max_disposed_contexts => 25 => 25

...

v8jsの節が追加されてゐます。成功です。

PHPからJavaScriptを実行する

毎回 V8Js を new して負荷を掛ける。

<?php

function callJs()
{
    $v8 = new V8Js;
    $js = <<< 'JS'
var ans = 2 * 3 * 7;
print(ans + '\n');
'RETURNS ' + ans;
JS;
    try {
        var_dump($v8->executeString($js));
    } catch (V8JsException $e) {
        var_dump($e);
    }
}

for ($i = 0; $i < 100; ++$i) {
    callJs();
}

簡単だ。速度も問題ない(〃l _ l)b☆