ppBlog Warning: LINE 953 of utils.php: A non-numeric value encountered:

ppBlog Warning: LINE 1008 of utils.php: A non-numeric value encountered:

ppBlog Warning: LINE 1034 of utils.php: A non-numeric value encountered:

ppBlog official

ppBlog1.8.3リリース

category-icon

 こんばんは。七夕の日なのでppBlog1.8.3をリリースしようと思います。

 v1.8.2からの主な変更点を以下に挙げておきます。

  1. MT(MovableType)形式のインポート/エキスポートを強化。タグの取り込みにも対応しました。MTは使ったことがないので、ユーザーの方からのフィードバックが大変役に立ちました。
  2. アクセス解析で、カウント除外できるキーワードを管理画面から設定できるようにした。後、カウントログ取得のチューニング。
  3. 設定により、読み手がボックス記事の表示数を指定出来るようにした。
  4. js/lib.jsを少しいじった。コメントスクロールの部分。
  5. mob.phpのデバグ消し忘れの修正。

ってとこです。添付の差分ファイルには、万年カレンダー用のholiday.class.phpが含まれていますが、これはハッピーマンデーがずれてるユーザー用です。第3月曜日であるところが第2月曜(今月の海の日とか秋分の日とか)になっていたり。ぶっちゃけ、サーバーによってずれたりずれなかったりして、今イチ原因が掴めていないんですが(--) 正常に表示されているppBlog使いの方は、上書きする必要はないです。

 アクセス解析のstat/log.phpに関して、キーワードなどの設定をした状態で「生ログ」を見ると、トータルのカウントの値が飛び飛びになるかもしれませんが、これは仕様です。IPやキーワードによって除外カウントが発生すると、こういう記録になります。トップページに表示されるトータルカウント数とリンクさせてるためですが、これが気になるという方は、log.phpの112行目の

