2012-05-18 5 views
8

Volevo eseguire un server phantomjs dal mio script php, quindi fare una richiesta di arricciatura e leggere la sua risposta (che nella versione finale darà un percorso al pdf generato) . Quando si esegue il file del server phantomjs dalla console e quindi si naviga verso il suo indirizzo nel browser, tutto funziona correttamente. Questo è il file server.js:Avvio del server phantomjs da php e attesa della sua risposta

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

Fondamentalmente sto aprendo addres localhost, passando il contenuto della pagina per la mia stringa HTML e salvando pagina visualizzata in formato PDF.

Ora arriva il mio script 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); 
?> 

Anche qui nessuna magia. Eseguo il comando phantomjs server.js nel terminale e dopo 5 secondi (tempo di inizializzazione del server) eseguo una richiesta di arricciatura su di esso.
Ora ho due casi:

  • Se corro script php da console, con php script.php il server inizia come posso vedere il processo in esecuzione e l'icona è visibile sul banco degli imputati, ma non ho mai ottenuto alcuna risposta da parte e il pdf non è stato creato.
  • Se eseguo lo script dal browser, l'icona non è visibile nel dock in modo che il server si avvii in un altro modo. Ancora nessuna risposta né pdf.

Qualcuno può vedere qualcosa di sbagliato nel mio codice o pensare a qualche modo di debugarlo?

Test su OSX 10.7, php 5.3.6, ultimo phantomjs. _www utente che esegue il server ha privilegi di amministratore, la cartella in cui sto scrivendo file sono stati permessi CHMOD 777.

+1

In termini di debug, vorrei iniziare con l'output/logging dell'output di 'shell_exec()' - solo 'echo' sarà sufficiente lì. Il primo passo è far sì che funzioni dalla CLI (cioè eseguendo 'php script.php') e poi continui a eseguirlo dal web. Quando dici "non ottieni risposta" - phantomjs si blocca? Lo script esce o si blocca? È possibile eseguire manualmente la query phantomjs sull'istanza avviata dallo script? – mjec

risposta

3

Hai diverse questioni:

  1. phantomjs viene avviato in primo piano, il che significa che lo script php si ferma/dorme fino a quando si ferma il phantomjs. Avvia il servizio phantomjs o eseguilo in background. Vedi "php execute a background process" per un HowTo.
  2. Il server Web potrebbe non accedere alla "parte grafica" del sistema operativo, il che significa che non può interagire con il desktop. Questo è il motivo per cui l'icona non viene visualizzata, ma i phantomjs dovrebbero comunque essere avviati.
Problemi correlati