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.
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