【问题标题】:PhantomJS not killing webserver client connectionsPhantomJS 没有杀死网络服务器客户端连接
【发布时间】:2016-05-29 16:49:57
【问题描述】:

我有一种在 WebServer 模块上运行的代理服务器,我注意到该服务器由于其内存消耗而被终止。

每次服务器收到新请求时,它都会创建一个子客户端进程,我看到的问题是该进程无限期地保持活动状态。

这是我正在使用的服务器:

server.js

我以为response.close() 正在关闭并终止客户端连接,但事实并非如此。

这是显示在 htop 上的子进程列表:

(那些流程就更多了,只是列表的一个片段)

我真的需要杀死这些进程,因为它们正在使用所有可用内存。我错过了什么吗?

我可以简单地重新启动服务器,但仍然会浪费内存。

谢谢!

编辑:

我之前提到的进程是线程,并不是我想象的独立进程(check this)。

每个http请求都会创建一个新线程,这没关系,但是脚本结束后这个线程并没有被杀死。

另外,我发现如果请求处理程序不运行 casper(我的意思是 casper.run(..)),则不会创建新线程。

因此,只有在服务器运行 casper 实例时才会创建新线程,问题是该实例不会在 run 函数结束后结束。

我尝试了casper.done(),如下所述,但它杀死了整个进程而不是当前正在运行的线程。 (我没有找到这个函数的任何文档)。

当我在同一台机器的服务器之外执行其他 casper 脚本时,实例化线程和整个幻象进程成功结束。会发生什么?

我正在使用 Phantom 2.1.1 和 Casper 1.1.1 版本。

如果您想了解更多或具体信息,请随时问我。

再次感谢阅读!

【问题讨论】:

    标签: webserver phantomjs casperjs


    【解决方案1】:

    这是 casper 的一个众所周知的问题:

    https://github.com/casperjs/casperjs/issues/1355

    casper 人员尚未修复此问题,目前已标记为增强功能。我猜这不在他们的优先名单上。

    无论如何,解决方法是编写一个服务器端组件,例如一个 node.js 服务器来处理传入的请求,并为每个请求运行一个 casper 脚本来在新的子进程中进行抓取。当 casper 终止它的工作时,这个子进程将被关闭。虽然这是一种解决方法,但它不是最佳解决方案,因为为每个请求打开子进程的成本并不便宜。很难大规模扩展与此类似的方法。但是,这是一个足够的解决方法。更多关于这种完全明智的方法的信息在上面的链接中。

    【讨论】:

    • 嗨,我试过这个,但它会杀死我的服务器。我还尝试了其他命令,例如 casper.die(),但所有这些命令都以服务器关闭而结束。我已经更新了问题。
    • 如果在本地运行,你用什么 url 来测试这个服务器?我让它在本地运行并进行了一些操作以简化 process_request 函数中的逻辑,以使用 casper 打开几个页面并使用 htop 进行监视。我没有看到多个线程被打开。我正在测试使用 apache bench 发送同时请求..我没有看到这种奇怪的行为..您如何测试此服务器请提供您使用的网址..
    • 我现在可以重现 .. 当我弄清楚时我会回来提供一个解决方案 .. 很奇怪每个传入的请求打开了多少线程 .. 服务器确实很快失败了!
    • 为了您的方便,我修改了我的答案,现在这应该是一个更好的指南。我将自己解决这个问题并为 casper 家伙创建一个拉取请求。完成后我会在这里更新 :) 干杯!
    • 我正在尝试从 PHP 服务器运行它,调用系统。不幸的是,这个程序不能识别 phantomjs 的二进制文件。正如你所提到的,我认为调用 casperjs 作为正常的系统命令将解决我的内存问题。非常感谢。我会尽快用我的结果更新这个问题。
    猜你喜欢
    • 1970-01-01
    • 2011-12-26
    • 2012-05-12
    • 1970-01-01
    • 2019-04-27
    • 2013-05-18
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    相关资源
    最近更新 更多