如何将动态JS文件传递给PhantomJS

时间:2017-03-18 05:26:57

标签: javascript php jquery ajax

我试图获取am输入的值,使用AJax将这些变量提交到php函数中,从所述PHP函数调用PhantomJS,并从AJax传递这些参数,并返回结果回到HTML页面。我将变量完全传递给PHP文件,问题来自于使用我的脚本调用PhantomJS后跟三个参数。

这是PHP页面上用于调用PhantomJS

的脚本
echo json_encode(array("abc" => shell_exec('/Applications/XAMPP/htdocs/scripts/phantom/bin/phantomjs /Applications/XAMPP/htdocs/scripts/phantom/examples/test.js 2>&1',$website)));

这是shell脚本中引用的脚本:

var args = require('system').args;
args.forEach(function(arg, i) {

    console.log(i+'::'+arg);

});
var page = require('webpage').create();
var address = args[1];
page.open(address, function () {
    console.log("Done")
}); 

正如你所看到的,它应该是一个相对简单的过程,除了根本没有echo'd。每个文件的权限都绰绰有余,我确信这些文件正在执行,因为如果我更改shell脚本以运行hello.js Everything echo并完美记录日志。

另请注意此脚本正在我的网络服务器上执行,因此我并非100%确定存在system变量。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

第一个问题,shell_exec()只接受一个参数(Documentation)。但是,您的示例是将shell参数($ website)作为shell_exec()的第二个参数传递。

更正示例:

$shellReturn = shell_exec("/Applications/XAMPP/htdocs/scripts/phantom/bin/phantomjs /Applications/XAMPP/htdocs/scripts/phantom/examples/test.js " . $website);
echo json_encode(array("abc" => $shellReturn));

为简单起见,我排除了错误管道的重定向。另外我建议你将参数传递为包含在base64编码中的JSON。这消除了URL间距,导致多个参数。一旦PhantomJS收到系统args,使用atob()将JSON带回并迭代JSON obj而不是原始字符串参数。

我还要指出这个项目:https://github.com/merlinthemagic/MTS,幕后是PhantomJS的一个实例,该项目只包含了PhantomJS的功能。

$myUrl          = "http://www.example.com"; //replace with content of your $website variable 
$windowObj      = \MTS\Factories::getDevices()->getLocalHost()->getBrowser('phantomjs')->getNewWindow($myUrl);

//if you want the DOM or maybe screenshot and any point run:
$dom       = $windowObj->getDom();
$imageData = $windowObj->screenshot();