2011-01-19 9 views
2

私は現在、768MBのRAMを搭載したLinuxベースのVPSを実行しています。このPHPスクリプトを避けてサーバーを停止させるにはどうすればよいですか?

ドメインの詳細を収集し、cURLを使用してサービスに接続して、これらのドメインのページランクの詳細を取得するアプリケーションがあります。

約50のドメインで検査を実行すると、スクリプトは詳細を解析してスクリプトに戻す前に、リモートページをすべての結果とともにロードするのに約3分かかります。これは、スクリプトの実行が終了するまで機能しないように見えるため、サイトのユーザーは、ページが読み込まれるのを待っている間にタイマー/ボールを得るだけです。

**(リモートページは、ドメインの詳細を取得し、AJAXでページを更新しますが、カール要求doesntの読み込みが完了するまでは(当然)ページを返す。

私がやっているならば、誰でも教えてもらえます明らかに間違っているか、それを実行する良い方法がある場合(キューには10〜10,000個のドメインが存在する可能性があるので、残りの部分に影響を与えずにバックグラウンドで実行できるプロセスが必要です)

ありがとう

+0

"それ以外は機能していないようです"。 PHPで解析された他のURL、またはすべてのURL(イメージなど)? – goat

+0

ちょうど明確にする – thatguy

+0

1)何も機能していないように私はPHPによって解析されたちょうどURLを意味する。画像は問題なく読み込まれます。 – thatguy

答えて

3

より賢明なアプローチは、ドメインデータをcronでトリガーされたPHP cliスクリプトを使用して「バッチ処理」することです。このように

、バックグラウンドスクリプトは、その後、falseとして設定された「処理済み」のフラグをデータベーステーブルに関連するドメインを考え挿入のだいったん:

  1. を「上がらないドメインのデータベースをスキャン処理済としてマークされます。

  2. はそれに応じて

  3. 更新など、データベースレコードをCURLのルックアップを実行し、処理済みとしてマーク。

    ...

既存の実行中のバッチ処理スクリプトとの重複を確保しないために、あなただけのどのくらいをチェックする(PHPスクリプト自体の中に)5分ごとにcronからPHPスクリプトを起動しなければなりませんスクリプトは「スキャン」ステージの開始時に実行され、4分以上実行されている場合は終了します。 (これらの数値を調整したいかもしれませんが、うまくいけば、これでどこに行くのか分かります)

この方法を使うと、バックグラウンドスクリプトを無期限に実行したままにすることができます再起動後に自動的に起動するなど)、ドメインをデータベースに追加したり、処理結果などを別のWebフロントエンドで確認するだけです。

+0

ありがとうMiddaparka 私は既に上記のようにmysql DBからプロセスをバッチ処理しています。 問題は、処理されていないドメインを取得して50のチェックを開始するたびに、プロセスが完了するまでそのページにページをロードできないことです。 – thatguy

+0

@thatguyあなたのVPSインスタンスがリソースキャップを打っている可能性があります(768MbのRAMを持っているかもしれませんが、CPU使用量などはどうですか?)バッチしようとするドメインの数を減らしても差はありませんか? (つまり、問題の原因となっている処理の負荷や継続時間ですか?) –

+0

こんにちは、 そのとおりです。ドメインの数は、スクリプトが実行する時間に影響を与えますが、処理負荷が原因で「フリーズアップ」されます。 私は%メモリ(0.9)と%cpu(0.2)を見ていますので、過度のように見えます。 一時的なクラッシュが発生した時点で、同じvpsで、別の名前の別のサイトが正常に動作していることに気付きました。 – thatguy

-1

コードの構造はわかりませんが、sleep()を試してみてください。帽子は私がバッチ処理の際に使うものです。

0

これは理想的なソリューションではありませんが、ユーザーの要求に基づいてこのプロセスをトリガーする必要がある場合は、スクリプトの最後に次の行を追加できます。

set_time_limit(0); 
flush(); 

これにより、PHPスクリプトは実行を継続できますが、出力はユーザーに返されます。しかし、真剣に、バッチ処理を使用する必要があります。それはあなたに何が起こっているのかをはるかにコントロールします。

0

まずは申し訳ありませんが、私はばかです! :)

サイトを別のブラウザ(FF)に読み込んでいて、うまく読み込めません。

Chromeは、サーバーの応答を待っているときにドメインに何らかのロックをかけているようだし、ブラウザを使って手動でスクリプトをテストしていたようだ。

ご協力いただき、ありがとうございました。

CJ

+0

奇妙なことですが、あなたはまだ生きて学びます:-)ちなみに、答えとして追加するのではなく、上記の情報であなたの質問を更新したいと思います。 (そうでなければ、人々はそれに気付く可能性がかなり低くなります)。 –

0

私はあなたがあなたのウェブサーバの外でこれらのタスクを処理して検討すべきである他の人と同意する一方で、より制御された方法で、私は、「サーバーの停止」の説明を提供します。

ネイティブのphpセッションを使用している場合、phpは排他ロック方式を使用しているため、一度に1つのphpプロセスで特定のセッションIDを処理できます。セッションを使用する長時間実行しているPHPスクリプトを使用すると、これが発生する可能性があります。

あなたが好きな用語の組み合わせを検索することができます。
phpのセッションの同時実行のロックsession_write_close()

私はそのここに何度も議論されて確信しています。私はあなたを検索するにはあまりにも怠惰です。多分誰かが一緒に来て、箇条書きのリストとかなりのハイパーリンクをstackoverflowの評判と引き換えに答えを出すだろう:) :)しかし、私:)

幸運。

関連する問題