0

PHPスクリプトは本番Webサーバーで1回だけ実行されます。スクリプトは大量のdbレコードをロードしてから、それらを反復処理し、フィールドをjson_decodingしてチェックします。一部のフィールドは修正され、データベースに保存されます。

スクリプトは大量のメモリを消費し、1時間以上実行される可能性があります。

このタイプのスクリプトで、サイトがダウンしたり、そのようなスクリプトのその他の潜在的な危険が発生したりしないようにすることに関して、私は何を覚えておく必要がありますか。

スクリプトの基本的なフローは次のとおりです。

1. load all records from db table
2. iterate over each row
  2.1 json_decode specific field
  2.2 if a matching field is found then
      2.2.1 Change the value 
      2.2.2 Save back to the database
4

3 に答える 3

3

必ずCronジョブなどを使用して設定し、低ロード時間で実行してください。これはサイトのユーザーによって異なるため、訪問を分析して適切なウィンドウを決定する必要があります。

これを1回だけ実行する必要がある場合は、訪問者にメンテナンスウィンドウ通知を表示するのが理にかなっている場合があります。これにより、指定された時間の間に非常に応答性の高いサイトを期待しないように事前に計画することができます。

于 2013-01-29T18:24:26.277 に答える
1

考慮すべきいくつかの重要な DB 要因。

ループではなく、最後にステージ 2 以外の DB トランザクションですべての更新を行います。

DBエンジンを見て、行/テーブルのロックを使用しているかどうかを確認してください。これにより、他の場所で使用されている場合、データの読み取り/書き込みが確実に停止する可能性があります。

あなたのデータセットはわかりませんが、スクリプトの速度を上げるのに役立ついくつかのアイデアを以下に示します...

配列キーに array_key_exists() の代わりに isset() を使用すると、はるかに高速になりますが、NULL 値に注意してください。

おそらくDBからキーをハッシュし、それを新しいデータセットのハッシュと比較します。各行の複数の値ではなく、1 つの値に対してのみチェックする必要があります。多くの反復またはキー チェックを節約できます。

于 2013-01-29T18:48:27.813 に答える
0

大量のデータと重い処理を扱っていて、他のタスク (Web サイトの提供など) のためにサーバーの可用性を維持することが主な関心事である場合は、タスクを小さなチャンクに分割して、 cron ジョブで各ジョブを定期的に処理します。

それ以外は、間違いなくset_time_limit()functionを確認する必要があります。これを使用すると、ゼロの値を渡すことで、スクリプトがタイムアウトしないようにすることができます -

set_time_limit(0);
于 2013-01-29T18:22:43.563 に答える