0

Windows でプロセス メモリを監視しているため、配列内の多くのページ (数千単位) を開くと、メモリ リークが発生しているようです。

これを読んで、http://phantomjs.org/api/webpage/method/close.htmlを使用することにしました

以下はコードです

var casper = require("casper").create({
      verbose: true,
      logLevel: 'debug',
      pageSettings: {
        userAgent: 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0'
      }
    }),
    utils = require('utils');

casper.start();

casper.thenOpen('http://www.google.com/', function(response) {
  this.echo(this.getTitle());
});

casper.then(function() {
  casper.page.close();
});

casper.thenOpen('http://www.yahoo.com/', function(response) {
  this.echo(this.getTitle());
});

casper.run(function() {
  console.log('End');
  casper.exit();
});

しかし、それは私にエラーを与えました:

Error: cannot access member `customHeaders' of deleted QObject
  test:1182 in open
  test:1555 in _step
  test:1335 in runStep
  test:332 in checkStep

pageでは、別のページを開く前に毎回オブジェクトを閉じるにはどうすればよいでしょうか? それともより大きな問題は、Phantom.js でメモリ リークを防ぐ方法ですか?

4

1 に答える 1

0

このシナリオで何が起こっているのかを完全に理解しているかどうかはわかりませんが、問題の解決策は次のとおりです。

...
casper.then(function() {
    casper.page.close();
    casper.page = require('webpage').create();
});

casper.thenOpen('http://www.yahoo.com/', function(response) {
    this.wait(1000, function() {
        this.echo(this.getTitle());
    });
});
...

close() - 「ページを閉じて、それに関連付けられたメモリ ヒープを解放します。これを呼び出した後、ページ インスタンスを使用しないでください。」<-これはphantomjsのドキュメントからのものです。引き続きサイトを開きたい場合は、新しいページ インスタンスを作成する必要があります。お役に立てれば!

于 2013-08-09T21:35:39.300 に答える