2012-05-18 16 views
8

Chciałem uruchomić serwer phantomjs z mojego skryptu php, a następnie wysłać do niego żądanie curl i odczytać jego odpowiedź (co w ostatecznej wersji da ścieżkę do wygenerowanego pdf) . Podczas uruchamiania pliku serwera phantomjs z konsoli, a następnie nawigacji do jego adresu w przeglądarce, wszystko działa dobrze. To plik server.js:Uruchamianie serwera phantomjs z php i oczekiwanie na jego odpowiedź

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

Zasadniczo mam otwarciu podczas wizyty localhost, przełączanie zawartości strony do mojego html ciąg, a następnie zapisać świadczonych stronę jako pdf.

Teraz przychodzi mój skrypt 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); 
?> 

również nie ma tu magia. Polecenie phantomjs server.js wykonuję w terminalu, a po 5 sekundach (czas, aby zainicjować serwer), wykonaj polecenie curlPOST.
Teraz mam dwa przypadki:

  • Jeśli uruchomić skrypt php z konsoli, z php script.php serwer zacznie jak widzę zakonczeniu i ikona jest widoczna w portach, ale nigdy nie dostać żadnej odpowiedzi od to i plik pdf nie jest tworzony.
  • Jeśli uruchomię skrypt z przeglądarki, ikona nie będzie widoczna w doku, więc serwer zacznie działać w inny sposób. Wciąż brak odpowiedzi ani pdf.

Czy ktoś może zobaczyć cokolwiek złego w moim kodzie lub pomyśleć o jakichkolwiek sposobach jego debugowania?

Testowanie na OSX 10.7, php 5.3.6, phantomjs najnowsze. _www użytkownik uruchamiający serwer ma uprawnienia administratora, folder, w którym piszę pliki zostały CHMOD na 777.

+1

Jeśli chodzi o debugowanie, zacznę od wyprowadzania/rejestrowania danych wyjściowych 'shell_exec()' - wystarczy tylko "echo". Pierwszym krokiem jest uruchomienie go z CLI (np. Uruchomienie 'php script.php'), a następnie praca nad jego uruchomieniem z sieci. Kiedy mówisz "nie otrzymuj odpowiedzi" - czy phantomjs się zawiesi? Czy skrypt się kończy lub się zawiesi? Czy możesz ręcznie uruchomić kwerendę phantomjs na instancję uruchomioną przez skrypt? – mjec

Odpowiedz

3

Masz kilka kwestii:

  1. phantomjs uruchamiany jest na pierwszym planie, czyli skrypt php zatrzymuje/śpi, dopóki nie zatrzyma się phantomjs. Uruchom usługę phantomjs lub uruchom ją w tle. Zobacz "php execute a background process", aby uzyskać poradnik HowTo.
  2. Serwer internetowy prawdopodobnie nie ma dostępu do "części graficznej" systemu operacyjnego, co oznacza, że ​​nie może wchodzić w interakcje z komputerem. Dlatego ikona nie pojawia się, ale phantomjs powinien się uruchomić.
Powiązane problemy