このエントリーをはてなブックマークに追加

更新日: 2016年2月25日

実行時間: 0.0237

CI_Output

 CI_Outputクラスは、クライアントへのレスポンス(出力)、つまり、 HTTPレスポンスヘッダ及び、HTTPレスポンスボディの管理と実行を行います。

 HTTPレスポンスヘッダは、一般的にPHPのデフォルト設定により出力されるため 通常のHTMLを返すようなWebアプリケーションでは意識する必要はありません。
 しかし、「Json」や「XML」、「CSV」、「画像などのバイナリデータ」等々、HTML以外の出力を行う場合は HTTPレスポンスヘッダの「Content-Type:」を変更しなければなりません。
 また、拡張HTTPレスポンスヘッダ「X-***-***」を付加する場合など、HTTPヘッダをカスタマイズする必要がある場合は、 CI_Outputクラスの機能を利用することになります。

 HTTPレスポンスヘッダだけでなく、HTTPレスポンスボディ部も「CI_Output」クラスによって出力されています。
「CI_Output」クラスを利用することで、CodeIgniterのビューを利用することなくユーザ独自のビュー処理を行うことも可能です。

 CodeIgniterに備わっているビューは「CI_Loader」によって、テンプレートファイルがロード・パース処理が行われ 最終的に「CI_Output」クラスに出力するデータが渡されクライアントに出力される仕組みになっています。

CI_Outputの提供する機能

CI_Outputクラスが提供する機能について説明します。

get_output()

     出力バッファリングされたデータを取得します。引数はありません。

    $output = $this->output->get_output();
    echo $output;

set_output($output)

     出力バッファにデータをセットします。以前にセットされたバッファデータは新しいものに上書きされてしまいます。 引数は、出力バッファにセットしたいデータです。
    下記の例では「echo」で出力していますが、通常、CodeIgniterではコントローラ処理の後、出力バッファのデータは自動で出力されます。
     自動出力を制御する方法はこのページの最下部で説明します。

    $output = 'Hello world';
    $this->output->set_output();
    echo $this->output->get_output();
    //=> Hello world

append_output($output)

     出力バッファにデータを追加します。引数は出力バッファに追加するデータです。
    下記の例では「echo」で出力していますが、通常、CodeIgniterではコントローラ処理の後、出力バッファのデータは自動で出力されます。
     自動出力を制御する方法はこのページの最下部で説明します。

    $this->output->append_output('Hello');
    $this->output->append_output(' ');
    $this->output->append_output('world');
    echo $this->output->get_output();
    //=> Hello world
    $this->output->set_output('OK 牧場');
    echo $this->output->get_output();
    //=> OK 牧場

     メソッドチェーンでの記述も可能です。

    $this->output->set_output('Hello')->append_output(' ')->append_output('world');

set_header($header, $replace = TRUE)

     HTTPレスポンスヘッダをセットします。第一引数にHTTPレスポンスヘッダにセットしたい文字列を 第二引数に前にセットされた同じHTTPレスポンスヘッダを上書きするか追加するかBool値(TRUEかFALSE)をしていします。 デフォルトは「TRUE」です。
    TRUEをセットすると上書きされFALSEをセットすると追加されます。
     PHPの設定「zlib.output_compression」を有効にしている場合は「Content-length」の指定はできません。

    $this->output->set_header('X-Original-header: ci-guide.info');

set_content_type($mime_type) 一番上に戻る

     HTTPレスポンスヘッダの「Content-Type:」の「mime-type」をセットします。引数は「mime-type」を表わす文字列です。

    $this->output->set_content_type('text/csv');

set_status_header($code = 200, $text = '') 一番上に戻る

     HTTPステータスコードをセットします。デフォルトは「200」です。第一引数はステータスコードの3桁の数値、 第二引数にステータスを表わす文字列をセットします。

    $this->output->set_status_header(404, 'Not Found');

