web-dev-qa-db-ja.com

CLIまたはWebから呼び出されたときにPhantomJSがハングする

PhantomJSを使用してURLのスクリーンショットをキャプチャしようとしていますが、(コマンドラインまたはWebアプリから)phantomJSを呼び出すと、ハングして「exit()」呼び出しを実行しないように見えます。エラーメッセージが見つからないようで、強制終了するまで実行されたままになります。これは、phantomjsコマンドに渡されるJSファイルです。

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

値がコンソールにプッシュされているのがわかりますが、その後ハングします:( Webインスペクターを試しましたが、__ run()呼び出しを実行する場所がわかりませんでした。また、デバッガーを追加しても変化は見られませんでした。 -autorun = yes to the call :(。

これは、(rootユーザーとして)ハングしたときにコマンドラインから取得する出力です。

[root@wv-wellvibe2 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/

これは、自分のユーザーとして実行したときに得られる出力ですが、指定されたフォルダー(ファックス)に画像ファイルが表示されません。

[user@wv-wellvibe2 ~]$ 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:
[user@wv-wellvibe2 ~]$ 

残念ながら、私が言ったように、コマンドは完了しましたが、.pngをfaxフォルダーに保存しませんでした。そのフォルダの権限は次のとおりです。

[root@wv-wellvibe2 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

他にご提供できるものがありましたらお知らせください。ありがとうございました!

(ここで要求されているのは、PhantomJSプロセスを呼び出すPHPスクリプト)です。

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に「スクレイプ」するように指示するページは単純なPHPスクリプトで、$ _SESSIONと$ _REQUESTのprint_r()を出力します)

17
Danoweb

スクリプトで問題が発生した場合(_page.render_など)、phantom.exit()が呼び出されることはありません。そのため、phantomJsがハングしているように見えます。

_page.render_に問題があるかもしれませんが、私はそうは思いません。ハングの最も一般的な原因は、未処理の例外です。

問題を調査するために4つのことを提案します:

  • phantom.onError および/または page.onError にハンドラーを追加します
  • コードをtry/catchブロックにカプセル化します(_page.render_など)
  • ページが読み込まれると、コールバックステータスのテストは行われません。ステータスを確認することをお勧めします
  • _page.render_を呼び出すとフリーズするようです。現在のディレクトリでもっと簡単なファイル名を試しましたか?おそらくフリーズはセキュリティまたは無効なファイル名(無効な文字?)が原因です

これがお役に立てば幸いです

20
Cybermaxs

使用する :

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

ラスタライズ.jsで、リソースにタイムアウトを追加します。これが私の問題でした。

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