【问题标题】:PhantomJS script hangs when executed from Rails controller on localhost从本地主机上的 Rails 控制器执行时,PhantomJS 脚本挂起
【发布时间】:2016-05-07 11:57:30
【问题描述】:

我正在使用 phantomjs gem:https://github.com/colszowka/phantomjs-gem

当脚本从控制器启动时:

Phantomjs.run('./public/javascripts/test.js')

rails 服务器在脚本运行时挂起,等待它完成。

phantomjs 脚本“test.js”如下所示:

var page = require('webpage').create();
page.viewportSize = { width: 1920, height: 1080 };
page.open('http://localhost:3000', function () {
  window.setTimeout(function () {
    page.render('./public/test.png');
    phantom.exit();
  }, 3000);
});

我假设问题是,rails 正在等待脚本完成,而 phantomjs 正在尝试访问 rails 服务器,但是由于服务器很忙,所以它们都互相支持。

有什么解决办法吗?

编辑地址@Artjom B.:

1) 是的,我在 ubuntu 14.04 LTS 上使用 PhantomJS 2.0,我会尝试更早的版本。
2)不确定你在这里问什么,我无法以这种方式从 phantomjs 访问日志,所以我看不到任何记录到控制台的内容。如果您知道解决此问题的方法,请告诉我。似乎无法在来自 ruby​​ 的 phantomjs 调用上运行 -debugger。
3) 是的,该脚本在命令行中运行良好,完全没有问题。
4) 也不关注你。 Phantomjs.run 命令在测试操作下从我的控制器触发。如果打开本地服务器以外的页面,此命令运行良好。

【问题讨论】:

  • 不接受多个连接的 Rails 服务器?我不这么认为,但我对rails一无所知。你在使用 PhantomJS 2 吗?您是否尝试过使用 PhantomJS 1.9.7?您是否检查了page.open() 回调的第一个参数(status)?如果从命令行运行 PhantomJS 脚本会返回吗?您是否正在从 / 路径运行 gem 命令,这样您实际上是在创建一个递归炸弹?此问题中没有足够的信息来诊断您的问题。请回答每个澄清请求并edit您的问题以添加缺失的信息。
  • @ArtjomB。我已经编辑了我的帖子以反映对您问题的回答。感谢您抽出时间来帮助我!
  • for 2) 我的意思是page.open('http://localhost:3000', function (status) { if (status !== "success") {phantom.exit(1);}...。一般来说,在 PhantomJS 上打开 localhost 会出现问题,但到目前为止我还没有遇到过这个问题。
  • @ArtjomB。啊,我明白了,我添加了那行,服务器仍然冻结。这就像 phantomjs 挂在 page.open('localhost:3000' 上并且不会走得更远。
  • @pguardiario 我正在使用应该处理并发进程的 Puma。

标签: javascript ruby-on-rails ruby phantomjs


【解决方案1】:

你必须使用像puma这样的多线程网络服务器。

有关不同选项的概述,请参阅 here

另一个陷阱可能是您的控制器逻辑。如果由 phantom 呈现的页面触发了与调用 phantom 的页面相同的控制器操作,则您将创建一个无限循环。

然后,即使是多线程服务器也会卡住:)


此问题与PhantomJS.rb freezing when trying to screen capture page in my rails application 重复 请关闭这个。我缺乏这样做或将其写为评论的声誉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    相关资源
    最近更新 更多