CodeIgniterの環境構築方法:tideways_xhprofの導入

スポンサーリンク
CodeIgniterの環境構築方法:tideways_xhprofの導入 ノウハウ
CodeIgniterの環境構築方法:tideways_xhprofの導入
この記事は約12分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、docker で環境構築した CodeIgniter に tideways_xhprof を追加する方法についてご紹介します。

スポンサーリンク

前提条件

この記事では、Dockerでの環境構築が完了していることを前提にしています。環境構築の方法については、下記の記事を参考にお願いします。

修正内容

docker-compose.yml

docker-compose.ymlを下記のように修正します。赤字が修正箇所です。

version: '3'

services:
  app:
    build: .
    container_name: amzn-linux-2-app
    platform: linux/x86_64
    privileged: true
    volumes:
      - ./CodeIgniter-3.1.13/application:/var/www/application
      - ./CodeIgniter-3.1.13/system:/var/www/system
      - ./index.php:/var/www/html/index.php
      - ./info.php:/var/www/html/info.php
      - ./.htaccess:/var/www/html/.htaccess
      - ./httpd.conf:/etc/httpd/conf/httpd.conf
      - ./xhprof-html.conf:/etc/httpd/conf.modules.d/xhprof-html.conf
    ports:
      - 8080:80

Dockerfile

Dockerfileを下記のように修正します。赤字が修正箇所です。

FROM amazonlinux:2

# amazon-linux-extras install
RUN amazon-linux-extras install -y epel

# yum update & install
RUN yum update -y \
 && yum install -y \
        systemd \
        httpd \
        wget \
        git \
        graphviz

# PHP
RUN yum install -y 'http://rpms.famillecollet.com/enterprise/remi-release-7.rpm'
RUN yum install -y php74
RUN yum install -y php74-php
RUN yum install -y php74-php-fpm
RUN yum install -y php74-php-devel
RUN ln -s /usr/bin/php74 /usr/bin/php \
 && ln -s /opt/remi/php74/root/usr/bin/phpize     /usr/bin/phpize \
 && ln -s /opt/remi/php74/root/usr/bin/php-config /usr/bin/php-config

# xhprof
RUN cd /tmp \
 && git clone https://github.com/tideways/php-xhprof-extension \
 && cd /tmp/php-xhprof-extension \
 && phpize \
 && ./configure \
 && make \
 && make test \
 && make install

RUN mkdir -vp /var/log/xhprof \
 && chmod 777 /var/log/xhprof

RUN echo 'extension=tideways_xhprof.so'    >> /etc/opt/remi/php74/php.d/tideways.ini \
 && echo 'tideways.auto_prepend_library=0' >> /etc/opt/remi/php74/php.d/tideways.ini

RUN cd /var/www/ \
 && git clone https://github.com/sters/xhprof-html.git ./xhprof-html \
 && cd ./xhprof-html \
 && sed -i "81c\$xhprof_runs_impl = new XHProfRuns_Default('\/var\/log\/xhprof');" callgraph.php

# httpd
RUN echo "Mutex posixsem" >> /etc/httpd/conf/httpd.conf
RUN systemctl enable httpd

# init
CMD ["/sbin/init"]

xhprof-html.conf

xhprof-html.confを下記の内容で新規作成します。

<IfModule alias_module>
    Alias /xhprof /var/www/xhprof-html
</IfModule>

xhprof-html.confを下記のパスになるように配置します。

./app/xhprof-html.conf

app/CodeIgniter-3.1.13/application/hooks/tideways_xhprof.php

tideways_xhprof.phpを下記の内容で新規作成します。

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class MyTidewaysXhprof {

	public function enable()
	{
		tideways_xhprof_enable();
	}

	public function disable()
	{
		$data = tideways_xhprof_disable();
		$filename = '/var/log/xhprof/' . intval(microtime(true)) . mt_rand(1, 10000) . '.xhprof';
		file_put_contents($filename, serialize($data));
	}

}

tideways_xhprof.phpを下記のパスになるように配置します。

app/CodeIgniter-3.1.13/application/hooks/tideways_xhprof.php

app/CodeIgniter-3.1.13/application/config/config.php

app/CodeIgniter-3.1.13/application/config/config.phpを修正します。デフォルトだと105行目にあります。

$config['enable_hooks'] = TRUE;

app/CodeIgniter-3.1.13/application/config/hooks.php

app/CodeIgniter-3.1.13/application/config/hooks.phpを修正します。下記の内容を追記します。

