こんにちは。よっしーです(^^)
今日は、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でフックを使用する方法の例です。
- フックの有効化
フックを使用するには、まずフックを有効化する必要があります。 application/config/config.php
ファイルを開き、以下の設定を変更します。
$config['enable_hooks'] = TRUE;
- フックの定義
次に、 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
に渡す引数を指定します。
- フッククラスの定義
次に、定義したフックのクラスファイルを作成します。このファイルは、フックのファイルパスに基づいて置かれる必要があります。上記の例で言えば、MyHookClass.php
は application/hooks/
内にある必要があります。
class MyHookClass {
function MyHookFunction($param1, $param2, $param3) {
// フックの処理
}
}
- フックの実行
フックは、CodeIgniterの実行中に自動的に実行されます。フックが実行されたときにMyHookClassのMyHookFunctionメソッドが実行されます。
以上が、CodeIgniterでフックを使用する方法の例です。フックを使用することで、アプリケーションの動作を拡張し、コアシステムやサードパーティのライブラリを変更することなく、アプリケーションの動作をカスタマイズすることができます。
おまけ
特定のタイミングでフックを手動で実行することもできます。
以下は、フックを手動で実行する例です。
$this->load->helper('hook');
call_hook('pre_controller');
これにより、 pre_controller
タイミングで定義されたフックが実行されます。
おわりに
今日は、docker で環境構築した CodeIgniter に tideways_xhprof を追加する方法についてご紹介しました。PHPのアプリケーション改善やパフォーマンス改善につなげましょう。
また明日お会いしましょう!
コメント