2014.12.25 Thursday Yahoo!ブックマークに登録 はてなブックマークに追加 はてなブックマーク - Codeigniter2.2.xにPHPUnitを導入したときのメモ livedoorクリップに投稿
Codeigniter2.2.xにPHPUnitを導入したときのメモ
こんにちは、ようへいです。

先日PHPUnitを自分の担当しているプロジェクトに導入をしてみました。
フレームワークにCodeigniterを使っているのですが一筋縄ではいかず結構苦労をしました・・・。

そのときのメモを残しておきたいと思います。
いろいろ調べたドキュメントが分散していたので自分なりにまとめたものなので
実際には情報不足になっちゃったりしてちゃんと動かなかったりするかもですがご容赦ください〜。

ではどうぞー。

 
続きを読む >>
ようへい | フレームワーク | 17:00 | comments(0) | trackbacks(0) | pookmark
2011.03.11 Friday Yahoo!ブックマークに登録 はてなブックマークに追加 はてなブックマーク - CodeIgniterでのメモリ開放テクニック livedoorクリップに投稿
CodeIgniterでのメモリ開放テクニック
今回は、CodeIgniterでのメモリ開放のテクニックについて語りたいと思います。

我がチームでは大量のデータ(1万件以上)を頻繁に取り扱うことが多いのですが
これら大量データについて処理を施す際、よくメモリサイズオーバーとなることが
ありました。

以下のようなPHPエラーですね。
PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 565468 bytes) in /var/www/html/xxxxx/test.php on line 538

大体こういうエラーが出るときは、大量データに対して、1件ずつ処理を行っている部分
が該当していました。

こうなった場合、処理の見直しは行った上で、それでも改善できない場合は処理件数の
制限値を設けるなどして取り急ぎ回避していました。

ですが、このままでは今後のデータ増加に対応できない為、色々と調査した結果以下の
部分が原因であることが判明しました。

結論から言うとCodeIgniterがデバッグ用に溜め込んでいる、SQLクエリが原因でした。

対策としては、以下の設定を行うだけです。

CodeIgniterディレクトリ/system/application/config/database.php
$db['default']['save_queries'] = "FALSE";

と設定するだけです。

※この対応はCodeIgniterのVersionが1.60以降のものでなければ対応できません。
(「save_queries」という変数は、Version 1.60から使用可能です)


CodeIgniter ユーザガイド 日本語版 変更履歴
http://codeigniter.jp/user_guide_ja/changelog.html

以下、詳細説明になります。

CodeIgniterでは、通常、SQLクエリをクエリ発行するたびに溜め込んでいます。
これは、テスト環境などでデバッグ用にページ下部で表示されるものです。

debug画面

ただ、このSQLクエリを溜め込む行為は、SQLクエリを発行するたびに行われます。
つまり、1万回SQLクエリを発行した場合、その、1万回分のSQLクエリログが
溜め込められるわけです。

例えば、長いクエリを発行していたとして、それを1万回繰り返した場合・・・
長いクエリ(1KB = 約1000文字) × 10000 = 10000KB = 10MB

これだけの容量がメモリとして溜め込まれるわけです。
設定如何によっては、この状況だけでもメモリサイズオーバーしかねないですね。

実際にその処理を行っているのは、以下になります。
CodeIgniterディレクトリ/system/database/DB_driver.php (一部抜粋)

