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

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

  • Upload
    noldor

  • View
    1.533

  • Download
    3

Embed Size (px)

DESCRIPTION

発表しなかった没資料(内容はほぼ同じ)

Citation preview

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

CodeIgniterを初めて使うときにハマった4つのポイント

2013-10-12 noldor

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

自己紹介

• 名前:竹腰彰成(noldor)

• 所属:株式会社アロハ 代表取締役

• お仕事:ECサイトの構築、保守など

• 最近の興味:ConoHa(VPS)のローカルネット

ワークでネットワーク構築をどこまでできるか挑戦中

– 10/3に値下げありがたや

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

今日のお話

• 実際に自分がはまった4つをまとめました

– Production環境でエラーが保存されない

–上記に対応するとエラーが表示される

– メールが文字化け

– メールが設定無視でwordwrapされる

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

PRODUCTION環境でエラーログが保存されない

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

使い始めにソースを先頭から確認

• index.php

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

_, ._( ゚ Д ゚) …?

(つд ⊂)ゴシゴシ_, ._

( ゚ Д ゚) …

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

_, ._(#゚ Д ゚)

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

error_reporting()とは

• PHP エラーの出力レベルを設定する関数

• PHPのエラーログの出力にも影響する

• 0(出力なし)で再設定していたのでphp.iniのエラーログ出力設定は無視される

※Fatalで落ちるとCIのエラー処理では拾えない場合があるのでphp.iniで設定をしておきたい

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

すぐさま書き換えました

これでエラーログが出力されます……が、これが罠になります

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

前述に対応するとPRODUCTION環境でエラーが表示される

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

さきほど書き換えました

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

本番環境で動作テスト

• 本番環境はphp.iniでdisplay_errors = Offに設定してエラー表示を抑制

• error_log = /var/log/php_errors.logでログに取っておけば運用時のエラーも確保

これで本番でもエラーを追える!

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

なぜだか表示されるんですけど

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

CIのエラー表示方法

• デザイン的にきれいに見せるために自前でエラー表示している

• エラーハンドリングしてPHP標準のエラー表示はされないようにしている

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

コード追いました

• system/core/common.php

意訳)error_reporting()の設定レベルのエラーなら表示するよ

• CIがdisplay_errorを無視してたorz

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

書き換えました

• system/core/common.php

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

一緒に書き換えました

• index.php

development環境では強制的にエラー表示

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

メールで文字化け

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

ネットに文字化け事例多し

• CodeIgniterで調べているとメールで文字化けしている事例が多い

• 原因は文字コード回りなどなど

– (海外のフレームワークはだいたい化けるよね)

• 解決策は複数提示されていますがMY_Emailクラスを作る方法が一番楽そう

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

というわけでコピペ

• ネットにあるものを拝借&手入れしました

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

• 解決したように見えて、実はコンストラクタが罠になります(いろんなblogサイトに似通ったコードがありますが、コンストラクタもほぼ共通)

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

メールが設定無視でWORDWRAPされる

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

行末だけ文字化け

• MY_Email.phpを作ることで文字化けを回避したように見えたけど……

• 行末だけ文字化ける事例が発生

–よく見るとwordwrapされていた

–設定ファイルでoffにしてるのに?

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

行末文字化けの原因は2つ

• 設定ファイルapplication/config/email.phpで$config[‘wordwrap’] = false;としているのに自動改行されている

• マルチバイト文字が途中で泣き別れている

– ソースを見るとstrlen()で判定していた

– 76バイトで切るのでUTF8で泣き別れやすい

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

設定無視を解決することに

• 解決対象は「設定が無視されている」こととしました

– mb_strlen()で置き換えていくには量が少し多い

–都合上wordwrapはoffにしたい

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

ソースを追いかけます

• system/libraries/Email.php

• 設定ファイルの読込はコンストラクタ経由

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

さっきのMY_Email

• コンストラクタ……引数なし

• ここで設定値が握りつぶされました

• 対応方法:コンストラクタは動作変更なしなので、この4行を削除(オーバーライドしない)

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

まとめ

• Production環境でエラーが保存されない– error_reporting()を設定し直す

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

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

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

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

ご清聴ありがとうございました