2012-05-18 28 views
8

Tôi muốn chạy máy chủ ảo từ tập lệnh php của tôi, sau đó thực hiện yêu cầu curl và đọc phản hồi (phiên bản cuối cùng sẽ cung cấp đường dẫn để tạo pdf) . Khi chạy tập tin máy chủ phantomjs từ giao diện điều khiển và sau đó điều hướng đến địa chỉ của nó trong trình duyệt, mọi thứ hoạt động tốt. Đó là tập tin server.js:Khởi động máy chủ phantomjs từ php và chờ phản hồi

var server, service, page = require('webpage').create(), address, output, 
    html = '<!DOCTYPE><html><head></head><body><h1>FOOO</h1></body></html>'; 

server = require('webserver').create(); 

var rasterize = function(html, callback){ 
    address = 'http://localhost'; 
    output = '/Users/me/print.pdf' 
    page.viewportSize = { width: 600, height: 600 }; 
    page.open(address, function (status) { 
     if (status !== 'success') { 
      console.log('Unable to load the address!'); 
     } else { 
      window.setTimeout(function() { 
       page.content = html; 
       page.render(output); 
       callback(); 
      }, 2000); 
     } 
    }); 
} 

service = server.listen(8080, function (request, response) { 
    response.statusCode = 200; 

    rasterize(html, function(){ 
     response.write('<h1>BAR</h1>'); 
     response.close(); 
     phantom.exit();  
    }); 
}); 

Về cơ bản tôi đang mở địa chỉ localhost, chuyển đổi nội dung của trang để chuỗi html của tôi và sau đó lưu trang kết xuất dưới dạng pdf.

Bây giờ đến kịch bản php của tôi:

<? 
    function send_callback($data){ 
     echo '{type: success, data: '.$data.'}'; 
    } 

    function curl_post($url, array $post = NULL, array $options = array()) { 
     $defaults = array( 
      CURLOPT_POST => 1, 
      CURLOPT_HEADER => 0, 
      CURLOPT_URL => $url, 
      CURLOPT_FRESH_CONNECT => 1, 
      CURLOPT_RETURNTRANSFER => 1, 
      CURLOPT_FORBID_REUSE => 1, 
      CURLOPT_TIMEOUT => 5, 
      CURLOPT_POSTFIELDS => http_build_query($post) 
     ); 

     $ch = curl_init(); 
     curl_setopt_array($ch, ($options + $defaults)); 
     if(! $result = curl_exec($ch)) { 
      trigger_error(curl_error($ch)); 
     } 
     curl_close($ch); 
     send_callback($result); 
    } 

     shell_exec('phantomjs '.escapeshellarg(dirname(__FILE__).'/server.js')); 
     //wait to allow server to start 
     sleep(5); 

     $data = array('html'=> 'foo');  
     curl_post('http://localhost:8080', $data); 
?> 

Cũng không có ma thuật ở đây. Tôi thực thi lệnh phantomjs server.js trong terminal và sau 5s (thời gian để khởi động máy chủ) thực hiện yêu cầu curlPOST cho nó.
Bây giờ tôi có hai trường hợp:

  • Nếu tôi chạy php script từ giao diện điều khiển, với php script.php máy chủ bắt đầu như tôi có thể nhìn thấy quá trình đang chạy và các biểu tượng có thể nhìn thấy trong vành móng ngựa, nhưng tôi không bao giờ nhận được bất kỳ phản hồi từ nó và pdf không được tạo ra.
  • Nếu tôi chạy tập lệnh từ trình duyệt, biểu tượng không hiển thị trong thanh công cụ để máy chủ khởi động theo cách khác. Vẫn không có phản hồi cũng không phải pdf.

Có ai có thể thấy bất kỳ điều gì sai trong mã của tôi hoặc nghĩ ra bất kỳ cách gỡ lỗi nào không?

Thử nghiệm trên OSX 10.7, php 5.3.6, phantomjs mới nhất. Tài _www chạy máy chủ có đặc quyền quản trị, thư mục mà tôi đang viết các tập tin đã chmoded đến 777.

+1

Về mặt gỡ lỗi, tôi bắt đầu bằng cách xuất/ghi kết quả đầu ra của 'shell_exec()' - chỉ 'echo' sẽ đủ ở đó. Bước một là làm cho nó hoạt động từ CLI (tức là chạy 'php script.php') và sau đó làm việc để chạy nó từ web. Khi bạn nói "không nhận được phản hồi" - thì các ảo ảnh có bị treo không? Liệu kịch bản thoát hay treo? Bạn có thể chạy truy vấn phantomjs theo cách thủ công trên cá thể được bắt đầu bởi tập lệnh không? – mjec

Trả lời

3

Bạn có một vài vấn đề:

  1. phantomjs được bắt đầu ở mặt trước, có nghĩa là kịch bản php của bạn dừng/ngủ cho đến khi các phantomj dừng lại. Hoặc bắt đầu dịch vụ ảo ảnh, hoặc chạy nó trong nền. Xem "php execute a background process" để biết cách thực hiện.
  2. Máy chủ web có thể không truy cập "phần đồ họa" của hệ điều hành của bạn, điều đó có nghĩa là máy chủ web không thể tương tác với máy tính của bạn. Đây là lý do tại sao biểu tượng không xuất hiện, nhưng phantomjs vẫn nên bắt đầu.
Các vấn đề liên quan