enable_profiler($val = TRUE) 一番上に戻る

     Webアプリケーション開発時にデバッグ情報出力を有効にします。このメソッドを任意のタイミングで実行すると レスポンスデータの最下部にデバッグ情報が追加され出力されます。開発・テスト時以外では実行すべきではありません。
     出力されるデバッグ情報は以下のものがあります。

    • benchmark: ベンチマーク
    • memory_usage: メモリ使用量
    • get: GETクエリデータ
    • post: POSTデータ
    • uri_string: URIパス
    • controller_info: コントローラクラス名/アクションメソッド名
    • queries: SQLクエリ、SQLクエリ実行時間
    • http_headers: HTTPリクエストヘッダ
    • config: 設定情報($config連想配列情報)
    • session_data: セッションデータ
    $this->output->enable_profiler();

    引数に「FALSE」をセットすることでデバッグ出力を無効に変更することができます。

    $this->output->enable_profiler(FALSE);

set_profiler_sections($sections) 一番上に戻る

     「enable_profiler()」メソッドと共に利用します。
     このメソッドでは「enable_profiler()」によるデバッグ出力の項目を制御することができます。
    引数には、連想配列で「添え字(インデックスキー)」に出力制御するprofiler 項目名を、「値」に「TRUE」または「FALSE」をセットします。
    デフォルトでは、全て出力(TRUE)になっているので、出力しないprofiler項目を「FLASE」で指定します。

    • profiler 項目名
      • benchmark
      • memory_usage
      • get
      • post
      • uri_string
      • controller_info
      • queries
      • http_headers
      • config
      • session_data
    $profiler = array(
        'benchmarks' => FALSE
        'get' => FALSE
    );
    $this->output->set_profiler_sections($profiler);

cache($minute) 一番上に戻る

     引数に「0」以上の数値をセットして実行することでキャッシュ機能を有効にします。 引数の数値の単位は「分」になります。
     キャッシュを有効にすると、最終出力がキャッシュファイルとして保存され、指定した時間、同じURIパスによるリクエストでは そのキャッシュファイルの内容が出力されます。

     キャッシュの有効範囲には注意が必要です。アクションメソッドで「cache()」メソッドを実行すると、 そのアクションメソッドの出力のみがキャッシュされます。  コントローラクラスの「__construct()」メソッド内で実行すると、 そのコントローラ全てのアクションメソッドの出力がキャッシュされます。
     すべてのコントローラクラスのアクションメソッドの出力でキャッシュ機能を有効にするには、 「application/core/」ディレクトリに「CI_Controller」 クラスをオーバーライドした独自の親コントローラクラスを作成し、 その「__construct()」メソッドで「cache()」メソッドを実行します。

     キャッシュファイルを保存するのデフォルトのディレクトリは「application/cache/」になり、これを変更する場合は、 「application/config/config.php」設定ファイルの 「$config['cache_path']」で設定します。

  • application/config/config.php
  • $config['cache_path'] = APPPATH.'views/cache';

    キャッシュファイルを保存するディレクトリのパーミッションはWebサーバアプリケーションが書き込める権限が必要になります。

  • 特定のアクションメソッドをキャッシュ
  • public function my_action()
    {
        $this->output->cache(10);
        $this->load->view('my_template');
    }
                            
  • 特定のコントローラの全てのアクションメソッドをキャッシュ
  • public function __construct()
    {
        parent::__construct();
        $this->output->cache(10);
    }
                            
  • 全てのコントローラのアクションメソッドをキャッシュ
  • class MY_Controller extends CI_Controller
    {
        public function __construct()
        {
            parent::__construct();
            $this->output->cache(10);
        }
    }
                            

コントローラからの追加出力処理

 デフォルトでは、「CI_Output」の「set_output()」や「append_output()」メソッドでセットされた出力データ、 または、「$this->load->view()」で読み込まれたテンプレートは自動でクライアントに出力されます。
 CodeIgniterには、この自動出力を制御する方法があります。コントローラクラスに「_output()」メソッドを定義しておくと CodeIgniterによる自動出力が行われず、出力のタイミングで「_output()」メソッドが実行されます。

_output($output) 一番上に戻る

     引数には、最終出力バッファデータが渡されますので、最終出力バッファデータに対し独自の処理を行うことも可能です。

    class Index extends CI_Controller
    {
        public function __construct()
        {
            parent::__construct()');
        }
    
        public function _output($output)
        {
            /*
            何かの処理
            */
            echo $output;
        }
    }