function query($sql, $binds = FALSE, $return_object = TRUE)
{

/***********************
* 中略
***********************/

// Compile binds if needed
if ($binds !== FALSE)
{
$sql = $this->compile_binds($sql, $binds);
}

// Save the query for debugging
if ($this->save_queries == TRUE)
{
$this->queries[] = $sql;
}

/***********************
* 中略
***********************/


この、
// Save the query for debugging
if ($this->save_queries == TRUE)
{
$this->queries[] = $sql;
}

ここの部分で「$this->queries」という配列に指定したクエリが溜め込まれています。

また、ここで注目してほしいのが、
$this->save_queries

という変数です。
この変数が「FALSE」に設定されていればクエリは溜め込まれないことになります。
今回は、この変数を「FALSE」に設定することでメモリ増加を回避しました。

具体的な設定方法は以下の通りです。
CodeIgniterディレクトリ/system/application/config/database.php
/***********************
* 中略
***********************/

$db['default']['hostname'] = "xxx.xxx.xxx.xxx";
$db['default']['username'] = "username";
$db['default']['password'] = "password";
$db['default']['database'] = "test";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['save_queries'] = "FALSE";

/***********************
* 中略
***********************/

データベースの設定を行う際に
$db['default']['save_queries'] = "FALSE";

と設定しておきます。こうすることで、SQLクエリの溜め込みを行わないようになります。

CodeIgniter ユーザガイド 日本語版 データベース設定
http://codeigniter.jp/user_guide_ja/database/configuration.html

今回の対策を実施した結果、例えば対策前の状態で4MBほどメモリが増加していたのが
対策を行うことで、0.5MB(500KB)程のメモリ増加に抑えることが出来ました。

ただし、このままでは、テスト環境でデバッグしている際にSQLクエリを発行することが
できません。テスト用とリリース用に分けて設定を出来るようにしてみると
よいかもしれません。

今回はCodeIgniterのDB操作についてメモリ開放の1テクニックを紹介しました。
今後も対策は続けていく予定なのでまた何か見つかりましたら紹介していきたいと思います。

Suggar-4 | フレームワーク | 10:39 | comments(0) | trackbacks(0) | pookmark
2009.09.25 Friday Yahoo!ブックマークに登録 はてなブックマークに追加 はてなブックマーク - フレームワークについて livedoorクリップに投稿
フレームワークについて
以前、フレームワークを使用して開発をしていると
お話しましたが、あれからさらに社内で吟味し、
その結果、CodeIgniterというフレームワークを使用する
ことに決定しました。

・CodeIginterとは・・?
http://ja.wikipedia.org/wiki/CodeIgniter

・CakePHPとは・・?
http://ja.wikipedia.org/wiki/CakePHP

今回は、なぜ、フレームワークを選定することになったかという経緯を
簡単にお話したいと思います。

まず、今現在、各開発メンバが独自の感覚でそれぞれがフレームワーク(に似たようなもの)を
設計し、使用している、もしくは、それすら意識せず開発を行っている、という
現状がありました。

この現状を打開する為、開発チーム内で、1つの統一したフレームワークを使用して
開発していこう!
というのがこの話の発端です。

そして、色々なフレームワークから選出されたのが上記2つのフレームワークでした。
※Sympfony(http://ja.wikipedia.org/wiki/Symfony)も候補に挙がりましたが、社内での
開発規模を考え、見送られることになりました。

この後、2つのフレームワークについて吟味していくのですが、その詳細はまた
別のお話にしたいと思います。

そして、フレームワークの各機能の吟味の後、CodeIgniterに決定したわけですが
一番の理由は、
「フレームワークを使用したことがない人にもわかりやすい」
ということでした。

先ほど話したとおり、フレームワークに対する考え方やそもそもそれすら意識せずに
開発してきたメンバにとって、CodeIgniterは一番とっつきやすいものだと
考えました。

実際、私も今、CodeIgniterを使用して開発をしていますが、それほど苦もなく
開発を進めることができています。
※私自身もフレームワークに触れて開発する経験は今までほとんどありませんでした。

今回はあまりためになる話ができませんでしたが、今後はこのカテゴリの中で、
CodeIgniterについてのTipsや、フレームワークを比較した内容の詳細などについて
お話できたらと思っています。
Suggar-4 | フレームワーク | 12:03 | comments(0) | trackbacks(0) | pookmark
tech_blog_03.gif
Calendar
SunMonTueWedThuFriSat
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
<< July 2017 >>
New Entries
Archives
Categories
Recent comment
Recent trackback
Profile
Links
Mobile
qrcode
Admin
Seach this site