将 V8 JavaScript 引擎做为 PHP 的扩展

openkk 12年前

v8js 是一个 PHP 扩展,用来在 PHP 中提供 V8 这个 JavaScript 引擎的功能。

本文主要介绍如何使用 v8js

首先在 Ubuntu 12.04 的安装方法如下:
sudo apt-get install php5-dev php-pear libv8-dev build-essential  sudo pecl install v8js  sudo echo extension=v8js.so >>/etc/php5/cli/php.ini  sudo echo extension=v8js.so >>/etc/php5/apache2/php.ini  php -m | grep v8
下面是一个简单的测试脚本:
<?php  $start = microtime(true);  $array = array();  for ($i=0; $i<50000; $i++) $array[] = $i*2;    $array2 = array();  for ($i=20000; $i<21000; $i++) $array2[] = $i*2;    foreach ($array as $val) {    foreach ($array2 as $val2) if ($val == $val2) {}  }  echo (microtime(true)-$start)."\n"; // 8.60s      $start = microtime(true);  $v8 = new V8Js();  $JS = <<< EOT  var array = [];  for (i=0; i<50000; i++) array.push(i*2);    var array2 = [];  for (i=20000; i<21000; i++) array2.push(i*2);    for (key=0; key<array.length; key++) {    for (key2=0; key2<array2.length; key2++) if (array[key] == array2[key2]) {}  }  print('done.');  EOT;  $v8->executeString($JS, 'basic.js');  echo ' '.(microtime(true)-$start)."\n"; // 3.49s

在 PHP 中使用 JavaScript 处理某些操作时性能会比较好。

下面是在 node.js 中运行相同 js 代码的比较:

time node /tmp/test.js  real    0m0.729s

而 v8js 当时是 beta 版本,希望在正式版方面性能能有更多提升。

下面是 PHP 在使用 V8 引擎中一个使用数据库、会话和请求处理的例子:
// v8js currently crashes with mysqli_result, so wrap it  class DB extends MySQLi {    public function query($sql) {      return parent::query($sql)->fetch_all(MYSQLI_ASSOC);    }  }    // v8js currently has no support for references or magic __set(), so wrap it  class Session {    public function set($key, $value) {      $_SESSION[$key] = $value;    }    public function __get($key) {      if (isset($_SESSION[$key])) return $_SESSION[$key];      return null;    }    public function toJSON() {      return $_SESSION;    }  }    session_start();  $js = new V8Js();  $js->db = new DB('localhost', 'root', '', 'mydb');  $js->session = new Session();  $js->request = $_REQUEST;    $js->executeString(<<<EOT    print( PHP.db.query('select * from some_table limit 1')[0].some_column );    print( PHP.request.hello );      print( JSON.stringify( PHP.session ) ); // calls toJSON    print( PHP.session.invalid ); // null    print( PHP.session.hello );    PHP.session.set('hello', 'world');  EOT  );

英文原文,OSCHINA原创翻译