2013-05-20 13 views
16

Próbuję użyć phantomJS do przechwycenia zrzutu ekranu adresu URL, jednak kiedy wołam phantomJS (z linii poleceń lub aplikacji internetowej) zawiesza się i seesm, aby nigdy nie wykonywać " exit() "zadzwoń. Nie mogę znaleźć komunikatów o błędach i pozostaje on uruchomiony, dopóki go nie zabiję. Jest to plik JS, który jest przekazywany do komendy phantomjs:PhantomJS wisi po wywołaniu z CLI lub Web

var page = require('webpage').create(); 
var system = require('system'); 
var script_address = ''; 
var page_to_load = ''; 
var members_id = ''; 
var activities_id = ''; 
var folder_path = ''; 

if (system.args.length < 5) 
{ 
    console.log('Usage: phantom_activity_fax.js script_address page_to_load members_id activities_id folder_path'); 
    console.log('#Args: '+system.args.length); 
    phantom.exit(); 
}//END IF SYSTEM.ARGS.LENGTH === 1 

//ASSIGN OUR ARGUMENTS RECIEVED 
script_address = system.args[0]; 
page_to_load = system.args[1]; 
members_id = system.args[2]; 
activities_id = system.args[3]; 
folder_path = system.args[4]; 

console.log(system.args[0]); 
console.log(system.args[1]); 
console.log(system.args[2]); 
console.log(system.args[3]); 
console.log(system.args[4]); 

//OPEN OUR PAGE WITH THE VALUES PROVIDED 
page.open(page_to_load, function() { 
    console.log("Entering Anonymous Function, Beginning RENDER:\n"); 
    page.render(folder_path+members_id+'_'+activities_id+'.png'); 
    phantom.exit(); 
}); 

