2016-05-29 4 views
1

私はWebServerモジュール上で実行されている種類のプロキシサーバーを持っていて、メモリ消費のためにこのサーバーが強制終了されていることに気付きました。PhantomJSがWebサーバークライアント接続を強制終了しない

サーバーが新しい要求を取得するたびに、それは子クライアントプロセスを作成します。問題は、プロセスが無期限に存続することです。ここで

は、私が使用しているサーバーです:

server.js

私はresponse.close()が閉鎖し、クライアント接続を殺したと思ったが、そうではありません。ここで

はホテルトップに表示される子プロセスのリストです:

Processes enter image description here

(これらのプロセスは、リストの単なる断片である、もっとある)

私は本当にする必要がすべての空きメモリを使用しているため、これらのプロセスを強制終了します。何か不足していますか?

私は単純にサーバーを再起動できますが、メモリは無駄になります。

ありがとう!

編集:私は(check this)思ったように私は前に述べた

プロセスはスレッドなしindependientプロセスです。

すべてのhttp要求で新しいスレッドが作成されますが、これは問題ありませんが、スクリプトが終了してもこのスレッドは強制終了されません。

また、リクエストハンドラがcasper(私はcasper.run(..)を意味する)を実行しないと、新しいスレッドが作成されないことがわかりました。

したがって、新しいスレッドは、サーバーがcasperインスタンスを実行している場合にのみ作成されます。問題は、このインスタンスが実行関数の後に終了しないことです。

私はcasper.done()を次のように試しましたが、現在実行中のスレッドではなくプロセス全体が終了します。 (私はこの機能のための文書を見いだせなかった)。

同じマシンのサーバー外で他のcasperスクリプトを実行すると、インスタンス化されたスレッドとファントムプロセス全体が正常に終了します。何が起こるでしょうか?

私はPhantom 2.1.1とCasper 1.1.1を使用しています。

詳細または具体的な情報が必要な場合は、私に質問してください。

読んでいただきありがとうございます!

答えて

1

これはキャスパーとよく知られている問題です:

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

それはキャスパーの人たちによって固定されておらず、現在は拡張としてマークされています。私はそれが彼らの優先リストにないと思う。

とにかく、回避策はサーバーサイドコンポーネントを書き込むことです。着信要求を処理するnode.jsサーバー。すべての要求に対して、新しい子プロセスでスクレイピングを実行するcasperスクリプトを実行します。この子プロセスは、casperがそのジョブを終了すると閉じられます。これは回避策ですが、すべての要求に対して子プロセスを開くコストが安くないため、最適な解決策ではありません。これに類似したアプローチを大きく拡張することは難しいでしょう。ただし、十分な回避策です。この完全に合理的なアプローチの詳細は、上のリンクにあります。

+0

こんにちは、私はこれを試みましたが、私のサーバーを殺します。私はcasper.die()のような他のコマンドも試しましたが、それらのすべてはサーバーを停止して終了します。私は質問を更新しました。 – Alstrat

+0

ローカルに実行された場合、このサーバーをテストするためにあなたはどのURLを使用しますか?これをローカルで実行し、process_request関数のロジックを単純化してcasperを使用していくつかのページを開き、htopで監視するために少し演奏しました。複数のスレッドが開かれているのが見えません。あなたはこの奇妙な振る舞いを見ません。どうすればこのサーバをテストして、あなたが使っているURLを私に提供してください。 –

+0

私はこれを再現できます。それは非常に奇妙なスレッドの多くは、各受信要求で開かれている..サーバーが実際にすぐに失敗します! –

関連する問題