[デバッグ]PHPで処理の時間を計測するための方法

glass-time-watch-businessプログラムの処理が重たい時、どこの処理で時間を食っているか調べたくなりますね。

そんな時はPHPの microtime関数を使うと簡単に処理時間の計測ができ、ボトルネックを発見できます。

microtime 関数とは

現在の Unix タイムスタンプをマイクロ秒まで返す関数です。

引数を指定しないか、falseを設定すると「文字列」でマイクロ秒を返します。

引数にtrueを設定すると「float(浮動小数点数)」で値を返します。

処理時間の計測をするためには開始時間と終了時間の差分を出したいので、常に引数はtrueを指定します。

参考
http://php.net/manual/ja/function.microtime.php

マイクロ秒ってどんな数字!?

マイクロ秒(マイクロセカンド、マイクロセック)とは、100万分の1秒のことで、非常に細かな時間です。「μs」や「us」や「usec」というふうに表記されます。

microtime 関数で処理速度を計測してみる

シンプルな計測方法

これを動かしてみるとこんな結果になります。

処理時間:1.0002000331879秒

複数箇所の計測方法

配列を使ってあげると複数箇所の計測も簡単に実装できます。

実行結果はこんな感じです。

0番目の処理に掛かった時間:1.0006420612335秒
1番目の処理に掛かった時間:1.0003950595856秒
2番目の処理に掛かった時間:1.0009589195251秒

精度について

ここまでmicrotime関数を使用した計測の仕方を書いてきましたが、より高い精度でmicrotime関数を使用するための考察をされている記事を見つけましたので紹介させていただきます。

高い精度をお求めの方はぜひ参考になされてください。

microtimeの差分

Unixタイムスタンプをマイクロ秒まで表現するには整数部10桁+小数部6桁の16桁必要ですがPHPのfloat値には約14桁の制度しかないのです

なるほどなぁ。ちなみに私の場合はザクっと処理時間が分かればいいかなぁ程度だったので、紹介記事のようにはしませんでした(^^;)ナンテコッタ

まとめ

microtime関数を使うことでお手軽に処理時間の計測ができます。

実行時間が長すぎて困っている方、デバッグのお供にどうぞ。



CodeIgniter 3入門(インストールから設定まで)

CodeIgniterのことを勉強したのでメモ。日本語サイトにCodeIgniter Ver.2のユーザガイドがあったのですがCodeIgniter Ver.3のユーザガイドの日本語版が無く、辞書とにらめっこしながら進めました。

間違い等あればご指摘くださいませ。

これからCodeIgniterを学ぶ方のお役に立てれば幸いです。

2016年2月23日追記
kenjis様より日本語ユーザガイドのURLをコメント頂きました。
現在翻訳中とのことです。ありがとうございます。

日本語ユーザガイド
http://codeigniter-jp.github.io/user_guide_src_ja/

2017/01/26 URLが変更されていました。以下が日本語ユーザガイドになります。

http://codeigniter.jp/user_guide/3/

CodeIgniterとは

PHP言語のフレームワークです。

フレームワークとはよく使う処理のお道具箱みたいなもので、フレームワークを使うことによりプログラムの開発効率を上げることができます。

CodeIgniterの読み方

ウィキペディアによると、「コードイグナイター」と読むそうです。なるほど。

CodeIgniter 3の動作要件

CodeIgniter 3を動作させるにはPHP version 5.4 以上が必要です。

以下のデータベース(バージョン)に対応しています。

  • MySQL (5.1+) via the mysql (deprecated), mysqli and pdo drivers
  • Oracle via the oci8 and pdo drivers
  • PostgreSQL via the postgre and pdo drivers
  • MS SQL via the mssql, sqlsrv (version 2005 and above only) and pdo drivers
  • SQLite via the sqlite (version 2), sqlite3 (version 3) and pdo drivers
  • CUBRID via the cubrid and pdo drivers
  • Interbase/Firebird via the ibase and pdo drivers
  • ODBC via the odbc and pdo drivers (you should know that ODBC is actually an abstraction layer)

参照
http://www.codeigniter.com/user_guide/general/requirements.html

CodeIgniter 3のライセンス

MITライセンスです。

The MIT License (MIT)

参照
http://www.codeigniter.com/user_guide/license.html

ちなみに、CodeIgniter 3.0からMITライセンスになったようで、2.xまでは独自のCodeIgniterライセンスというライセンスを採用していたようです。

 

CodeIgniter 3のインストール

CodeIgniterのダウンロード

CodeIgniterの公式サイトからダウンロードしましょう!執筆時、Version 3.0.4が最新バージョンでした。

