我试图获取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
变量。
有什么想法吗?
答案 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();