2017-10-11 4 views
0

フォーラムセクションからすべてのスレッドをフェッチしていくつかの条件を満たすかどうかを確認するPHP Cronスクリプトを作成しています(2年以上経過している場合など) 。Cronスクリプトを使用して多数のMySQL行を処理する方法

通常、私はどうなる:

SELECT DATE_CREATED FROM `threads` 
WHERE BOARD = board_id 
AND (YEAR(NOW()) - YEAR(DATE_CREATED)) >= 2 

して、ループをそれに応じて。

ここでは、この基準を満たすスレッドが1,000,000以上ある可能性があります。

は当初、私はcronスクリプト

は、今私は返される行が本当に大きくなると、いくつかのメモリの問題があるかもしれないことを考え出していますので、行が返さを制限する必要がないだろうと思いました。

これは、Cronジョブによって実行されるPHPスクリプトで何千ものMySQLレコードを効果的にループする方法についてのヘルプが必要なところです。

私はLIMITを使用し、それをページ区切りのコンテンツとして反復することを考えましたが、それを行うためのより効果的な方法があるかどうかを知りたいと思います。うまくいけば、My​​SQLサーバ上でのみ。

ありがとうございます。

+0

あなたはリターンが各反復のために小さくなるように、制限してループする必要があります。パーツでやって! – GrumpyCrouton

+1

リミットとオフセットを使用して、結果の一部をループすることができます。それ以外の場合は、where句を分割してクエリを繰り返さないようにしましょう。 – sissy

+0

ありがとうございます。 @Sissyはどうすればいいのか教えてください。 – Euroadams

答えて

0

の1-まずソリューション - リミットを使用してオフセットする(擬似コード)のようになります。

//get total number of rows 
$total_rows = $db->$query("SELECT COUNT(*) FROM `threads` 
WHERE BOARD = board_id 
AND (YEAR(NOW()) - YEAR(DATE_CREATED)) >= 2"); 

//put in your array or wherever you need 1000 rows at a time 
for($i = 0; $i < $total_rows/1000; i++){ 
    $array << $db->query("SELECT DATE_CREATED FROM `threads` 
    WHERE BOARD = board_id 
    AND (YEAR(NOW()) - YEAR(DATE_CREATED)) >= 2 
    LIMIT ($i+1, $i+1)*1000"); 
} 

2 - ソリューション:、月ごとの行を取得あなたはわずか2年(のは2016-を言わせて持って考えるとあなたが何かをすることができます簡単にするため

$base_year = 2016; 
//nest loops for the years and for the months 
for($i = 0; $i < 2; $i++){ 
    for($j = 0; j < 12; $j++){ 
     $array << $db->query("SELECT DATE_CREATED FROM `threads` 
     WHERE BOARD = board_id 
     AND YEAR(DATE_CREATED) = ($i + $base_year) 
     AND MONTH(DATE_CREATED = ($j+1)"); 
    } 
} 

希望これはあなたに適切かつ適切な方法を見つけるのを助けます。

+0

問題は、基本年になることがないということです。これは、スレッドが作成された日付を参照して、毎年実行されます。クロンは、それが2年以上の古いスレッドを検索し実行した後と、次のユーザーはいつでもスレッドを作成することができます – Euroadams

+0

cronジョブが実行されるたびにも、あなたがPHPの日時とbase_yearを得ることができます。 – sissy

関連する問題