https://codeigniter.com/

キャプチャ.JPG
公式サイトトップページのDownloadからCodeIgniter Version 3をダウンロード

アーカイブを展開

ダウンロードしたアーカイブを展開します。

ファイルをアップロード

「展開したファイルをサーバ上にアップロードします。」とサラッとCodeIgniterの公式に書いてあるのですが、以下の画面キャプチャで選択してあるファイルだけで問題ないかと思います。

キャプチャ.JPG
application sysytem index.php license.txt のみのアップロードで大丈夫っぽい

CodeIgniter 3の設定

基本設定ファイル(config.php)を編集する

application/config/config.php

を開き”base_url”の設定をします。

$config[‘base_url’] = ‘http://example.com/’;

基本設定ファイル(config.php)を忘れずにサーバにアップロードしましょう!

とりあえず表示確認してみよう

ブラウザで、サイトを表示してみましょう!以下のように表示されていれば設置成功です。

無題.png

データベース設定ファイル(database.php)を編集する

設置が確認できたら更に設定を行っていきます。データベース使わない場合などはこの項目の作業は不要かと思います。

application/config/database.php

を開き以下を変更します。

全ての設定が必要というわけではなく、必要な部分だけ設定します。

設定する主な項目

hostname: データベースサーバのホスト名
username: データベースのユーザ名
password: データベースのパスワード
database: データベース名
dbdriver:データベースのタイプ(mysqli(MySQLの場合), postgre(PostgreSQLの場合))

参考
http://www.codeigniter.com/user_guide/database/configuration.html

.htaccess を設定する

CodeIgniterの初期設定では、以下のように index.php が含まれたURL構造になってしまいます。

これを回避するために.htaccessファイルを作成して以下のように記述します。

作成した.htaccessファイルは忘れずにサーバにアップロードしましょう。license.txtと同じ位置に置くと良いでしょう!

参考
http://www.codeigniter.com/user_guide/general/urls.html#removing-the-index-php-file

感想

いろんなフレームワークがありますが、かなり簡単に設置出来るのがGood!

(2.x系は豊富だけど)日本語のドキュメントが少ないのでGoogle翻訳を駆使して理解していく必要がありそうです。



Google Analytics Core Reporting API ディメンション・メトリクスの覚書[徐々に更新中]

キャプチャ.JPG

Google Analytics Core Reporting API で指定するディメンション(dimensions)やメトリクス(metrics)の覚書です。

似たようなのが多くて混乱したので、使ったところだけ注釈を入れています。

順次更新しています。


 User

Dimensions

ga:userType

ga:sessionCount

ga:daysSinceLastSession

ga:userDefinedValue

Metrics

ga:users

ga:newUsers

ga:percentNewSessions

ga:1dayUsers

ga:7dayUsers

ga:14dayUsers

ga:30dayUsers

ga:sessionsPerUser


Session

Dimensions

ga:sessionDurationBucket

Metrics

ga:sessions (セッション数)

ga:bounces (直帰数)

ga:bounceRate (直帰率)

ga:sessionDuration

ga:avgSessionDuration

ga:hits


Traffic Sources

Dimensions

ga:referralPath(参照元サイトのパス)

/foo/bar.html
のように取得できますが、これだけだと何なのかちんぷんかんぷんですね。

ga:fullReferrer(参照元サイトのURL)

example.jp/foo/bar.html
のように取得できます。
yahoo,google,bing 等も取得してきてしまうことや、リファラスパムも取得してしまうので、以下のフィルタを掛けると純粋な形で取得できるかと思います。良い方法があれば教えて下さいm(_ _)m

filters:ga:fullReferrer!=(direct);ga:fullReferrer!=google;ga:fullReferrer!=yahoo;ga:fullReferrer!=bing;ga:fullReferrer!=goo.ne;ga:fullReferrer!=biglobe;ga:fullReferrer!=ask;ga:fullReferrer!=biglobe;ga:fullReferrer!=traffic2cash.xyz/;ga:fullReferrer!=share-buttons.xyz/;ga:fullReferrer!=traffic-cash.xyz/;ga:fullReferrer!=free-social-buttons.xyz/;ga:fullReferrer!=net-profits.xyz/;ga:fullReferrer!=web-revenue.xyz/;ga:fullReferrer!=free-traffic.xyz/;ga:fullReferrer!=с.новым.годом.рф/;ga:fullReferrer!=jp.hao123.com/yahoo-search-demo-sample;ga:fullReferrer!=social-widget.xyz/

ga:campaign

ga:source(参照元サイトのホスト名)

example.jp
のように取得できます。

