PhantomJS 没有终止网络服务器客户端连接

PhantomJS not killing webserver client connections

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

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

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

server.js

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

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

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

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

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

谢谢!

编辑:

我之前提到的进程都是线程,并没有像我想的那样是独立的进程(check this)。

每个 http 请求都会创建一个新线程,这没问题,但是这个线程不会在脚本结束后被杀死。

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

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

我试过 casper.done() 如下所述,但它杀死了整个进程而不是当前的 运行ning 线程。 (我没有找到此功能的任何文档)。

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

我使用的是 Phantom 2.1.1 和 Casper 1.1.1 版本。

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

再次感谢阅读!

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

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

它还没有被 casper 的家伙修复,目前被标记为增强。我想这不在他们的优先列表中。

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