Estoy tratando de tomar el valor de la entrada am, uso AJax para enviar estas variables a una función php, llamar a PhantomJS desde dicha función PHP CON estos argumentos pasados desde AJax y devolver el resultado a la página HTML . Estoy pasando las variables al archivo PHP perfectamente bien, el problema surge al llamar a PhantomJS con mi script seguido de los tres argumentos.
Este es el script en mi página de PHP para llamar a 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)));Este es el script al que se hace referencia en el script de 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") }); Como puede ver, debería ser un proceso relativamente simple, excepto que no se está haciendo echo en nada. Los permisos para cada archivo son más que adecuados, y estoy seguro de que estos archivos se están ejecutando porque si cambio el script de shell para ejecutar hello.js , todo se echo y se registra perfectamente.
TAMBIÉN TENGA EN CUENTA que este script se está ejecutando en mi servidor web, por lo que no estoy 100% seguro de que HAYA una variable system .
¿Algunas ideas?
Primer problema, shell_exec() toma un solo argumento ( Documentación ). Sin embargo, su ejemplo está pasando el argumento de shell ($sitio web) como un segundo argumento en shell_exec().
Ejemplo corregido:
$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));Para simplificar, excluí la redirección de la tubería de error. Además, le sugiero que pase los argumentos como JSON envuelto en codificación base64. Esto elimina el espaciado de URL que genera múltiples argumentos. Una vez que PhantomJS recibe los argumentos del sistema, use atob() para recuperar el JSON e iterar sobre el JSON obj en lugar de los argumentos de cadena sin formato.
También le recomendaría este proyecto: https://github.com/merlinthemagic/MTS , Under the hood es una instancia de PhantomJS, el proyecto solo envuelve la funcionalidad de 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();