最新のbrowscap.iniをAgentクラスで使用すると大幅なメモリ増加となる

1,330 views
Skip to first unread message

shiho

unread,
May 27, 2014, 8:34:53 PM5/27/14
to fuelp...@googlegroups.com
はじめまして、よろしくお願いします。

Agentクラスの設定で最新のbrowscap.iniを参照すると
大幅なメモリ増加となり、高負荷の状態となってしまいます。

こちらの原因と対応方法をご存知の方いらっしゃいませんでしょうか?

参照しているのは、こちらです。
lite_php_browscap.ini (4,643 KB)

以上、よろしくお願いいたします。

Kenji Suzuki

unread,
Oct 29, 2014, 10:07:52 PM10/29/14
to fuelp...@googlegroups.com
Kenji です。


今、FuelPHP 1.7.2で検証してみたのですが、インストール直後のWelcomeページは

Page rendered in 0.0099s using 0.436mb of memory.

ですが、echo Agent::browser();と追加するだけで、

Page rendered in 3.5703s using 44.822mb of memory.

になりました。確かに劇重ですね。


対応方法ですが、

http://w.terminal-end.net/?p=708

にあるように、browscap.iniをダウンロードしてphp.iniで設定することで

Page rendered in 3.4617s using 0.456mb of memory.

になりました。

メモリは減少してますが、重いのはあいかわらずですね。


// Kenji


2014年5月28日水曜日 9時34分53秒 UTC+9 shiho:

kit.t

unread,
Oct 29, 2014, 11:23:59 PM10/29/14
to fuelp...@googlegroups.com
browscapの最新ファイルが
php_browscap.ini (9,758 KB)
とありますので元のbrowscapの仕様によるところが大きいと思います。 

自動更新についてはPHPの実行時間制限も越えてしまいます。
なお、ディフォルトの設定である

agent.php
'url' => 'http://tempdownloads.browserscap.com/stream.asp?Lite_PHP_BrowsCapINI',  // only major browsers and search engines
//'url' => 'http://tempdownloads.browserscap.com/stream.asp?Full_PHP_BrowscapINI',  // complete file, approx. 3 times the lite version
 
は現在使用不可なので変更の必要があります。


この問題はbrowscap側のフォーラムでも挙がっていますが
v5024からv5032でサイズが2.6MB→8MBにも変化しているとのことです。

軽量化の変更も進行中のようです。

Kenji Suzuki

unread,
Oct 30, 2014, 12:02:07 AM10/30/14
to fuelp...@googlegroups.com
Kenji です。


むむ、そんなに増えているんですね。遅くなるのも
無理ないという感じでしょうか。

情報ありがとうございます。


なお、Agent classのurlは1/26に修正がコミットされていますので、Fuel 1.7.2では修正されています。

https://github.com/fuel/core/commit/478ba0c0140e740cb63ed23e4a659adc8985745b


// Kenji

2014年10月30日 12:23 kit.t <yossh...@gmail.com>:
> --
> このメールは Google グループのグループ「fuelphp.jp」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには fuelphp_jp+...@googlegroups.com
> にメールを送信してください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

Kenji Suzuki

unread,
Oct 30, 2014, 2:36:21 AM10/30/14
to fuelp...@googlegroups.com
Kenji です。


php.ini で browscap.ini を指定して、以下のように get_browser() だけを
実行してみましたが、

3.48677897453秒

かかりました。やはりデータが大きすぎて処理が重くなっているという
ことですね。

<?php

$start = microtime(true);

var_dump($_SERVER['HTTP_USER_AGENT']);
var_dump(get_browser());

$end = microtime(true);
$time = $end - $start;
var_dump($time);


// Kenji


2014年10月30日木曜日 13時02分07秒 UTC+9 Kenji Suzuki:
> このグループから退会し、グループからのメールの配信を停止するには fuelphp_jp+unsubscribe@googlegroups.com

Hisawo TAKASE

unread,
Oct 30, 2014, 3:45:03 AM10/30/14
to fuelp...@googlegroups.com
はじめまして、高瀬と申します。

ちょうど FuelPHP で構築中のシステムで、遅さとメモリ消費に悩んでいた
ところでしたので、原因が Agent クラスと判って助かりました。

私の方でも試したところ、下記のようになりました。

●browscap.ini をローカルに設置して php.ini で指定:

 →使用メモリは改善されたが、実行時間は変わらず

●ローカルの browscap.ini の中身を空 (冒頭の [GJK_Browscap_Version] と
 [DefaultProperties]、末尾の [*] だけ残して、その他を削除) にした:

 →Agent クラスを使用しない場合と同等の速度に改善された

というわけで、browscap.ini の中身を自分で編集して、自分にとって不要な
項目を削除することで速度も改善できそうです。

#と言っても、ざっと中を見たところ、消せそうなのは2〜3割程度ですが。
#ちなみに lite_php_browscap.ini を使用してます。



2014年10月30日 15:36 Kenji Suzuki <kenj...@gmail.com>:
このグループから退会し、グループからのメールの配信を停止するには fuelphp_jp+...@googlegroups.com にメールを送信してください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
タカセ

Kenji Suzuki

