5丁目通信(仮称)

とある5丁目で活動する還暦を過ぎたWebプログラマーの覚え書きです。それとかかってくる迷惑電話や、家業のアパート経営について。

CakePHPでの多数レコードへのバッチ処理をした話し


現在、テストフェーズに入っているサイトで不具合発見。6万レコードのテーブルに対して再処理を行う必要があります。

CakePHPで開発しているので、すべてのレコードをfind(“all”)で取得してから処理するのでは、おそらくメモリのオーバーフローで止まることは確実です。そこで、レコードを分割して取得して処理することにします。

CakePHPのモデルに対するfindメソッドはよく使うのですが、意外とパラメータに関してはマニュアルに丁寧に説明してくれていません。

しかし、

array(
  'conditions' => array('Model.field' => $thisValue), //条件の配列
  'recursive' => 1, //int
  'fields' => array('Model.field1', 'DISTINCT Model.field2'),     //フィールド名の配列
  'order' => array('Model.created', 'Model.field3 DESC'), //文字列か配列でのorder定義
  'group' => array('Model.field'), //GROUP BYするためのフィールド
  'limit' => n, //int
  'page' => n, //int
  'offset' => n, //int
  'callbacks' => true //false, 'before', 'after'が指定できます。
)

MySQLを使っているのであれば、limit,offsetは想像付くのですが、pageって何?っていうところでしょうか?

CakePHPのソースファイル(cake/libs/model/model.php)のfind()の部分を読むとわかるのですが、page(ページ数)とlimit(表示レコード数)を指定すれば自動的にoffset(先頭からのレコード位置)を計算してくれるのでした。

他にマニュアルにないパラメータがあるかもしれませんので、CakePHPのソースは読んだ方がいいかもしれません。といいながら、callbacksは何をするのか自分はわかりませんが。

著:山田祥寛
¥1,870 (2024/10/28 23:04時点 | Amazon調べ)
著:松浦 健一郎, 著:司 ゆき
¥2,574 (2024/10/28 23:04時点 | Amazon調べ)
著:谷藤賢一, 著:徳丸浩
¥2,750 (2024/10/28 23:04時点 | Amazon調べ)