widzę wartości przekazywane do konsoli, ale po to, że po prostu wisi :(Próbowałem inspektora sieci, ale nie mógł zrozumieć, gdzie aby wykonać wywołanie __run() i nie widziałem żadnej zmiany, gdy dodałem do połączenia debugger-autorun = yes :(.

To jest dane wyjściowe, które otrzymuję z wiersza poleceń po zawieszeniu (jako root użytkownik):

[[email protected] faxes]# phantomjs /var/www/wv-wellvibe2-test/javascripts/phantom_activity_fax.js https://wv-wellvibe2-test/manual_scripts/phantom_js_test_page.php 397 0 /var/www/wv-wellvibe2-test/uploads/images/faxes/ 
/var/www/wv-wellvibe2-test/javascripts/phantom_activity_fax.js 
https://wv-wellvibe2-test/manual_scripts/phantom_js_test_page.php 
397 
0 
/var/www/wv-wellvibe2-test/uploads/images/faxes/ 

I to jest wynik, jaki uzyskuję, gdy uruchamiam go jako mój własny użytkownik, ale „T zobacz plik obrazu w wyznaczonym folderze (faksów):

[[email protected] ~]$ phantomjs /var/www/wv-wellvibe2-test/javascripts/phantom_activity_fax.js https://wv-wellvibe2-test/manual_scripts/phantom_js_test_page.php 397 0 /var/www/wv-wellvibe2-test/uploads/images/faxes/ 
/var/www/wv-wellvibe2-test/javascripts/phantom_activity_fax.js 
https://wv-wellvibe2-test/manual_scripts/phantom_js_test_page.php 
397 
0 
/var/www/wv-wellvibe2-test/uploads/images/faxes/ 
Entering Anonymous Function, Beginning RENDER: 
[[email protected] ~]$ 

Niestety, jak już mówiłem, Polecenie zostało wykonane, ale nie zapisać .png w folderze faksów. Oto uprawnienia do tego folderu:

[[email protected] faxes]# ls -la 
total 12 
drwxr-xr-x 3 root apache 4096 May 16 15:31 . 
drwxr-xr-x 5 apache apache 4096 May 16 14:14 .. 
drwxr-xr-x 6 apache apache 4096 May 20 15:05 .svn 

Proszę dać mi znać, jeśli jest coś jeszcze, co mogę zapewnić! Dziękujemy!

(Zgodnie z wnioskiem o to skrypt PHP, który wywołuje proces Phantom JS)

header("Date: " . date('Y-m-d H:i:s')); 
//GET THE SMARTY CONFIG 
include_once $_SERVER['DOCUMENT_ROOT'] . "/smarty/configs/config.php"; 

//VARS USED LATER 
$process_script = $_SERVER['DOCUMENT_ROOT'] . '/javascripts/phantom_activity_fax.js'; 
$page_to_load = 'https://' . $_SERVER['HTTP_HOST'] . '/manual_scripts/phantom_js_test_page.php'; 
$members_id = $_SESSION['members_id']; 
$activities_id = 0; 
$folder_path = $_SERVER['DOCUMENT_ROOT'] . 'uploads/images/faxes/'; 
$system_response = ''; 


$call = "phantomjs --remote-debugger-port=65534 --remote-debugger-autorun=yes " . $process_script . " " . $page_to_load . " " . $members_id . " " . $activities_id . " " . $folder_path; 

echo 'CallingSystemWith: ' . $call . '<br />'; 

try 
{ 
    $system_response = system($call); 

    echo '<br />SystemResponse: ' . $system_response . '<hr />'; 
} catch (Exception $exc) { 
    echo $exc->getTraceAsString(); 
}//END TRY/CATCH 

(strona mówi PhantomJS do "zbiorczego pobierania" jest prosty skrypt PHP, który outtputs się print_r() z $ _SESSION i $ _REQUEST)

Odpowiedz

18

Jeśli coś pójdzie nie tak w twoim skrypcie (na przykład w page.render), phantom.exit() nigdy nie zostanie wywołane. Dlatego wydaje się, że phantomJs się zawiesił.

Być może jest problem z page.render, ale nie sądzę. Najczęstsze przyczyny zawieszania się są nieobsługiwanym wyjątkiem.

będę proponujemy 4 rzeczy do zbadania problemu:

  • dodać moduł obsługi do phantom.onError i/lub page.onError
  • hermetyzacji kodu w blokach try/catch (takich jak na page.render)
  • Po załadowaniu strony nie ma testu statusu zwrotnego. Lepiej sprawdzić stan, jak wydaje się zamarzać stan
  • podczas wywoływania page.render. Czy próbowałeś prostszej nazwy pliku w bieżącym katalogu? Może zamrożenie jest ze względu na bezpieczeństwo lub nieprawidłowej nazwy pliku

Nadzieja ta pomoże Ci

+0

Dziękuję za odpowiedź! Dodałem do skryptu polecenia try/catch i procedury obsługi onError, a skrypt uruchamia się w wierszu poleceń (zapisując pusty plik PNG). Nadal jednak zawiesza się, gdy uzyskuje się do niego dostęp za pośrednictwem przeglądarki internetowej. Masz pomysł, dlaczego wisi w sieci? – Danoweb

+0

puste PNG? Wydaje się, że jest błąd w page.open lub z url. Jak uruchomić skrypt za pomocą przeglądarki internetowej? nieprawidłowa ścieżka exec? spróbuj zalogować się do pliku. – Cybermaxs

+0

Dzięki dodatkom, które przygotowałam, odłożyłem słuchawkę! Okazuje się, że PhantomJS nie zastępuje pliku (tak jak to robi domyślne ustawienie PHP). Po usunięciu pliku obrazu i uruchomieniu ponownie nie otrzymuję rozłączenia! Dzięki Cybermaxs! – Danoweb

11

użytkowania (nieprawidłowe znaki):

$phantomjs --debug=true rasterize.js http://... test.pdf 

W rasterize.js dodać timeout na ressource, to był mój problem:

page.settings.resourceTimeout = 10000; // Avoid freeze!!!