if(/*$ip_accept && */$accept){

のコメントアウトを削除して、

if($ip_accept && $accept){

とすれば、連続カウントになるかと思います。

 3番目の「読み手がボックス記事の表示数を指定出来るようにした」ですが、設定は、各テーマにあるtemplate.phpで指定します。

define('ENABLE_USER_SELECT', 0);  // ボックス記事の表示数を読み手が指定できるかどうか。許可しないなら 0 を指定(上の設定有効時)
 この指定は、この上にある指定(必須ではないですが)のENABLE_INVERSE_SORTが有効でないと、設定が反映されないという点に注意して下さい。いずれの指定も必須ではないので、この記述はないならないで構いません。

 例によって、差分ファイルです。単なる上書きで良いです。

添付ファイル: DIFF182183.zipattachedIcon 

— posted by martin at 06:45 am   commentComment [6]  pingTrackBack [0]

アクセス解析で除外キーワード

category-icon

 こんばんは。おとといに引き続き、アクセス解析関連ネタ。

 現状、ppBlogでは、登録したIPアドレスによって、アクセスログに記録するかどうかを判断する機能をつけていますが、IPアドレスを逐一登録していくのは、そう楽ちんな作業ではありません。なので、stat/log.phpの方で、

if(strpos($ua, 'bot') || strpos($ua, 'Bot')) $ip_accept = FALSE;

みたいな記述をして、アクセスログへの記録を避けることができますよ、というのをいつか記事にしました。でも、ユーザーの方に直接 log.php をいじってね、というのも不親切だなぁと感じていたんで、管理画面の方で、統計除外したい任意のキーワードを指定できるようにしました。

 検索エンジンのクローラーなどは、来てくれるのはありがたいのですが、それらをすべてアクセスログに記録していたら、ログの肥大化に繋がります。なので、これを避けよう、というのが基本にあります。この手のクローラーは、分かりやすいユーザーエージェント名を名乗ってくれることが多いです。例えば、グーグルなら、
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Yahoo!なら、
Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)
MSNなら、
msnbot/1.1 (+http://search.msn.com/msnbot.htm)
という具合です。なので、これらの文字列に含まれる単語を指定しておくことで、アクセスログへの記録を回避できます。例えば、botというキーワードを登録しておけば、それだけで、この文字列を含んでいるGoogleとMSNのクローラーの足跡を断つことができます。

 管理画面でのスクリーンショットを載せときますね。

shot1
このメニューから入ります。
shot2
ホスト名に含まれる文字列も指定可能です。

 尚、登録したキーワードは、IPアドレス除外と同じ設定ファイルnotcount.ini.phpに記録するようにしたので、特にこの処理を入れたことによるスピード低下はほとんどないと思います。

— posted by martin at 04:34 am   commentComment [0]  pingTrackBack [0]

表示記事数を読み手が設定

category-icon

 おはようございます、martinです。現状、管理画面で設定出来る、記事ボックス表示モード時の記事数ですが、ユーザーの方からのご提案で、これを読み手が自由に設定できたら良いなぁ、とありました。

 なのでやってみました。

shot
読み手が自由に表示数を指定できる。

 仕様上、表示数はいくらでも指定出来ますが、100件づつ表示とかしたら表示にえらく時間がかかってしまったので(当然ですが)、とりあえず30件を上限としています。ボックス表示で30件もあれば十分かなとは思いますので。

 v1.7/1.8系の方は、以下の添付ファイルで試すことができます。いつでも戻せるように、元のutils.phpのバックアップは取っておいて下さい。

添付ファイル: utils.phpattachedIcon 

— posted by martin at 01:14 pm   commentComment [0]  pingTrackBack [0]

 

gethostbyaddrのキャッシュ化

category-icon

 こんばんは、martinです。前回に引き続いて、高速化のお話。

 ppBlogは、それなりに高機能だと思っているアクセス解析機能が初めから付いていますが、ログ取得のためにアクセス時のIPアドレスから、PHPのgethostbyaddr()Link 関数を使ってホスト名を取得できれば取得するようにしています。gethostbyaddr()関数はDNSサーバに問い合わせてIPアドレスに対応するホスト名を調べる、いわゆる逆引きを行ってくれます。なので、ともすると、この段階がページ表示スピードのボトルネックになる可能性があります。

 なので、IPアドレスに対応するホスト名のキャッシュ化を考えてみました。情報をどこに保持するかですが、ひとつのIPアドレスに対して、ひとつの対応するホスト名さえ分かればOKなので、ここはクッキーに情報を保持するのが良さそうです。その際に、「生」の値を保持するのは、何となく気持ち悪いので暗号化してクッキーに保持するようにします。

 アクセス解析のための情報取得は、stat/log.phpが担当してるのですが、ここ1-2日間、log.phpを結構書き換えています。IPアドレス/ホスト名のクッキー化に関する記述は、今のところ以下のような感じです。

/*
 * gethostbyaddrのキャッシュ化による高速化。クッキーによる実装。
 * 暗号化されたホスト情報がクッキーに入ってるなら、それを取得。そうでなければ逆引きをする。
*/
if(isset($_COOKIE['PPBLOG_DNS']) && strpos(($DNS = ' '.my_decrypt($_COOKIE['PPBLOG_DNS'])), $ip)){
  list($host,) = explode("¥t", ltrim($DNS), 2); // ホスト名の取得。gethostbyaddr()関数よりずっと高速。
}

if(!isset($host)){ // クッキーに記録されていなければ、そこで初めてgethostbyaddr()関数を使う
 $host = ($host = gethostbyaddr($ip)) ? $host : $ip;
 if($host != '') setcookie('PPBLOG_DNS', my_encrypt("$host¥t$ip"), time() + 30*24*3600);
}

 gethostbyaddr()関数と比べて、どれくらい速いか計測したところ、少なくとも40倍以上高速になりました。この実装で問題がないようであれば、次期バージョンアップ時に採用したいと思っていますが、試してみたいという方のために添付しておきます。単なる上書きで良いです。その際、元のlog.phpのバックアップは取っておいて下さい。

添付ファイル: log.phpattachedIcon 

— posted by martin at 04:18 am   commentComment [8]  pingTrackBack [0]

array_shiftとreset

category-icon

 こんばんは、martinです。ppBlogでは、「軽快な動作」を常に念頭において開発しています。PHPには、実に様々な関数が最初から提供されていて、似たような振る舞いをする関数も結構あります。なので、こういう場合は、それぞれの関数で処理時間を計測して、より処理速度が速いほうを採用するようにしていますが、最近、そんなやつをひとつ見つけました。

 ppBlogでは、内部でいろんな配列が定義されていて、それを切ったり貼ったりして使用してます。その際に、配列の先頭の要素を取り出すという処理を至る所でしているのですが、これまではarray_shiftを用いていました(というかそれしか知らなかった)。

 

array_shift() は、array の最初の値を取り出して返します。配列 array は、要素一つ分だけ短くなり、全ての要素は前にずれます。 数値添字の配列のキーはゼロから順に新たに振りなおされますが、 リテラルのキーはそのままになります

引用元: PHP: array_shift - ManualLink
 上の赤字にあるように、元の配列を変えてしまうという点に留意していれば、便利な関数です。で、最近別の似た振る舞いをする関数を見つけました。reset()関数です。

reset() は、array の内部ポインタの先頭の要素に戻し、配列の最初の要素の値を返します

引用元: PHP: reset - ManualLink

 何となく、内部ポインタを先頭に移すんだなという印象でファイルオープンfopen()などを使う場面ぐらいでしか使わないと思っていたのですが、その要素も返すんですね。

<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_shift($stack); // 結果はorange
 // $stackはarray("banana", "apple", "raspberry")になる
?>
<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = reset($stack); // 結果はorange、$stackは元のまま
?>

 さてどちらが処理速度が速いかというと、ローカルな環境(PHP5.2.9)では、実はそんなに変わりません。100万回の試行で、前者が3.4秒のところが後者のreset()関数だと3.2秒と、ちょっとだけ速いかなという感じです。でもタイピングも少なくて済むし、こういうのの積み重ねが大事なので、今後はreset()を使うようにしようと思います。余談ですが、ラズベリー(raspberry)の綴りはちょっと意外でした。

 ここでひとつ押さえておくべきことは、上の$stackの例のように、もし配列のキーが定義されていない、つまりキーインデックスがゼロから始まるような配列ならば、わざわざ関数を持ち出さなくても、
<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = $stack[0]; // 結果はorange、$stackは元のまま
?>
でこと足りるということです(これだと100万回の試行では2.4秒と最速)。これで済む場合はそうしますが、ppBlogの内部では、
Array
(
     [3] => orange
    [11] => banana
    [23] => apple
    [29] => raspberry
)
みたいに、キーの添え字にも意味がある処理が多いです。

 

— posted by martin at 06:36 pm   commentComment [0]  pingTrackBack [0]

Created in 0.0094 sec.
prev
2009.7
next
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31