CodeIgniterアプリ実行の基本:WebサーバーとCLI活用の徹底解説

2025-05-26

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エラー
    構文エラー、未定義の変数や関数へのアクセス、致命的な実行時エラーなど。

トラブルシューティング

  1. PHPエラーログの確認
    • php.inidisplay_errors = Onlog_errors = Onを設定し、error_logのパスを確認します。
    • Webサーバーのエラーログ(Apacheならerror_log、Nginxならerror.log)を確認します。
    • CodeIgniterのwritable/logsディレクトリにもエラーログが出力されている場合があります。
    • ログに記載されているエラーメッセージとファイルパスを元に、問題箇所を特定・修正します。
  2. .htaccessファイルの確認 (Apacheの場合)
    • CodeIgniterのドキュメントに記載されている標準の.htaccessファイルを使用しているか確認します。
    • 特にRewriteEngine OnRewriteBaseの設定が正しいか確認します。
    • AllowOverride AllがWebサーバーの設定で有効になっているか確認します。
  3. ファイルパーミッションの確認
    • 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サーバーのユーザー/グループ名に合わせて変更してください)
  4. PHPメモリ制限の確認
    • php.inimemory_limitの値を増やします。例: memory_limit = 256M
    • 値を変更した後はWebサーバーを再起動してください。
  5. $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に定義されていない、またはコントローラー/メソッドが存在しない。

トラブルシューティング

  1. ルーティングの確認
    • app/Config/Routes.phpを確認し、アクセスしようとしているURLに対応するルートが定義されているか確認します。
    • デフォルトのルート($routes->setDefaultController())が正しいコントローラーを指しているか確認します。
    • auto_routing_improved(CodeIgniter 4.x)が有効になっている場合、URLとコントローラー/メソッド名が直接対応していることを確認します。
  2. 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;
      }
      
  3. ファイル名とクラス名の大文字・小文字の確認
    • コントローラーファイル名 (app/Controllers/MyController.php) とクラス名 (class MyController)、そしてURL (http://example.com/mycontroller) が正確に一致しているか確認します。特にLinux環境で注意が必要です。
  4. $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内のホスト名、ユーザー名、パスワード、データベース名が間違っている。

トラブルシューティング

  1. 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',
          // ...
      ];
      
  2. データベースサーバーの起動確認
    • データベースサーバーのサービスが実行中か確認します。
    • mysql -u your_db_user -pのようにコマンドラインから直接データベースに接続できるか試します。
  3. ポートの確認
    • データベースがデフォルト以外のポートで動作している場合、hostnameにポート番号を含めて指定します(例: 'hostname' => 'localhost:3307')。
  4. ファイアウォールの確認
    • データベースサーバーがあるマシンでファイアウォールが有効になっている場合、データベースへの接続ポート(MySQLなら3306)が開いているか確認します。

エラー:ComposerまたはVendor関連のエラー

原因

  • PHPバージョンと依存関係の不一致
    composer.jsonで定義されているPHPのバージョンと、現在のPHPバージョンが一致していない。
  • composer installの実行忘れ
    プロジェクトのクローン後にcomposer installを実行していない。
  • Composerの依存関係がインストールされていない
    vendorディレクトリが存在しない、または必要なライブラリが不足している。

トラブルシューティング

  1. composer installの実行
    • プロジェクトのルートディレクトリでcomposer installを実行します。
    • もしvendorディレクトリが破損していると思われる場合は、rm -rf vendor composer.lockで削除してからcomposer installを再実行します。
  2. PHPバージョンの確認
    • php -vで現在のPHPバージョンを確認し、composer.jsonrequireセクションに記載されている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-dataapacheなど)によって読み取り可能であるか確認します。必要に応じてchmodコマンドでパーミッションを調整します。
  • Webサーバーのドキュメントルートの確認
    • Apacheのバーチャルホスト設定やNginxの設定で、DocumentRootがCodeIgniterのpublicディレクトリ(またはCodeIgniter 3の場合はプロジェクトルート)を指していることを確認します。
  • .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モジュールが有効になっているか確認します。
  • コントローラーとメソッドの確認
    • URLのパスが、コントローラーのファイル名(例: Users.php)とクラス名(class Users extends BaseController など)、そしてメソッド名(public function profile())に一致しているか確認します。
    • 特に、ファイル名やクラス名の大文字・小文字が重要です(Linuxサーバーなどでは厳密に区別されます)。
  • ルーティングの確認
    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/cachewritable/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_limitmax_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の致命的なエラーはここに記録されることがあります。

"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 servephp spark [コマンド]を実行していることを確認します。

特定のPHP拡張モジュールが不足しているエラー

CodeIgniterや利用しているライブラリが特定のPHP拡張モジュール(例: intl, mbstring, gd, curl, json, pdo_mysqlなど)を必要とする場合、それらがサーバーにインストールされていない、または有効になっていない場合にエラーが発生します。

原因

  • 拡張モジュールがphp.iniで有効になっていない(;でコメントアウトされているなど)。
  • 必要なPHP拡張モジュールがサーバーにインストールされていない。

トラブルシューティング

  • 拡張モジュールのインストールと有効化
    • サーバーのOSやPHPのバージョンに応じて、必要な拡張モジュールをインストールします(例: sudo apt-get install php-intlsudo yum install php-mbstring)。
    • php.iniファイルを開き、不足している拡張モジュールに対応する行(例: extension=intl)の先頭にある;を削除してコメント解除し、有効化します。
    • Webサーバー(Apache/Nginx)を再起動します。
  • 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リポジトリを接続するだけで自動デプロイメントが設定できることが多いです。
  • テストの自動化
    CodeIgniterにはPHPUnitが統合されており、CLIコマンドでテストを実行できます。CI/CDパイプライン内でこれらのテストを自動実行し、テストに失敗した場合はデプロイを中止します。
    // phpunit.xml.dist (テスト設定ファイルの一部)
    // <testsuites> セクションにテストスイートの定義がある
    <testsuites>
        <testsuite name="App">
            <directory>./tests/app</directory>
        </testsuite>
        <testsuite name="System">
            <directory>./tests/system</directory>
        </testsuite>
    </testsuites>
    
    CI/CDスクリプトでのテスト実行例:
    # 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;
        }
    }