博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
服务器端 PHP执行js代码
阅读量:7000 次
发布时间:2019-06-27

本文共 3283 字,大约阅读时间需要 10 分钟。

有时候需要在服务端代码里模拟运行一些js脚本代码,java里有mozilla提供的纯java实现的js引擎,使用起来也很简单,不过项目里需要在php里实现,在网上兜了一圈,还真找到相关的方案,做法是使用mozilla的本地动态链接库,然后再使用一个叫php-js-ext的php扩展实现php对js运行环境的调用。
以下转载一下网上找来的安装方案:
项目主页
php-js-ext是mozilla javascript解释器和php之间的一座桥梁,因此我们除了需要下载最后版本为0.1.2的php-js-ext,还需要下载最新版本为1.7.0的mozilla js,链接如下(php-js-ext 0.1.2发布时是配合js-1.5工作,但经我测试,也可以配合js-1.7工作)
 
wget
wget http://ftp.mozilla.org/pub/mozilla.org/js/js-1.7.0.tar.gz
PS:  aurore.net貌似已经关闭了,大家想办法去其它地方下载吧~
ftp://193.105.142.100/pub/FreeBSD/ports/local-distfiles/chinsan/php-js-ext-0.1.2.tar.bz2
 
系统是Ubuntu 10.10
1.安装mozilla js
解开js-1.7.0.tar.gz
 
tar zxvf js-1.7.0.tar.gz
cd js/src
 
开始编译(如不能完成编译见最后说明)
 
make -f Makefile.ref
 
拷贝libjs.so到/usr/lib
 
cp Linux_All_DBG.OBJ/libjs.so /usr/lib
ldconfig
 
拷贝头文件到/usr/include
 
cp jsapi.h jscompat.h jslong.h jsosdep.h jsotypes.h jspubtd.h jstypes.h jsproto.tbl jsconfig.h Linux_All_DBG.OBJ/jsautocfg.h /usr/include/
 
自此mozilla js的安装工作就完成了,下面开始进行php-js-ext的安装
 
2. 查看是否有php-config
如果你是安装非开发版本的php的话,那就缺少后续编译所需要的一些头文件等信息,需要安装php5-dev,直接apt-get install php5-dev 即可,再检查/usr/bin/php-config
 
3.安装php-js-ext
解开php-js-ext-0.1.2.tar.bz2
 
tar jxvf php-js-ext-0.1.2.tar.bz2
cd php-js-ext-0.1.2
 
配置并编译安装(如有一个以上的php存在或configure无法找到php的位置,需要在configure的时候指定--with-php-config=/usr/bin/php-config)
 
./configure  --with-php-config=/usr/bin/php-config
make
make install
 
如果一切无误,js.so已经在你的php的lib目录(例如 /usr/lib/php5/20090626/js.so)
 
最后,修改你的php.ini,在相应的位置加入extension=js.so,并确认extension_dir的设定正确。
或者在/etc/php5/conf.d下创建个js-ext.ini 写入 extension=js.so,然后重启apache。
输出一个phpinfo的结果,以查看js.so是否被正确加载和可能的错误信息。
如果一切无误的话,我们就可以开始使用这个功能了。
这里附上官方网站的使用说明:
 
A simple ./configure; make; make install should do the trick. Make sure to add an extension=js.so line to your php.ini/php.d. Note: you need to install libjs first. If you're using a Redhat-esque system, you can use the SRPM provided above, else, use the TBZ.
Then, just use js_eval to evaluate your JavaScript. js_eval returns the value returned by the JavaScript interpreter to PHP.
For example:
js_eval_r("var a = 123;");
js_eval_r("var b = 456;");
$c = js_eval_r("[a, b];");
echo "a is ".$c[0]."n";
echo "b is ".$c[1]."n";
js_eval_r("var sum = function(x, y) { return x + y; }");
$d = js_eval_r("sum(a, b);");
echo "The sum of a and b is ".$d."n";
Would produce:
a is 123
b is 456
The sum of a and b is 579
js_eval takes an optional boolean argument, assoc, which returns objects as associative arrays instead of PHP objects.
The php-js execution environment provides two built-in JavaScript system functions:
* print 
* gc 
print outputs its argument to the php output stream.
gc forces garbage collection within the JavaScript environment.
 
(非Redhat的linux发行版可能会在mozilla js的编译过程中产生错误,是因为连接器和内核已经不对a.out提供支持,我们需要用gcc来生成一个共享库而不是ld了。打开js/src/config/Linux_All.mk,将第50行的 MKSHLIB = $(LD) -shared $(XMKSHLIBOPTS) 更改为 MKSHLIB = $(CC) -shared $(XMKSHLIBOPTS) ,make -f Makefile.ref clean后再次尝试编译。)
 
 
补充,windows上的实现方案,但并不完美,只能支持JScript
利用windows的com组件解析js 
 
$oScript = new COM("MSScriptControl.ScriptControl"); 
$oScript->Language = "JavaScript"; 
$oScript->AllowUI = false; 
$oScript->AddCode("function s(x){return x * x;}"); 
$a=$oScript->Run("s", "3"); 
echo $a;   // 9 
 
这样做有两个问题 
1. 只能在windows环境下执行 
2. MSScriptControl只支持两种脚本语言 一是VBScript。二是JScript,而JScript和JavaScript是有区别的 

 

转载于:https://www.cnblogs.com/zhongbin/p/3171152.html

你可能感兴趣的文章
异常:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值...
查看>>
nginx访问静态文件配置
查看>>
mysql索引
查看>>
ubuntu server 14.04 上安装jdk1.8
查看>>
python file.tell() 在windows下需要注意的地方
查看>>
10种简单的数字滤波C语言源程序算法
查看>>
oracle 中 dual 详解
查看>>
HDU1870 愚人节的礼物【堆栈+输入输出】
查看>>
什么是并发用户数?并发用户数怎么计算?
查看>>
1、Linux基础认识
查看>>
Git在Githib和Github上的使用
查看>>
visual studio 编辑窗口 设置固定选项卡 使窗口选项卡多行显示
查看>>
处在LV1太长了··
查看>>
软件工程综合实践阶段小结
查看>>
人工神经网络简介
查看>>
改善我们的神经网络
查看>>
文件操作的其他模式
查看>>
链表与顺序表的对比
查看>>
windows phone 8 新增功能:从一个应用程序启动另一个程序(file association 和 Protocol association两种方式)...
查看>>
Angularjs总结(七) 路由及请求服务等
查看>>