将 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原创翻译