php v8js

有时候大家在破解别人的加密算法会遇到加密算法是js的,在php里不能解析,除了将js加密算法用php重写外,还可以用v8js扩展

windows

地址是:https://github.com/phpv8/v8js

扩展下载地址是:https://s3.amazonaws.com/win-phpv8/v8js_vc14_php7_ts.zip

下载完成后,供4个文件,将php_v8js.dll放到php的extension目录下,并在Php.ini中,打开扩展 extension=php_v8js.dll

将剩下的三个文件:v8.dll、icuuc.dll、icui18n.dll 放到apache的bin目录下。

重启apache就可以了。注意,要求PHP版本是7.0以上。还有就是复制上面三个动态库到apache的bin目录,否则会报错:

PHP Warning:  PHP Startup: Unable to load dynamic library 'D:\\***\\php7.0.5\\ext\\php_v8js.dll' - \xef\xbf\xbd\xd2\xb2\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xd6\xb8\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xc4\xa3\xef\xbf\xbd\xe9\xa1\xa3\r\n in Unknown on line 0

linux

首先在 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
);

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

windows:

首先检查您的PHP是线程安全性的还是非安全性的,因为我们需要知道要下载正确的模块。你可以在Windows中运行一个简单的命令来检查这个。代码如下:

php -i | findstr "Thread"

如果结果输出是Thread Safety => enabled,那说明你的PHP版本是线程安全性的,反之亦然。
当然你也可以新建个PHP文件,用php_info();来获取你PHP的信息。

接下来,在Jan-E这里下载完整的编译好的PHP版本:
https://www.apachelounge.com/viewtopic.php?t=6359
然后你可以从里面提取出你需要的文件,将它们解压到各自的文件夹中:
\php\ 文件夹:

  • v8.dll
  • v8_libbase.dll
  • v8_libplatform.dll
  • icui18n.dll (php7)
  • icuuc.dll (php7)

\php\ext\文件夹:

  • php_v8js.dll

还有最后一步,配置你的php.ini文件:

; V8 Javascript Engine Module
extension=php_v8js.dll

最后重启你的服务就可以了!!!

提供个简单的例子:

<?php

$v8 = new V8Js();

/* basic.js */
$JS = <<< EOT

var string1 = 'Hello' + ' ' + 'World!';
len = print(string1+"\\n");
var string2 = 'Hello' + ' ' + 'World2!';
len2 = print(string2+"\\n");
string1+","+string2;
EOT;

try {
  $temp = $v8->executeString($JS, 'basic.js');
  $temp = explode(",",$temp);
  print_r($temp);
} catch (V8JsException $e) {
  print_r($e);
}

运行结果如下:

[Running] php "e:worktest.php"
Hello World!
Hello World2!
Array
(

[0] => Hello World!
[1] => Hello World2!

)

[Done] exited with code=0 in 0.622 seconds

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值