PhantomJS没有杀死webserver客户端连接

时间:2016-05-29 16:49:58

标签: webserver phantomjs casperjs

我有一种在WebServer模块上运行的代理服务器,我注意到这台服务器因内存消耗而被杀死。

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

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

server.js

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

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

Processes enter image description here

(那些过程甚至更多,它只是列表的一个片段)

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

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

谢谢!

编辑:

我之前提到的流程是线程,没有我认为的独立流程(check this)。

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

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

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

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

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

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

如果您需要更多或具体的信息,请向我询问。

再次感谢您的阅读!

1 个答案:

答案 0 :(得分:1)

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

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

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

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