CasperJS viene chiamato da PHP utilizzando un comando exec()
. Dopo che CasperJS fa il suo lavoro come recuperare parti di una pagina web, come possono essere restituiti i dati recuperati a PHP?CasperJS che passa dati a PHP
9
A
risposta
8
È possibile reindirizzare l'output da stdout a un array.
Su this pagina che dice che si può fare:
string exec (string $command [, array &$output [, int &$return_var ]])
E continua dicendo:
Se l'argomento di uscita è presente, allora la matrice specificata sarà riempito con ogni linea di uscita dal comando.
Quindi in pratica si può eseguire exec ('comando casperjs qui, $ array_here);
24
Penso che il modo migliore per trasferire i dati da CasperJS a un'altra lingua come PHP sia eseguire lo script CasperJS come servizio. Poiché CasperJS è stato scritto su PhantomJS, CasperJS può utilizzare un modulo server Web incorporato di PhantomJS denominato Mongoose.
Per informazioni su come funziona il server Web incorporato vedere here
Ecco un esempio di come uno script CasperJS può avviare un server web.
//define ip and port to web service
var ip_server = '127.0.0.1:8585';
//includes web server modules
var server = require('webserver').create();
//start web server
var service = server.listen(ip_server, function(request, response) {
var links = [];
var casper = require('casper').create();
function getLinks() {
var links = document.querySelectorAll('h3.r a');
return Array.prototype.map.call(links, function(e) {
return e.getAttribute('href')
});
}
casper.start('http://google.fr/', function() {
// search for 'casperjs' from google form
this.fill('form[action="/search"]', { q: 'casperjs' }, true);
});
casper.then(function() {
// aggregate results for the 'casperjs' search
links = this.evaluate(getLinks);
// now search for 'phantomjs' by filling the form again
this.fill('form[action="/search"]', { q: 'phantomjs' }, true);
});
casper.then(function() {
// aggregate results for the 'phantomjs' search
links = links.concat(this.evaluate(getLinks));
});
//
casper.run(function() {
response.statusCode = 200;
//sends results as JSON object
response.write(JSON.stringify(links, null, null));
response.close();
});
});
console.log('Server running at http://' + ip_server+'/');
Mentre sono d'accordo che si tratta di una buona tecnica, in teoria, in pratica casper non liberare phantomjs risorse, non sembra essere in aumento in modo lineare l'utilizzo di memoria con ogni richiesta. Ho provato ad aggiungere '' 'casper.clear()' '' e anche a hacking clear() a '' 'chiama this.page.close()' '' (dalla pagina clear()). Mentre chiamare close sembra aiutarlo a non risolvere il problema. – danmux