ga:medium (参照元の媒体)

以下の様な情報を取得できます。

(none):ブックマーク等によるダイレクトアクセス
organic:検索エンジンからのアクセス
referral:外部サイトからのアクセス
cpc:CPC広告によるアクセス
【以下よくわからないパラメータです。ヘルプ!】
cpa、cpm、cpp、cpv、ppc

ga:sourceMedium(参照元サイトのホスト名と媒体)

以下の様な情報を取得できます。

google / organic
yahoo / organic
bing / organic
(direct) / (none)
example.com / referral

ga:keyword(検索キーワード)

「居酒屋 愛知」のような検索キーワードを取得できます。キーワードが設定されていない場合や提供されていない場合は【(not set)】や【(not provided)】を取得してしまうので以下のフィルタを掛けてあげると良いと思います。

filters:ga:keyword!=(not provided);ga:keyword!=(not set)

ga:adContent

ga:socialNetwork

ga:hasSocialSourceReferral

ga:campaignCode

Metrics

ga:organicSearches


Goal Conversions

Dimensions

ga:goalCompletionLocation

ga:goalPreviousStep1

ga:goalPreviousStep2

ga:goalPreviousStep3

Metrics

ga:goalXXStarts

ga:goalStartsAll

ga:goalXXCompletions

ga:goalCompletionsAll

ga:goalXXValue

ga:goalValueAll

ga:goalValuePerSession

ga:goalXXConversionRate

ga:goalConversionRateAll

ga:goalXXAbandons

ga:goalAbandonsAll

ga:goalXXAbandonRate

ga:goalAbandonRateAll


Platform or Device

Dimensions

ga:browser (ブラウザ)

ga:browserVersion (ブラウザバージョン)

ga:operatingSystem (OS[オペレーティング・システム])

ga:operatingSystemVersion (OSのバージョン)

ga:mobileDeviceBranding

ga:mobileDeviceModel

ga:mobileInputSelector

ga:mobileDeviceInfo

ga:mobileDeviceMarketingName

ga:deviceCategory

ga:browserSize

ga:dataSource

Metrics

None(メトリクス無し)


Page Tracking

Dimensions

ga:hostname

ga:pagePath(サイトコンテンツへのパス)

以下の様な情報が取得できます。GETパラメータもついてきますのでリファラスパムをフィルタで除外してあげる必要が有りそうです。

/index.html
/path/to/contents.html
/index.html?from=http://spam.example.com/

ga:pagePathLevel1(サイトコンテンツへのパス(第1階層のみ))

以下のようなサイトの第1階層にあるコンテンツへのパスが取得できます。ga:pagePathと同様にGETパラメータもついてきます。

/index.html
/aboutus/
/index.html?from=http://spam.example.com/
/company/

ga:pagePathLevel2(サイトコンテンツへのパス(第2階層のみ))

以下のようなサイトの第2階層にあるコンテンツ(http://example.com/●●/ココ.html)へのパスが取得できます。

/index.html
/hoge.html

ga:pagePathLevel3(サイトコンテンツへのパス(第3階層のみ))

ga:pagePathLevel2と同様に第3階層が取得できます。

ga:pagePathLevel4(サイトコンテンツへのパス(第4階層のみ))

ga:pagePathLevel2と同様に第4階層が取得できます。

ga:pageTitle (ページタイトル)

ページタイトルが取得できます。

ga:landingPagePath (ランディングページのパス)

/hogehoge/hogehoge.html のように取得できます。

サイトのトップページをランディングページから除外する処理は以下のように書きました。

filters:ga:landingPagePath==/,ga:landingPagePath==/index.html,ga:landingPagePath==/index.php

ga:secondPagePath

ga:exitPagePath

ga:previousPagePath

ga:pageDepth

Metrics

ga:pageValue

ga:entrances

ga:entranceRate

ga:pageviews

ga:pageviewsPerSession

ga:uniquePageviews

ga:timeOnPage

ga:avgTimeOnPage

ga:exits (離脱数)

ga:exitRate (離脱率)


Time

Dimensions

ga:date (日付)

ga:year (年)

ga:month (月)

ga:week (週)

ga:day (日)

ga:hour (時)

ga:minute (分)

ga:nthMonth

ga:nthWeek

ga:nthDay

ga:nthMinute

ga:dayOfWeek

ga:dayOfWeekName

ga:dateHour

ga:yearMonth

ga:yearWeek

ga:isoWeek

ga:isoYear

ga:isoYearIsoWeek

ga:nthHour

Metrics

None(メトリクス無し)


 

参照
https://developers.google.com/analytics/devguides/reporting/core/dimsmets