$hook['pre_controller'] = array(
    'class'    => 'MyTidewaysXhprof',
    'function' => 'enable',
    'filename' => 'tideways_xhprof.php',
    'filepath' => 'hooks',
    'params'   => array()
);

$hook['post_controller'] = array(
    'class'    => 'MyTidewaysXhprof',
    'function' => 'disable',
    'filename' => 'tideways_xhprof.php',
    'filepath' => 'hooks',
    'params'   => array()
);

tideways_xhprof.phpを下記のパスになるように配置します。

app/CodeIgniter-3.1.13/application/hooks/tideways_xhprof.php

ビルド&再起動

docker compose build
docker compose up -d

動作確認

CodeIgniterへのリクエスト

ブラウザで「http://localhost:8080/Blog」にアクセスします。

xhprofの確認

ブラウザで「http://localhost:8080/xhprof/?dir=/var/log/xhprof」にアクセスします。

任意のURLをクリックします。

[View Full Callgraph]をクリックします。時間がかかっている処理に色付けされたグラフが表示されます。

これで、時間のかかっている処理などを分析することができます。

解説

tideways_xhprofとは

tideways_xhprofは、PHPプロファイリングツールの一種であり、PHPアプリケーションのパフォーマンスを分析するために使用されます。このツールは、PHPプロセスの実行時間、CPU使用率、メモリ使用量などの詳細な情報を収集することができます。

tideways_xhprofは、xhprofというツールの改良版であり、xhprofよりも高速で正確な情報を提供します。tideways_xhprofは、WebアプリケーションやCLIスクリプトで使用することができます。

tideways_xhprofは、PHPの拡張機能として提供されており、インストールと設定は比較的簡単です。また、tideways_xhprofにはWebインターフェイスがあり、分析結果を見やすく表示することができます。

tideways_xhprofを使用することで、PHPアプリケーションのボトルネックを特定し、パフォーマンスの改善に役立てることができます。

詳しい読み方は下記のサイトが参考になります。

CodeIgniterのhook機能について

CodeIgniterのフレームワークでは、フック(Hook)と呼ばれる機能を使用して、アプリケーションの実行前や実行後にカスタムコードを挿入することができます。これにより、アプリケーションの機能を拡張したり、特定の処理を追加したりできます。

以下は、CodeIgniterでフックを使用する方法の例です。

  1. フックの有効化

フックを使用するには、まずフックを有効化する必要があります。 application/config/config.php ファイルを開き、以下の設定を変更します。

$config['enable_hooks'] = TRUE;
  1. フックの定義

次に、 application/config/hooks.php ファイルにフックを定義します。フックは、関数名と実行するタイミングを指定して定義されます。

例えば、以下のように定義します。

$hook['pre_controller'] = array(
    'class' => 'MyHookClass',
    'function' => 'MyHookFunction',
    'filename' => 'MyHookClass.php',
    'filepath' => 'hooks',
    'params' => array('param1', 'param2', 'param3')
);

上記の例では、フックは「pre_controller」というイベントポイントで実行され、MyHookClass.phpファイルに定義されているMyHookClassクラスのMyHookFunctionメソッドが実行されます。$paramsは、MyHookFunctionに渡す引数を指定します。

  1. フッククラスの定義

次に、定義したフックのクラスファイルを作成します。このファイルは、フックのファイルパスに基づいて置かれる必要があります。上記の例で言えば、MyHookClass.phpapplication/hooks/ 内にある必要があります。

class MyHookClass {
    function MyHookFunction($param1, $param2, $param3) {
        // フックの処理
    }
}
  1. フックの実行

フックは、CodeIgniterの実行中に自動的に実行されます。フックが実行されたときにMyHookClassのMyHookFunctionメソッドが実行されます。

以上が、CodeIgniterでフックを使用する方法の例です。フックを使用することで、アプリケーションの動作を拡張し、コアシステムやサードパーティのライブラリを変更することなく、アプリケーションの動作をカスタマイズすることができます。

おまけ

特定のタイミングでフックを手動で実行することもできます。

以下は、フックを手動で実行する例です。

$this->load->helper('hook');
call_hook('pre_controller');

これにより、 pre_controller タイミングで定義されたフックが実行されます。

おわりに

今日は、docker で環境構築した CodeIgniter に tideways_xhprof を追加する方法についてご紹介しました。PHPのアプリケーション改善やパフォーマンス改善につなげましょう。

よっしー
よっしー

また明日お会いしましょう!

コメント

タイトルとURLをコピーしました