CodeIgniterを初めて使うときに
ハマった4つのポイント
2013-10-12 noldor
自己紹介
•
•
•
•

名前:竹腰彰成(noldor)
所属:株式会社アロハ 代表取締役
お仕事:ECサイトの構築、保守など
最近の興味:ConoHa(VPS)のローカルネット
ワークでネットワーク構築をどこまでできるか
挑戦中
– 10/3に値下げありがたや
今日のお話
• 実際に自分がはまった4つをまとめました
– Production環境でエラーが保存されない
– 上記に対応するとエラーが表示される
– メールが文字化け
– メールが設定無視でwordwrapされる
PRODUCTION環境でエラーログが
保存されない
使い始めにソースを先頭から確認
• index.php
_, ._
( ゚ Д ゚) …?

(つд ⊂)ゴシゴシ
_, ._
( ゚ Д ゚) …
_, ._
(#゚ Д ゚)
error_reporting()とは
• PHP エラーの出力レベルを設定する関数
• PHPのエラーログの出力にも影響する
• 0(出力なし)で再設定していたのでphp.iniの
エラーログ出力設定は無視される
※Fatalで落ちるとCIのエラー処理では拾えな
い場合があるのでphp.iniで設定をしておきた
い
すぐさま書き換えました

これでエラーログが出力されます
……が、これが罠になります
前述に対応するとPRODUCTION環
境でエラーが表示される
さきほど書き換えました
本番環境で動作テスト
• 本番環境はphp.iniで
display_errors = Off
に設定してエラー表示を抑制
• error_log = /var/log/php_errors.log
でログに取っておけば運用時のエラーも確保
これで本番でもエラーを追える!
なぜだか表示されるんですけど
CIのエラー表示方法
• デザイン的にきれいに見せるために自前でエ
ラー表示している
• エラーハンドリングしてPHP標準のエラー表示
はされないようにしている
コード追いました
• system/core/common.php

意訳)error_reporting()の設定レベルのエラー
なら表示するよ
• CIがdisplay_errorを無視してたorz
書き換えました
• system/core/common.php
一緒に書き換えました
• index.php

development環境では強制的にエラー表示
メールで文字化け
ネットに文字化け事例多し
• CodeIgniterで調べているとメールで文字化け
している事例が多い
• 原因は文字コード回りなどなど
– (海外のフレームワークはだいたい化けるよね)

• 解決策は複数提示されていますがMY_Email
クラスを作る方法が一番楽そう
というわけでコピペ
• ネットにあるものを拝借&手入れしました

https://gist.github.com/takekoshi/6931872

• 解決したように見えて、実はコンストラクタが
罠になります
(いろんなblogサイトに似通ったコードがあり
ますが、コンストラクタもほぼ共通)
メールが設定無視でWORDWRAPさ
れる
行末だけ文字化け
• MY_Email.phpを作ることで文字化けを回避し
たように見えたけど……
• 行末だけ文字化ける事例が発生
– よく見るとwordwrapされていた
– 設定ファイルでoffにしてるのに?
行末文字化けの原因は2つ
• 設定ファイルapplication/config/email.phpで
$config[‘wordwrap’] = false;
としているのに自動改行されている
• マルチバイト文字が途中で泣き別れている
– ソースを見るとstrlen()で判定していた
– 76バイトで切るのでUTF8で泣き別れやすい
設定無視を解決することに
• 解決対象は「設定が無視されている」こととし
ました
– mb_strlen()で置き換えていくには量が少し多い
– 都合上wordwrapはoffにしたい
ソースを追いかけます
• system/libraries/Email.php

• 設定ファイルの読込はコンストラクタ経由
さっきのMY_Email
• コンストラクタ……引数なし

• ここで設定値が握りつぶされました
• 対応方法:コンストラクタは動作変更なしなの
で、この4行を削除(オーバーライドしない)
まとめ
• Production環境でエラーが保存されない
– error_reporting()を設定し直す

• 上記に対応するとエラーが表示される
– display_errorを無視しないように書き換え

• メールが文字化け
– MY_Emailで対応するがネットから持ってくる場合は注
意が必要

• メールが設定無視でwordwrapされる
– wordwrapが利いてしまう場合はMY_Emailのコンスト
ラクタで設定を握りつぶしてないか注意
ご清聴ありがとうございました

Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)