CodeIgniterアプリ実行の基本:WebサーバーとCLI活用の徹底解説
Webサーバー経由での実行
CodeIgniterはPHPフレームワークであるため、Webサーバー(Apache, Nginxなど)とPHPが動作する環境が必要です。
- ルーティング
CodeIgniterは、URLに基づいてどのコントローラーのどのメソッドを実行するかを判断する「ルーティング」の仕組みを持っています。app/Config/Routes.php
ファイルで、URLパターンとコントローラー/メソッドのマッピングを定義します。 - URLアクセス
ドキュメントルートが正しく設定されていれば、ブラウザから設定したドメイン名やIPアドレスでアクセスすることで、CodeIgniterアプリケーションが動作します。- 例:
http://localhost/
またはhttp://your_domain.com/
- 例:
PHPのビルトインWebサーバーでの実行
開発目的であれば、ApacheやNginxを設定しなくても、PHPに標準で備わっているビルトインWebサーバーを使って手軽にアプリケーションを実行できます。
- アクセス
このコマンドを実行すると、通常http://localhost:8080
のようなアドレスでアプリケーションにアクセスできるようになります。この方法は、開発中に手軽にアプリケーションをテストするのに非常に便利です。 - コマンドの実行
CodeIgniterプロジェクトのルートディレクトリで以下のコマンドを実行します。php spark serve
CodeIgniterは、Webブラウザを介さずに、コマンドラインから特定のタスクを実行する機能も持っています。これは「CLI」(Command Line Interface)と呼ばれます。
- メリット
Webサーバーの制約を受けずに、バックグラウンド処理や管理タスクを自動化・効率化できます。 - コマンドの実行
CodeIgniterプロジェクトのルートディレクトリで、spark
スクリプトを使用してコマンドを実行します。php spark migrate php spark db:seed Users php spark make:controller MyCLIController
- 用途
- データベースのマイグレーション(スキーマ変更)
- テストの実行
- キャッシュのクリア
- カスタムコマンドの作成と実行
- 定時実行タスク(Cronジョブ)
CodeIgniter アプリケーション実行時の一般的なエラーとトラブルシューティング
CodeIgniterアプリケーションをWebサーバーやPHPのビルトインサーバーで実行する際に、様々なエラーに遭遇することがあります。ここでは、特によく見られるエラーとその解決策について説明します。
エラー:HTTP 500 Internal Server Error (内部サーバーエラー)
原因
- CodeIgniterのベースURL設定ミス
app/Config/App.php
の$baseURL
が正しく設定されていない。 - メモリ不足
PHPのmemory_limit
がアプリケーションの要求するメモリ量に対して不足している。 - ファイルパーミッションの問題
Webサーバーがファイルやディレクトリにアクセスするための適切なパーミッションがない。 - Webサーバー設定ミス
Apacheの.htaccess
ファイルの設定ミス、Nginxの設定ミス。 - PHPエラー
構文エラー、未定義の変数や関数へのアクセス、致命的な実行時エラーなど。
トラブルシューティング
- PHPエラーログの確認
php.ini
でdisplay_errors = On
とlog_errors = On
を設定し、error_log
のパスを確認します。- Webサーバーのエラーログ(Apacheなら
error_log
、Nginxならerror.log
)を確認します。 - CodeIgniterの
writable/logs
ディレクトリにもエラーログが出力されている場合があります。 - ログに記載されているエラーメッセージとファイルパスを元に、問題箇所を特定・修正します。
- .htaccessファイルの確認 (Apacheの場合)
- CodeIgniterのドキュメントに記載されている標準の
.htaccess
ファイルを使用しているか確認します。 - 特に
RewriteEngine On
やRewriteBase
の設定が正しいか確認します。 AllowOverride All
がWebサーバーの設定で有効になっているか確認します。
- CodeIgniterのドキュメントに記載されている標準の
- ファイルパーミッションの確認
- CodeIgniterのルートディレクトリと
writable
ディレクトリ、特にwritable/cache
,writable/logs
,writable/session
ディレクトリに対して、Webサーバーを実行しているユーザー(例:www-data
,apache
,nginx
)が書き込み権限を持っているか確認します。通常、755
または775
、場合によっては777
(開発環境のみ推奨)を設定します。
(chmod -R 775 /path/to/your/codeigniter_project/writable chown -R www-data:www-data /path/to/your/codeigniter_project
www-data
はWebサーバーのユーザー/グループ名に合わせて変更してください)
- CodeIgniterのルートディレクトリと
- PHPメモリ制限の確認
php.ini
のmemory_limit
の値を増やします。例:memory_limit = 256M
。- 値を変更した後はWebサーバーを再起動してください。
- $baseURLの確認
app/Config/App.php
を開き、$baseURL
がアプリケーションのルートURLと一致していることを確認します。public string $baseURL = 'http://localhost:8080/'; // PHPビルトインサーバーの場合 // または public string $baseURL = 'http://your-domain.com/'; // 本番環境の場合
エラー:404 Not Found (ページが見つかりません)
原因
- CodeIgniterのURLセグメント設定ミス
$indexPage
が正しく設定されていない。 - ファイル名/クラス名の大文字・小文字の問題
Linuxサーバーではファイルシステムが大文字・小文字を区別するため、コントローラーやモデルのファイル名とクラス名、URLが一致していないとエラーになる。WindowsやmacOSでは問題にならない場合があるため注意。 - Rewrite Moduleが無効
Apacheのmod_rewrite
やNginxのrewrite
設定が有効になっていない。 - ルーティングの問題
URLと一致するルートがapp/Config/Routes.php
に定義されていない、またはコントローラー/メソッドが存在しない。
トラブルシューティング
- ルーティングの確認
app/Config/Routes.php
を確認し、アクセスしようとしているURLに対応するルートが定義されているか確認します。- デフォルトのルート(
$routes->setDefaultController()
)が正しいコントローラーを指しているか確認します。 auto_routing_improved
(CodeIgniter 4.x)が有効になっている場合、URLとコントローラー/メソッド名が直接対応していることを確認します。
- WebサーバーのRewrite設定の確認
- Apache
httpd.conf
またはサイト固有の設定ファイルでmod_rewrite
が有効になっていることを確認します。
そして、サイトのLoadModule rewrite_module modules/mod_rewrite.so
Directory
ディレクティブでAllowOverride All
が設定されていることを確認します。 - Nginx
サーバーブロック設定ファイルで、CodeIgniterのドキュメントに記載されているtry_files
ディレクティブが正しく設定されていることを確認します。location / { try_files $uri $uri/ /index.php?$query_string; }
- Apache
- ファイル名とクラス名の大文字・小文字の確認
- コントローラーファイル名 (
app/Controllers/MyController.php
) とクラス名 (class MyController
)、そしてURL (http://example.com/mycontroller
) が正確に一致しているか確認します。特にLinux環境で注意が必要です。
- コントローラーファイル名 (
- $indexPageの確認
app/Config/App.php
の$indexPage
が空になっているか(モダンなURLの場合)、またはindex.php
に設定されているか確認します。public string $indexPage = ''; // index.phpをURLから除外する場合 // または // public string $indexPage = 'index.php'; // index.phpを含める場合
エラー:データベース接続エラー
原因
- ファイアウォールの問題
ファイアウォールがデータベースサーバーへの接続をブロックしている。 - ポートの問題
データベースサーバーがデフォルト以外のポートで動作しており、CodeIgniterの設定と一致していない。 - データベースサーバーが起動していない
データベースサーバー(MySQL, PostgreSQLなど)が実行されていない。 - データベース設定ミス
app/Config/Database.php
内のホスト名、ユーザー名、パスワード、データベース名が間違っている。
トラブルシューティング
- Database.phpの設定確認
hostname
,username
,password
,database
の各設定値が正確か再確認します。public array $default = [ 'DSN' => '', 'hostname' => 'localhost', // または127.0.0.1 'username' => 'your_db_user', 'password' => 'your_db_password', 'database' => 'your_db_name', // ... ];
- データベースサーバーの起動確認
- データベースサーバーのサービスが実行中か確認します。
mysql -u your_db_user -p
のようにコマンドラインから直接データベースに接続できるか試します。
- ポートの確認
- データベースがデフォルト以外のポートで動作している場合、
hostname
にポート番号を含めて指定します(例:'hostname' => 'localhost:3307'
)。
- データベースがデフォルト以外のポートで動作している場合、
- ファイアウォールの確認
- データベースサーバーがあるマシンでファイアウォールが有効になっている場合、データベースへの接続ポート(MySQLなら3306)が開いているか確認します。
エラー:ComposerまたはVendor関連のエラー
原因
- PHPバージョンと依存関係の不一致
composer.json
で定義されているPHPのバージョンと、現在のPHPバージョンが一致していない。 - composer installの実行忘れ
プロジェクトのクローン後にcomposer install
を実行していない。 - Composerの依存関係がインストールされていない
vendor
ディレクトリが存在しない、または必要なライブラリが不足している。
トラブルシューティング
- composer installの実行
- プロジェクトのルートディレクトリで
composer install
を実行します。 - もし
vendor
ディレクトリが破損していると思われる場合は、rm -rf vendor composer.lock
で削除してからcomposer install
を再実行します。
- プロジェクトのルートディレクトリで
- PHPバージョンの確認
php -v
で現在のPHPバージョンを確認し、composer.json
のrequire
セクションに記載されているPHPバージョンと互換性があるか確認します。- 必要であれば、PHPのバージョンを切り替えるか、
composer.json
を修正してcomposer update
を実行します。
404 Page Not Found (ページが見つかりません)
これはCodeIgniterアプリケーション実行時に最もよく遭遇するエラーの一つです。
原因
- ファイルやディレクトリのパーミッション不足
Webサーバー(PHPプロセス)がコントローラーファイルなどを読み取れない。 - Webサーバーのドキュメントルートの誤り
WebサーバーのドキュメントルートがCodeIgniterプロジェクトのpublic
ディレクトリに設定されていない。 - .htaccessファイルの設定ミス (Apache)
URLリライトが正しく機能していない。特に共有ホスティング環境で発生しやすい。 - コントローラーファイル名やメソッド名の誤り
URLと対応するコントローラーのファイル名やクラス名、メソッド名にスペルミスがある、または大文字・小文字が一致していない。 - ルーティング設定の誤り
app/Config/Routes.php
(CodeIgniter 4)またはapplication/config/routes.php
(CodeIgniter 3)のルーティング設定が正しくない。
トラブルシューティング
- パーミッションの確認
- CodeIgniterプロジェクトのディレクトリとファイル(特に
writable
ディレクトリやコントローラーファイル)が、Webサーバーを実行しているユーザー(通常www-data
やapache
など)によって読み取り可能であるか確認します。必要に応じてchmod
コマンドでパーミッションを調整します。
- CodeIgniterプロジェクトのディレクトリとファイル(特に
- Webサーバーのドキュメントルートの確認
- Apacheのバーチャルホスト設定やNginxの設定で、
DocumentRoot
がCodeIgniterのpublic
ディレクトリ(またはCodeIgniter 3の場合はプロジェクトルート)を指していることを確認します。
- Apacheのバーチャルホスト設定やNginxの設定で、
- .htaccessファイルの確認 (Apacheの場合)
- CodeIgniterのルートディレクトリ(CodeIgniter 4の場合は
public
ディレクトリ、CodeIgniter 3の場合はプロジェクトルート)に.htaccess
ファイルがあるか確認し、以下の基本的な設定が含まれていることを確認します。
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
- サーバーで
mod_rewrite
モジュールが有効になっているか確認します。
- CodeIgniterのルートディレクトリ(CodeIgniter 4の場合は
- コントローラーとメソッドの確認
- URLのパスが、コントローラーのファイル名(例:
Users.php
)とクラス名(class Users extends BaseController
など)、そしてメソッド名(public function profile()
)に一致しているか確認します。 - 特に、ファイル名やクラス名の大文字・小文字が重要です(Linuxサーバーなどでは厳密に区別されます)。
- URLのパスが、コントローラーのファイル名(例:
- ルーティングの確認
app/Config/Routes.php
(またはapplication/config/routes.php
)を開き、アクセスしようとしているURLに対応するルートが正しく定義されているか確認します。- 例:
http://localhost/users/profile
にアクセスしたい場合、$routes->get('users/profile', 'Users::profile');
のような設定があるか確認します。
- 例:
500 Internal Server Error (内部サーバーエラー)
これはより一般的なエラーで、PHPコードの実行時エラーやサーバー設定の問題など、様々な原因で発生します。
原因
- データベース接続の問題
データベースサーバーが起動していない、接続情報が間違っている、パーミッションがないなど。 - Composerの依存関係の問題
composer install
が正しく実行されていない、または必要なパッケージが不足している。 - ファイル/ディレクトリのパーミッション不足
サーバーがPHPファイルを読み込めない、または書き込みが必要なディレクトリに書き込めない(例:writable/cache
、writable/logs
)。 - Webサーバーのログにエラーが出ている
サーバー側の問題。 - .htaccessファイルの不正な設定
Apacheのディレクティブが間違っている場合など。 - PHPの構文エラー/ランタイムエラー
コードにPHPの文法的な誤りがある、または実行時に致命的なエラー(メモリ不足、未定義の変数/関数へのアクセスなど)が発生している。
トラブルシューティング
- Composerの依存関係の更新
- プロジェクトルートで
composer update
またはcomposer install
を実行し、依存関係が正しくインストールされていることを確認します。
- プロジェクトルートで
- データベース接続の確認
app/Config/Database.php
(CodeIgniter 4)またはapplication/config/database.php
(CodeIgniter 3)のデータベース設定(ホスト名、ユーザー名、パスワード、データベース名)が正しいことを確認します。- データベースサーバー自体が起動しているか確認します。
- データベースに接続できるか、PHPの
mysqli_connect()
などの単純なスクリプトでテストしてみるのも有効です。
- パーミッションの確認
writable
ディレクトリ(CodeIgniter 4)またはapplication/cache
,application/logs
(CodeIgniter 3)ディレクトリにWebサーバーが書き込み権限を持っているか確認します。通常、chmod -R 775 writable
(CodeIgniter 4)やchmod -R 775 application/cache application/logs
(CodeIgniter 3)で解決することが多いです。
- PHPの設定 (php.ini) の確認
display_errors = On
になっていることを確認します(開発時のみ)。log_errors = On
になっていることを確認し、エラーがログファイルに記録されるようにします。memory_limit
やmax_execution_time
などが適切に設定されているか確認します。
- ENVIRONMENTの設定をdevelopmentにする
public/index.php
(CodeIgniter 4)またはindex.php
(CodeIgniter 3)ファイルの冒頭にあるENVIRONMENT
定数をdevelopment
に設定します。
// CodeIgniter 4の場合 define('ENVIRONMENT', 'development'); // CodeIgniter 3の場合 define('ENVIRONMENT', 'isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');
- これにより、本番環境で非表示になる詳細なエラーメッセージがブラウザに表示されるようになり、問題の特定に役立ちます。本番環境では必ず
production
に戻してください。
- エラーログの確認
- CodeIgniterのログ
writable/logs
(CodeIgniter 4)またはapplication/logs
(CodeIgniter 3)にあるログファイルを確認します。詳細なエラーメッセージとスタックトレースが記録されていることが多いです。 - Webサーバーのエラーログ
Apache (error_log
) や Nginx (error.log
) など、Webサーバーのエラーログも確認します。PHPの致命的なエラーはここに記録されることがあります。
- CodeIgniterのログ
"No input file specified." (CLIでの実行時)
CodeIgniter 4のphp spark serve
や、php spark migrate
などのCLIコマンドで発生することがあります。
原因
- プロジェクトのルートディレクトリでコマンドを実行していない。
- PHPのパスが通っていない、またはPHP CLIの実行パスが間違っている。
トラブルシューティング
- PHPの実行バイナリの指定
環境によっては、php
ではなくフルパス(例:/usr/local/bin/php
)で指定する必要がある場合があります。 - PHP CLIの確認
コマンドラインでphp -v
と入力し、PHPが正しくインストールされ、パスが通っていることを確認します。 - 正しいディレクトリで実行
CodeIgniterのプロジェクトルートディレクトリでphp spark serve
やphp spark [コマンド]
を実行していることを確認します。
特定のPHP拡張モジュールが不足しているエラー
CodeIgniterや利用しているライブラリが特定のPHP拡張モジュール(例: intl
, mbstring
, gd
, curl
, json
, pdo_mysql
など)を必要とする場合、それらがサーバーにインストールされていない、または有効になっていない場合にエラーが発生します。
原因
- 拡張モジュールが
php.ini
で有効になっていない(;
でコメントアウトされているなど)。 - 必要なPHP拡張モジュールがサーバーにインストールされていない。
トラブルシューティング
- 拡張モジュールのインストールと有効化
- サーバーのOSやPHPのバージョンに応じて、必要な拡張モジュールをインストールします(例:
sudo apt-get install php-intl
、sudo yum install php-mbstring
)。 php.ini
ファイルを開き、不足している拡張モジュールに対応する行(例:extension=intl
)の先頭にある;
を削除してコメント解除し、有効化します。- Webサーバー(Apache/Nginx)を再起動します。
- サーバーのOSやPHPのバージョンに応じて、必要な拡張モジュールをインストールします(例:
- phpinfo()の確認
プロジェクト内に<?php phpinfo(); ?>
と記述したPHPファイルを作成し、ブラウザでアクセスしてPHPの設定と有効な拡張モジュールを確認します。 - エラーメッセージの確認
エラーメッセージに不足している拡張モジュールの名前が示されていることが多いです。
キャッシュ関連のエラー (CodeIgniter 4のwritable/cache)
CodeIgniter 4では、キャッシュファイルがwritable/cache
ディレクトリに保存されます。このディレクトリへの書き込み権限がない場合、エラーが発生します。
原因
writable/cache
ディレクトリへの書き込み権限がない。
- パーミッションの確認と設定
writable
ディレクトリとそのサブディレクトリ(cache
,logs
,uploads
など)に対して、Webサーバーを実行しているユーザーに書き込み権限を与えます。chmod -R 775 writable # または、よりセキュアにWebサーバーのユーザーに所有権を設定 sudo chown -R www-data:www-data writable # www-dataはWebサーバーのユーザー名に置き換える
- Composerの自動ロードの確認
composer.json
に新しいクラスや名前空間を追加した場合、composer dump-autoload
を実行してオートロード情報を更新する必要があります。 - コミュニティやフォーラムの活用
CodeIgniterには活発なコミュニティやフォーラムがあります。同様の問題に遭遇した人が解決策を共有している場合があります。 - 公式ドキュメントの参照
CodeIgniterの公式ドキュメントは非常に充実しています。エラーメッセージや疑問点をキーワードにして検索すると、解決策が見つかることが多いです。 - バージョン管理システムの使用
Gitなどのバージョン管理システムを使用し、変更履歴を追跡できるようにします。問題が発生した際に、以前の正常な状態に戻すことができます。 - 環境の確認
開発環境と本番環境でPHPのバージョン、Webサーバーの設定、PHP拡張モジュールなどが一致しているか確認します。
Webサーバー経由での実行 (ルーティングの例)
Webブラウザからアプリケーションにアクセスする際の「実行」は、URLとそれに対応するコントローラーのメソッドをCodeIgniterに伝えるルーティングによって制御されます。
1 ルーティング設定ファイル
CodeIgniter 4では、ルーティング設定は通常 app/Config/Routes.php
ファイルに記述します。
// app/Config/Routes.php
<?php
namespace Config;
// RoutinServiceクラスをuseします (通常は自動で追加されています)
use CodeIgniter\Router\RouteCollection;
/**
* @var RouteCollection $routes
*/
// デフォルトのルート(例: http://localhost:8080/ にアクセスした時)
// 'Home' コントローラーの 'index' メソッドが実行されます。
$routes->get('/', 'Home::index');
// 基本的なGETリクエストのルーティング
// http://localhost:8080/about にアクセスすると、
// 'Page' コントローラーの 'about' メソッドが実行されます。
$routes->get('about', 'Page::about');
// パラメータを持つGETリクエストのルーティング
// http://localhost:8080/users/123 のようにアクセスすると、
// 'User' コントローラーの 'show' メソッドが実行され、
// 123 が $id としてメソッドに渡されます。
$routes->get('users/(:num)', 'User::show/$1');
// リソースルーティング (RESTful APIでよく使用)
// 'products' というURLプレフィックスに対して、CRUD操作(index, show, new, create, edit, update, delete)
// に対応する複数のルートを自動的に生成します。
// 例:
// GET /products -> Product::index()
// GET /products/new -> Product::new()
// POST /products -> Product::create()
// GET /products/1/edit -> Product::edit(1)
// PUT /products/1 -> Product::update(1)
// DELETE /products/1 -> Product::delete(1)
$routes->resource('products');
// グループ化されたルート
// 'admin' プレフィックスを持つルートをグループ化し、
// 共通のフィルタ(認証など)を適用したり、名前空間を指定したりできます。
$routes->group('admin', ['filter' => 'auth'], function($routes){
$routes->get('/', 'Admin\Dashboard::index'); // /admin
$routes->get('settings', 'Admin\Settings::index'); // /admin/settings
});
2 対応するコントローラーの例
上記のルーティング設定に対応するコントローラーのコード例です。
app/Controllers/Home.php
<?php
namespace App\Controllers;
class Home extends BaseController
{
public function index(): string
{
return view('welcome_message'); // 'welcome_message.php' というビューファイルを表示
}
}
app/Controllers/Page.php
<?php
namespace App\Controllers;
class Page extends BaseController
{
public function about(): string
{
return '<h1>About Us</h1><p>これは「About Us」ページです。</p>';
}
}
app/Controllers/User.php
<?php
namespace App\Controllers;
class User extends BaseController
{
public function show(int $id): string
{
return "<h1>User Profile</h1><p>ユーザーID: {$id}</p>";
}
}
app/Controllers/Admin/Dashboard.php
(グループ化されたルートの例)
<?php
namespace App\Controllers\Admin; // Admin名前空間
use App\Controllers\BaseController; // 親のBaseControllerをuse
class Dashboard extends BaseController
{
public function index(): string
{
return '<h1>Admin Dashboard</h1><p>管理者のみがアクセスできるページです。</p>';
}
}
php spark
コマンドを通じて実行されるCLI機能は、Webサーバーを介さずにバックグラウンド処理や管理タスクを実行する際に非常に便利です。
1 カスタムCLIコマンドの作成
CodeIgniter 4では、spark make:command
コマンドを使ってカスタムコマンドのスケルトンを生成できます。
php spark make:command HelloCommand
これにより、app/Commands/HelloCommand.php
が生成されます。
2 カスタムCLIコマンドのコード例
app/Commands/HelloCommand.php
の内容を編集して、カスタムコマンドを定義します。
// app/Commands/HelloCommand.php
<?php
namespace App\Commands;
use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
class HelloCommand extends BaseCommand
{
// コマンドの名前。`php spark hello:world` のように実行されます。
protected $group = 'Custom Commands'; // コマンドのグループ
protected $name = 'hello:world'; // コマンド名
protected $description = 'Displays a simple hello message.'; // コマンドの説明
// コマンドが受け入れるオプションと引数
protected $options = [
'--name' => 'Name to greet.', // --name オプションを定義
];
/**
* コマンドが実行されたときに呼び出されるメソッド
*/
public function run(array $args)
{
// オプションの値を取得
$name = CLI::getOption('name');
if (is_null($name)) {
// オプションが指定されていない場合、引数から取得を試みる
// 例: php spark hello:world John
$name = $args[0] ?? 'World'; // 引数がない場合は 'World' を使用
}
// コマンドラインにメッセージを出力
CLI::write("Hello, {$name}!");
// データベース操作の例 (CLIコマンドでデータベースにアクセスすることも可能)
// $db = \Config\Database::connect();
// $query = $db->query("SELECT * FROM users LIMIT 1");
// CLI::write("データベースからユーザーを取得しました: " . json_encode($query->getRow()));
}
}
3 カスタムCLIコマンドの実行方法
上記のコマンドを定義した後、プロジェクトのルートディレクトリで以下のコマンドを実行できます。
-
利用可能なコマンド一覧の確認
php spark list
このリストに、
hello:world
コマンドと説明が表示されるはずです。 -
オプションを指定して実行
php spark hello:world --name Bob
出力:
Hello, Bob!
-
引数を指定して実行
php spark hello:world Alice
出力:
Hello, Alice!
-
引数なしで実行
php spark hello:world
出力:
Hello, World!
Docker/コンテナ化
関連するプログラミング/設定
- 実行コマンド
docker-compose up -d # コンテナをバックグラウンドで起動 docker-compose down # コンテナを停止・削除
- Dockerfileの記述
アプリケーションの環境を定義するファイルです。どのベースイメージを使うか(例:php:8.2-apache
)、必要なPHP拡張のインストール、Composerの実行、ファイルのコピー、パーミッションの設定などを記述します。# Dockerfile の例 FROM php:8.2-apache # 必要なPHP拡張をインストール RUN docker-php-ext-install mysqli pdo pdo_mysql opcache # Apacheのmod_rewriteを有効化 RUN a2enmod rewrite # 作業ディレクトリの設定 WORKDIR /var/www/html/your_app # CodeIgniterのファイルをコンテナにコピー COPY . /var/www/html/your_app # Composerの依存関係をインストール (もしvendorディレクトリがない場合) # RUN composer install --no-dev --optimize-autoloader # writableディレクトリのパーミッション設定 (重要) RUN chown -R www-data:www-data /var/www/html/your_app/writable \ && chmod -R 775 /var/www/html/your_app/writable # publicディレクトリをドキュメントルートにするためのApache設定 (例) COPY docker/apache-custom.conf /etc/apache2/sites-available/000-default.conf
CI/CDパイプラインによる自動デプロイ
関連するプログラミング/設定
- 環境変数の管理
本番環境のデータベース接続情報やAPIキーなどの機密情報を、コード内にハードコードするのではなく、CI/CDツールやサーバーの環境変数として安全に管理します。CodeIgniterの.env
ファイルは、この目的のために使用されます。# .env ファイルの例 CI_ENVIRONMENT = production database.default.hostname = your_production_db_host database.default.database = your_production_db_name database.default.username = your_production_db_user database.default.password = your_production_db_password app.baseURL = https://your-production-domain.com/
- デプロイメントスクリプト
- SSH/Rsync
最もシンプルな方法で、サーバーにSSHで接続し、rsync
コマンドでファイルを同期します。 - CapistranoやDeployerなどのデプロイツール
PHPアプリケーションのデプロイメントに特化したツールで、ロールバック機能や複数サーバーへのデプロイなどを簡単に設定できます。 - クラウドプロバイダのデプロイサービス
AWS Elastic Beanstalk, Google App Engine, Azure App Serviceなど、PaaS(Platform as a Service)では、Gitリポジトリを接続するだけで自動デプロイメントが設定できることが多いです。
- SSH/Rsync
- テストの自動化
CodeIgniterにはPHPUnitが統合されており、CLIコマンドでテストを実行できます。CI/CDパイプライン内でこれらのテストを自動実行し、テストに失敗した場合はデプロイを中止します。
CI/CDスクリプトでのテスト実行例:// phpunit.xml.dist (テスト設定ファイルの一部) // <testsuites> セクションにテストスイートの定義がある <testsuites> <testsuite name="App"> <directory>./tests/app</directory> </testsuite> <testsuite name="System"> <directory>./tests/system</directory> </testsuite> </testsuites>
# GitHub Actions Workflow (一部抜粋) name: Deploy CodeIgniter App on: push: branches: - main jobs: build-and-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.2' extensions: mbstring, xml, curl, mysqli # 必要な拡張 - name: Install Composer Dependencies run: composer install --no-dev --prefer-dist - name: Run Tests run: php spark test # CodeIgniterのテスト実行コマンド
- Gitリポジトリとの連携
GitHub Actions, GitLab CI/CD, JenkinsなどのCI/CDツールを使用します。これらのツールは、Gitリポジトリへのプッシュやマージなどのイベントをトリガーにパイプラインを実行します。
- spark optimize コマンド (CodeIgniter 4)
CodeIgniter 4には、デプロイメント前にアプリケーションを最適化するためのspark optimize
コマンドがあります。これは、開発用パッケージの削除、設定キャッシュの有効化、ファイルロケーターキャッシュの有効化などを行います。php spark optimize
- OPcacheの設定
PHPのOPcache拡張を適切に設定することで、PHPスクリプトのパース済みバイトコードをメモリにキャッシュし、リクエストごとのパースをスキップしてパフォーマンスを向上させます。# php.ini のOPcache設定例 (多くの場合、デフォルトで有効) opcache.enable=1 opcache.memory_consumption=128 # MB単位 opcache.interned_strings_buffer=8 # MB単位 opcache.max_accelerated_files=10000 opcache.revalidate_freq=0 # 開発環境では1などに設定し、コード変更を即座に反映させる opcache.save_comments=1 opcache.fast_shutdown=1
- Nginx + PHP-FPM
高いトラフィックを扱うWebサイトでは、Apacheの代わりにNginxをリバースプロキシとして使用し、PHP処理をPHP-FPM (FastCGI Process Manager) に任せる構成が一般的です。Nginxは静的ファイルの配信に優れ、PHP-FPMはPHPスクリプトの実行を効率的に管理します。# Nginx サーバーブロック設定の例 server { listen 80; server_name your-domain.com; root /path/to/your/codeigniter_project/public; # CodeIgniterのpublicディレクトリ index index.php; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { # PHP-FPMへのプロキシ設定 fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; # PHP-FPMのソケットパス fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # .envファイルなど、Webからアクセスさせたくないファイルを拒否 location ~ /\.env { deny all; } }