2012-05-18 101 views
8

我想從我的php腳本運行一個phantomjs服務器,然後對它執行一個curl請求並讀取它的響應(在最終版本中會給出生成的pdf的路徑) 。從控制檯運行phantomjs服務器文件,然後在瀏覽器中導航到它的地址時,一切正常。這就是server.js文件:從php啓動phantomjs服務器並等待它的響應

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();  
    }); 
}); 

基本上我打開本地主機ADDRES,切換頁面的內容,我的HTML字符串,然後保存渲染頁面的PDF。

現在到了我的PHP腳本:

<? 
    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); 
?> 

也沒有神奇的在這裏。我在終端中執行phantomjs server.js命令,並在5s(初始化服務器的時間)後對其執行curlPOST請求。
現在我有兩種情況:

  • 如果我運行從控制檯的PHP腳本,用php script.php服務器開始,我可以看到進程的運行狀態和圖標在碼頭看到,但我從來沒有得到任何迴應它和pdf不會被創建。
  • 如果我從瀏覽器運行腳本,圖標在擴展塢中不可見,所以服務器以其他方式啓動。仍然沒有迴應,也沒有pdf。

任何人都可以在我的代碼中看到任何錯誤或想到任何調試方法嗎?

在OSX 10.7,php 5.3.6,phantomjs latest上測試。運行服務器的用戶_www具有管理員權限,文件夾,我在寫文件被chmoded 777

+1

在調試方面,我首先輸出/記錄'shell_exec()'的輸出 - 只需''echo'就足夠了。第一步是使用CLI(即運行'php script.php'),然後從網絡運行它。當你說「得不到迴應」時 - phantomjs掛了嗎?腳本是否退出或掛起?你可以手動在腳本啓動的實例上運行phantomjs查詢嗎? – mjec

回答

3

你有幾個問題:

  1. phantomjs在前臺,這意味着你的PHP腳本停止啓動/一直睡到phantomjs停止。啓動phantomjs服務,或者在後臺運行它。有關HowTo的信息,請參閱「php execute a background process」。
  2. Web服務器可能無法訪問操作系統的「圖形部分」,這意味着它無法與桌面進行交互。這就是爲什麼圖標沒有出現,但phantomjs仍應該開始。