将 V8 JavaScript 引擎做为 PHP 的扩展

红薯 发布于 2012/07/28 13:09
阅读 15K+
收藏 43

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

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

加载中
0
极品渣子
极品渣子
php很厉害!
0
p
pjiaxu.com
感觉有点“不伦不类“的样子,最好是扩展一下v8,加强一些IO的操作.
0
LongRaindy
LongRaindy
PHP+JS带来新的机遇啊
0
长宁楚王陈涉
长宁楚王陈涉

引用来自“pjiaxu.com”的答案

感觉有点“不伦不类“的样子,最好是扩展一下v8,加强一些IO的操作.
同意+
0
傅小黑
傅小黑
没什么意思吧。。现在js的效率都不好,封一层php更坑
0
Liuxd
Liuxd
虽然暂时没想到什么好用法,不过至少提供一个可能性,一个选择。挺有趣的。
0
Binx
Binx
这种跟本来就node.js高并发的优势,感觉就是玩一下,没有任何实用价值
0
悟庭
悟庭

引用来自“Boshu”的答案

这种跟本来就node.js高并发的优势,感觉就是玩一下,没有任何实用价值
同意,纯属娱乐。
0
Wen_小问
Wen_小问
完全纯属娱乐吧
0
叛道
叛道
 这样也行
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部