3

状況:

クロールテストの目的で、vpsubuntuサーバーでアプリを実行したいと思います。私のアプリは、パッケージマネージャーmeteor-routerで「atmosphere」から使用します。mrtでインストールされたphantomjsを搭載した私のローカルmacosx 10.8ではbrew、すべてが正常に機能します。追加することで、自分のページの素敵なスナップショットを取得します

http://sample.com/?_escaped_fragment_=

URLに。

問題:

私のubuntuvpsサーバーで同じことを試してみましょう。2つの方法:

1)バンドルされていないアプリをサーバーにコピーし、mrt runコマンドで実行します:不安定に動作します。時々それは大丈夫になります。しかし、動的コンテンツが空白になることがあります。私のデータベースが空のように。

2)バンドルされていないアプリをサーバーとそのアプリにコピーしmrt bundle fname.tgzてから、.tgzを解凍しmain.js、ノードで実行します。このようにスパイダブルは絶対に間違って動作します。試行するたびに、動的データではなく空白になります。

私の考え:

私のubuntuマシンは、ローカルマシンよりもはるかに少ないメモリとプロセッサリソースを持っています。そのため、動的コンテンツの生成に時間がかかりますが、ファントムはページが終了したと見なし、流星がレンダリングされる前にスナップショットを作成します。

助言がありますか?

4

2 に答える 2

2

私はこの問題を解決したと思います。それは本当にspiderable.jsファイルの問題です。このモジュールは、REPL状態でphantomjsを実行し、stdinによってそのようなコードを提供します。

var url = '" + url + "';
var page = require('webpage').create();
page.open(url);

setInterval(function() {
  var ready = page.evaluate(function () {
    if (typeof Meteor !== 'undefined'
        && typeof(Meteor.status) !== 'undefined'
        && Meteor.status().connected) {
      Meteor.flush();
      return Meteor._LivedataConnection._allSubscriptionsReady();
    }
    return false;
  });

  if (ready) {
    var out = page.content;
    out = out.replace(/<script[^>]+>(.|\\n|\\r)*?<\\/script\\s*>/ig, '');
    out = out.replace('<meta name=\"fragment\" content=\"!\">', '');

    console.log(out);
    phantom.exit();
  }
}, 100);

問題は、すべてのMeteor条件に合格すると、page.contentが100%更新されたと見なされることです。そうではありません。if私が見つけてテストした解決策は、ブロックをラップするsetTimeoutことです(500msは私にとっては問題なく機能しました):

  if (ready) {
    setTimeout(function () {
      var out = page.content;
      out = out.replace(/<script[^>]+>(.|\\n|\\r)*?<\\/script\\s*>/ig, '');
      out = out.replace('<meta name=\"fragment\" content=\"!\">', '');

      console.log(out);
      phantom.exit();
    }, 500);
  }
于 2013-01-26T00:29:51.250 に答える
0

page.openこれを行う適切な方法は、のようににコールバックを渡すことだと思います(ドキュメントを参照)。

page.open(url, function (status) {
    ...
};

また、スナップショットのタイムアウトに依存する場合は、タイムアウトを減らしてサイクルでラップし、速度を上げて信頼性を高めます。

page.open(url, function (status) {
    if(status !== 'success') {
        phantom.exit();
        return;
    }

    function isReady() {
        return page.evaluate(function () {
            if('undefined' === typeof Meteor
            || 'undefined' === typeof(Meteor.status)
            || !Meteor.status().connected)
                return false;
            Meteor.flush();
            return Meteor._LivedataConnection._allSubscriptionsReady();
        }
    }

    function trySnapshot() {
        if(!isReady()) {
            setTimeout(trySnapshot, 100);
            return;
        }
        console.log(page.content
            .replace(/<script[^>]+>(.|\\n|\\r)*?<\\/script\\s*>/ig, '')
            .replace('<meta name=\"fragment\" content=\"!\">', '')
        );
        phantom.exit();
    }
    trySnapshot();
};

page.openまた、コールバックが適切なタイミングで呼び出されるため、最後のスニペットはタイムアウトなしで頻繁に実行されると思います

于 2015-05-01T16:22:42.980 に答える