PhantomJS висит при вызове из CLI или Web - программирование
Подтвердить что ты не робот

PhantomJS висит при вызове из CLI или Web

Я пытаюсь использовать phantomJS для захвата скриншота URL-адреса, однако, когда я вызываю phantomJS (из командной строки или веб-приложения), он зависает и видит, чтобы никогда не выполнял вызов "exit()". Кажется, я не вижу сообщений об ошибках, и он продолжает работать, пока я не убью его. Это файл JS, который передается команде phantomjs:

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

Я вижу значения, нажатые на консоль, но после этого он просто зависает:( Я пробовал веб-инспектора, но не мог понять, где выполнить вызов __run(), и не видел никаких изменений, когда я добавлен отладчик-autorun = yes для вызова: (.

Это результат, который я получаю из командной строки, когда он зависает (как пользователь root):

[[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/

И это результат, который я получаю при его запуске как мой собственный пользователь, но я не вижу файл изображения в указанной папке (факсы):

[[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] ~]$ 

К сожалению, как я уже сказал, команда завершена, но не сохранила .png в папке факсов. Вот разрешения для этой папки:

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

Пожалуйста, дайте мне знать, если есть что-нибудь еще, что я могу предоставить! Спасибо!

(В соответствии с запросом здесь находится PHP script, который вызывает процесс 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

(Страница, на которой он сообщает PhantomJS "scrape", представляет собой простой PHP script, который выдает print_r() из $_SESSION и $_REQUEST)

4b9b3361

Ответ 1

Если что-то пойдет не так в вашем script (например, в page.render), phantom.exit() никогда не будет вызываться. Вот почему фантомы, кажется, висеть.

Может быть, проблема в page.render, но я так не думаю. Наиболее распространенными причинами зависаний являются необработанное исключение.

Я предлагаю вам 4 вещи для изучения проблемы:

  • добавьте обработчик phantom.onError и/или page.onError
  • инкапсулируйте свой код в блоки try/catch (например, для page.render)
  • После загрузки страницы нет теста на статус обратного вызова. Лучше проверить статус.
  • кажется, замерзает при вызове page.render. Вы пробовали более простое имя файла в текущем каталоге? Может быть, замораживание происходит из-за безопасности или недопустимого имени файла (недопустимые символы?)

Надеюсь, это поможет вам

Ответ 2

Использование:

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

В rasterize.js добавить тайм-аут на ressource, это была моя проблема:

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