unread,
Oct 30, 2014, 8:39:30 AM10/30/14
to fuelp...@googlegroups.com
Kenji です。


確かに browscap.ini を小さくすれば速くなるでしょうね。

GitHub Issues に投稿していますが、Mac だと異様に遅くなるような感じです。
32bit Linux では Mac ほどは遅くなりませんでした。それでも遅いですが。

https://github.com/fuel/core/issues/1790


// Kenji


2014年10月30日木曜日 16時45分03秒 UTC+9 Hisawo TAKASE:
タカセ

Kenji Suzuki

unread,
Oct 30, 2014, 5:55:58 PM10/30/14
to fuelp...@googlegroups.com
Kenji です。


https://github.com/fuel/core/issues/1790#issuecomment-61173559
に書きましたが、

https://github.com/browscap/browscap-php

を使うようにするとメモリ消費は get_browser() を使うよりはかなり
増えますが、速度はかなり速くなりました。

Page rendered in 0.0513s using 6.456mb of memory.


// Kenji


2014年10月30日木曜日 21時39分30秒 UTC+9 Kenji Suzuki:

Kenji Suzuki

unread,
Oct 30, 2014, 8:29:39 PM10/30/14
to fuelp...@googlegroups.com
Kenji です。


ブログに現状をまとめました。

FuelPHPのAgentクラスが重い問題と暫定的な対処方法
http://blog.a-way-out.net/blog/2014/10/31/fuelphp-agent-class-heavy/


// Kenji

Kenji Suzuki

unread,
Nov 6, 2014, 5:32:14 AM11/6/14
to fuelp...@googlegroups.com
Kenji です。


On Fri, 31 Oct 2014 09:29:31 +0900
Kenji Suzuki <kenj...@gmail.com> wrote:

> ブログに現状をまとめました。
>
> FuelPHPのAgentクラスが重い問題と暫定的な対処方法
> http://blog.a-way-out.net/blog/2014/10/31/fuelphp-agent-class-heavy/

browscap-php よりも大幅に軽量高速な Crossjoin\Browscap というのがありました。

http://blog.a-way-out.net/blog/2014/11/06/php-user-agent-parser-benchmarking-update/

ご参考まで。


// Kenji

Kenji Suzuki

unread,
Nov 11, 2014, 6:07:49 AM11/11/14
to fuelp...@googlegroups.com
Kenji です。


Crossjoin\Browscap が browscap-php よりも大幅に高速だと投稿しましたが、
たまたま高速なケースのベンチマークに騙されてしまったようです。訂正いたします。

CentOS 6.5 & PHP 5.5 でのいろいろな UserAgent パーサをベンチマークしな
おした結果は以下です。ご参考まで。

https://github.com/kenjis/user-agent-parser-benchmarks#results

結論として、全体的な処理速度は browscap-php が速く、メモリ消費は Crossjoin\Browscap
がかなり低いというトレードオフな関係になっています。

ua-parser と woothee は高速軽量ですが、browscap を使うものではないので判定
結果がいろいろと違います。なので、そのまま置き換えるわけにはいきません。

なお、環境により結果は大きく変わる可能性がありますので、必要なら実環境あるいは
それに近い環境でベンチマークを取得してください。


// Kenji


On Thu, 6 Nov 2014 19:32:08 +0900

Kenji Suzuki

unread,
Feb 25, 2015, 12:51:42 AM2/25/15
to fuelp...@googlegroups.com
Kenji です。


以前、ベンチマーク結果を訂正し、

> 結論として、全体的な処理速度は browscap-php が速く、メモリ消費は Crossjoin\Browscap
> がかなり低いというトレードオフな関係になっています。

としましたが、今日さらにこれを訂正します。

https://github.com/kenjis/user-agent-parser-benchmarks#results

browscap-php と比較して、全体的な処理速度は、Crossjoin\Browscap が
少し速く、メモリ消費は Crossjoin\Browscap がかなり低いです。

ということで、性能的に Crossjoin\Browscap が優れていると言えます。


ベンチマーク結果が変わった原因は、以前は 1つのインスタンスで全部の
ユーザエージェント文字列を処理していましたが、1つのインスタンスで
1つのエージェント文字列を処理するように変更したためです。つまり、
判定回数分(100回)のオブジェクト生成のコストをベンチマークに含める
ように変更しました。

通常、エージェントの判定は、アクセスしてきたブラウザを判定するもの
で、1つのアクセスで 1つのエージェント文字列しか判定しません。

この結果、ベンチマーク結果が変わりました。

仮に、1つのオブジェクトで大量のエージェント文字列を判定するという
ログ解析のようなユースケースの場合は、以前の結果になるでしょう。


// Kenji


On Tue, 11 Nov 2014 20:07:42 +0900

Kenji Suzuki

unread,
Feb 25, 2015, 10:48:49 PM2/25/15
to fuelp...@googlegroups.com
Kenji です。


このAgentクラスが重い問題ですが、Crossjoin\Browscapを使う対処法
を記事にしました。

【改訂版】FuelPHPのAgentクラスが重い問題と暫定的な対処方法
http://blog.a-way-out.net/blog/2015/02/26/fuelphp-agent-class-heavy/


// Kenji

Reply all
Reply to author
Forward
0 new messages