2013-04-06 44 views
9

CasperJS đang được PHP gọi bằng lệnh exec(). Sau khi CasperJS thực hiện công việc của mình như truy xuất các phần của trang web, làm thế nào dữ liệu được truy xuất có thể được trả lại cho PHP?CasperJS truyền dữ liệu trở lại PHP

Trả lời

8

Bạn có thể chuyển hướng đầu ra từ stdout tới một mảng.

On this trang nó nói rằng bạn có thể làm:

string exec (string $command [, array &$output [, int &$return_var ]]) 

Nó tiếp tục nói:

Nếu đối số đầu ra là hiện nay, sau đó các mảng được chỉ định sẽ được lấp đầy với tất cả các dòng đầu ra từ lệnh.

Về cơ bản, bạn có thể thực hiện lệnh exec ('lệnh casperjs tại đây, $ array_here);

24

Tôi nghĩ cách tốt nhất để chuyển dữ liệu từ CasperJS sang ngôn ngữ khác như PHP đang chạy tập lệnh CasperJS làm dịch vụ. Bởi vì CasperJS đã được viết trên PhantomJS, CasperJS có thể sử dụng một mô-đun máy chủ web nhúng của PhantomJS gọi là Mongoose.

Để biết thông tin về cách thức hoạt động của máy chủ web nhúng here

Dưới đây là một ví dụ về cách một kịch bản CasperJS có thể bắt đầu một máy chủ web xem.

//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+'/'); 
+8

Trong khi tôi đồng ý rằng đây là một kỹ thuật tốt về lý thuyết, trong thực tế casper không giải phóng tài nguyên ảo, dường như sử dụng bộ nhớ tăng dần theo tuyến tính với mỗi yêu cầu. Tôi đã thử thêm '' 'casper.clear()' '' và thậm chí hacking clear() vào '' 'gọi this.page.close()' '' (từ trong trang clear()). Trong khi gọi gần xuất hiện để giúp nó không giải quyết được vấn đề. – danmux

Các vấn đề liên quan