misc.log

日常茶飯事とお仕事と

PHPの開発環境を揃えてみる(4) CodeIgniter利用環境を作る

http://www.backyrd.net/entry/20140518/1400388684 の続き。

さて、次はCodeIgniter。CodeIgniterは、PHP用の開発フレームワークで、特定のフォルダ構成にくみ上げられたファイル群が実体です。.NET Frameworkとかのように、システムや開発環境にプラグインインストーラーを使って組み込むと言うタイプのものではないようですね。

ダウンロード

CodeIgniterは下記のリンクからダウンロードしてください。

CodeIgniter のダウンロード
http://codeigniter.jp/user_guide_ja/installation/downloads.html

どうやら、日本語言語パックなるものの最新版は2.0.3のようなのですが、CodeIgniter自体の最新版は2.1.4のようです。とりあえず2.1.4をダウンロードしてみました。

インストール?

ファイルをコピー

とりあえず、WebサーバーにCodeIgniterの一式を置いてみます。今回、Apacheの公開用フォルダは「C:\work\web」にしてあるので、ダウンロードしたCodeIgniterを展開して出来るファイル(index.phpとかapplicationフォルダとかがある階層一式)を、「c:\work\web」の下にコピーしました。

f:id:frontline:20140518223402j:plain

こんな感じ。




設定ファイルを変更

mod_rewriteの設定を調べていて、こんな情報を見つけました。

stackoverflow/How to remove “index.php” in codeigniter's path
http://stackoverflow.com/questions/1445385/how-to-remove-index-php-in-codeigniters-path

この回答のいくつかで、CodeIgniterの設定ファイルの「$config['index_page']」に関してこの設定もやっとけよ、と書かれています。

Also, make sure your index file is set to: $config['index_page'] = '';

とか、

Then find the following line in your application/config/config.php file

$config['index_page'] = 'index.php';
Set the variable empty as below.

$config['index_page'] = '';
That's it, it worked for me.

とかですね。設定ファイル(Version 2以降のCodeIgniterでは application/config/config.php)を見てみると……。

/*
|--------------------------------------------------------------------------
| Index File
|--------------------------------------------------------------------------
|
| Typically this will be your index.php file, unless you've renamed it to
| something else. If you are using mod_rewrite to remove the page set this
| variable so that it is blank.
|
*/
$config['index_page'] = 'index.php';

mod_rewriteを使うのならば、ここで設定されているページ名を消して、ブランクにする。」と書かれています。今回、mod_rewriteを利用するので、index_pageの値は空文字にしておきましょう。

Welcomeページでエラーが出る

http://www.backyrd.net/entry/20140511/1399782368#section3 に書いたように、mod_rewriteを利用するよう設定してあるので、上記のCodeIgniter関連ファイルコピーで下記のURLからウェルカムページが表示されるはずです。

http://localhost/welcome

しかし……あれ?

f:id:frontline:20140518223754j:plain

Welcome to Codeigniter!の表示はあるのですが、上にエラーが出ています。

A PHP Error was encountered
Severity: Warning
Message: strpos(): Empty needle
Filename: core/URI.php
Line Number: 186

と、もう1つ、

A PHP Error was encountered
Severity: Warning
Message: strpos(): Empty needle
Filename: core/URI.php
Line Number: 190

これも検索してみましょう。検索キーワードは「"core/URI.php" Empty needle」。ヒットしたのはここ。

イロ イッカイ ズツ…/ CodeIgniter 2.0.3 index.phpをURLから除去したときの警告(Empty delimiter)を消す
http://www.ookawara.com/archives/820



なになに……Core/URI.php自体のバグ?なの? strpos関数で「SCRIPT_NAME」をURIから検索した際に、該当情報が無かったときのケアがされていない? というわけで、この人はURI.php自体を書き換えるという荒技に出たようです。

if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0)

この行から始まるif、elseifのブロックの外側で、下記のifによる事前検査を行います。

if (strlen($_SERVER['SCRIPT_NAME']))

strlenは指定された文字列の長さを求める関数。PHPでは、「false」も「ゼロ」も同じ扱いになるようなので、上記のif文は「SCRIPT_NAME文字列が長さ1以上の場合だけ実行」になります。よって、長さゼロのときはstrposとかによる位置検索と切り出しが行われない、ということでしょうか。やってみましょう。初めてのPHPプログラミングがCodeIgniterの修正とは……

訂正。http://localhost/welcome を再表示……

f:id:frontline:20140518230238j:plain

うぉ……初めてのPHPプログラミングはいきなりバグ発生で撃沈……。再度直します(笑)。if文の条件式末尾の括弧が抜けてました。反省。訂正、再表示。CodeIgniterのシステムファイルなどは、Webサーバーへのリクエストのたびに読み込まれるのでApacheの再起動とかは不要です。そのままブラウザをリロードすると……

f:id:frontline:20140518230521j:plain

よしゃ!成功。とりあえずここまでとしておきましょう。

CodeIgniter徹底入門

CodeIgniter徹底入門