【问题标题】:PhantomJS hanging when called from CLI or Web从 CLI 或 Web 调用时,PhantomJS 挂起
【发布时间】:2013-05-15 11:55:02
【问题描述】:

我正在尝试使用 phantomJS 来捕获 URL 的屏幕截图,但是当我调用 phantomJS(从命令行或 Web 应用程序)时,它挂起并且似乎永远不会执行“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();
});

我看到推送到控制台的值,但之后它只是挂起 :( 我尝试了网络检查器,但不明白在哪里执行 __run() 调用,当我没有看到任何变化在调用中添加了 debugger-autorun=yes :(.

这是我在挂起时从命令行获得的输出(作为 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。这是该文件夹的权限:

[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

如果还有什么我可以提供的,请告诉我! 谢谢!

(这里要求的是调用Phantom JS进程的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())

【问题讨论】:

    标签: javascript web-scraping phantomjs


    【解决方案1】:

    如果您的脚本出现问题(例如在page.render 中),则永远不会调用phantom.exit()。这就是 phantomJs 似乎挂起的原因。

    page.render 中可能存在问题,但我不这么认为。最常见的挂起原因是未处理的异常。

    我会建议你 4 件事来调查这个问题:

    • 将处理程序添加到phantom.onError 和/或page.onError
    • 将您的代码封装在 try/catch 块中(例如 page.render
    • 页面加载后,回调状态没有测试。最好检查状态
    • 调用page.render 时似乎卡住了。您是否尝试过在当前目录中使用更简单的文件名?也许冻结是因为安全或无效的文件名(无效字符?)

    希望对你有帮助

    【讨论】:

    • 感谢您的回答!我将 try / catch 和 onError 处理程序添加到脚本中,并且脚本在命令行上执行(保存空白 PNG 文件)。但是,当通过网络浏览器访问时,它仍然挂起。关于它为什么挂在网络上的任何想法?
    • 空白 PNG ? page.open 或 url 中似乎有错误。你如何通过网络浏览器运行脚本?无效的执行路径?尝试登录文件。
    • 感谢你让我做的补充,我解除了挂断!原来 PhantomJS 不会替换文件(就像 PHP 默认做的那样)。删除图像文件并再次运行后,我不再挂断!感谢 Cyber​​maxs!
    • 如果主机上有timeout 可用,您可以为命令设置超时:timeout -k 5s 30s phantomjs yourscript.js。如果进程在 30 秒后没有停止,它将终止进程。
    【解决方案2】:

    使用:

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

    在 rasterize.js 中添加资源超时,这是我的问题:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-04
      • 2013-09-28
      • 1970-01-01
      • 2023-03-08
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      相关资源
      最近更新 更多