Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)
-
Upload
noldor -
Category
Technology
-
view
1.533 -
download
3
description
Transcript of Code igniterを初めて使うときにはまった4つのポイント(ノーマル版)
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のコンストラクタで設定を握りつぶしてないか注意
ご清聴ありがとうございました