PHP5.1.1で昨日のカウンターが表示できない †
- ページ: BugTrack2
- 投稿者: たくま?
- 優先順位: 緊急
- 状態: 提案
- カテゴリー: 本体バグ
- 投稿日: 2005-12-16 (金) 00:14:52
- バージョン: 1.4.6
メッセージ †
PHP5.0.5からPHP5.1.1にアップデートしたところ,昨日の訪問者数が常に"0"になってしまいます.counter.inc.phpにもstrtotimeが使われているようなので,BugTrack2/120と関係があるかもしれません.
- わたしのところでも同様の現象が見られるのですが、
- 正しく表示されるWikiペイジもある(0になるペイジの方が多い)
- *.countファイルに8bit文字は記述されてない
というわけで別原因ではないかと思いつつ調べは進んでいません。 -- よっちい
- PHPを5.1.2にしましたが,相変わらず同じ現象が発生しております. -- たくま?
- 私も先日サイトを移転したのですが、移転先が5.1.2でして同じ現象になりました。それでちょっとテストをしてみました。 -- かまかま?
以下の表示をするテストプログラムを作って日付変更の前後に実行してみました。(1)と(2)は、counter.inc.php で日付の比較に使われているものです。赤背景は間違ってる部分。
(1) echo get_date('Y/m/d');
(2) echo get_date('Y/m/d', strtotime('yesterday', UTIME));
(3) echo get_date('Y/m/d', strtotime('yesterday'));
| | (1) | (2) | (3) |
| 3/1 01:20 ごろ | PHP 5.0.4 | 2006/03/01 | 2006/02/28 | 2006/02/28 |
| 〃 | PHP 5.1.2 | 2006/03/01 | 2006/02/27 | 2006/02/28 |
| 3/1 22:00 ごろ | PHP 5.0.4 | 2006/03/01 | 2006/02/28 | 2006/03/01 |
| 〃 | PHP 5.1.2 | 2006/03/01 | 2006/02/28 | 2006/02/28 |
| 3/2 00:03 ごろ | PHP 5.0.4 | 2006/03/02 | 2006/03/01 | 2006/03/01 |
| 〃 | PHP 5.1.2 | 2006/03/02 | 2006/02/28 | 2006/03/01 |
そこで対処療法ですが、counter.inc.php の 111行の
$is_yesterday = ($counters[$page]['date'] == get_date('Y/m/d', strtotime('yesterday', UTIME)));
から UTIME を抜いてみました。いまのところ良い模様です。
- strtotime()がint nowで与えた値をGMTでなくJSTと考えてしまって +9h 補正をしないために、はじめから9時間引いたUTIMEを与えて"yesterday"を計算させると「9時間前の時間(昨日)の昨日の時間」を出してしまっているように見えます。 -- かまかま?
- Vine Linux2.6 PHP5.1.2とPukiWiki 1.4.6で運用していますがyesterdayが常に0になるこの症状が出ました。
いまUTIMEの記述を削除して様子を見てます。 -- kamei?
- もしかしてBugTrack2/76が関連するのかな・・・ -- teanan
- UTIMEの記述を削除したところ無事正常動作するようになりました。ありがとうございました。 -- kamei?
- UTIMEの記述を削除したところ正常に動作するようになりました.ありがとうございました. -- たくま?
- 「UTIMEの記述を削除」ってcounter.inc.php の 111行を(1)or(3)のどちらにすることなんでしょうか? --
- 単純に get_date('Y/m/d', UTIME-24*60*60) の方がいいのではないでしょうか。 -- you?
- PukiWiki1.4.6からPukiWiki1.4.7+PHP5.1.6にしたところ、同じ症状になりました。(3)の記述で対応してみます。 --
- pukiwiki1.4.7PHP5.2.5で同症状確認。UTIMEを削除したら改善しました。 -- nobu?
- PukiWiki1.4.7+PHP4.4.7からPukiWiki1.4.7+PHP5.2.5に更新した際に同症状確認。UTIMEを削除したら改善しました。 -- You&I?
- UTIME を使うのなら、
$is_yesterday = ($counters[$page]['date'] == get_date('Y/m/d', strtotime('yesterday', UTIME + LOCALZONE)));
とか?(実質、上の(3)と同じ)
でも、get_date() でLOCALZONE の補正をすることを考えると、
$is_yesterday = ($counters[$page]['date'] == get_date('Y/m/d', strtotime('yesterday', UTIME + LOCALZONE)) - LOCALZONE);
でないと困る・・・、ってこれじゃあ結局you さんが書いている
$is_yesterday = ($counters[$page]['date'] == get_date('Y/m/d', UTIME - 24*60*60);
とほぼ同じ意味になってるし。 --
- この場合、UTIMEを削除するというのは巧いやり方ではないでしょう。例えば init.php でUTIMEが設定された時間から“秒”をまたいでしまうとPukiWikiの1度の実行中に全体で同じ時間を使う前提が崩れる事になります。どうしても UTIME と strtotime を使うのであれば、
get_date('Y/m/d', strtotime('yesterday', UTIME + LOCALZONE) - LOCALZONE)
とするのが適切だと思います。しかし私の個人的な考えとしては、折角数値として時間を持っているのにそれに対して文字列を与える事によって補正をかけること自体が巧いやり方とは思えません。可読性のためであればコメントを書くべきです。最良の策は
get_date('Y/m/d', UTIME - 86400)
かと思います。 -- 0th track
- パッチ作りました
diff --git a/counter.inc.php b/counter.inc.php
index ed5dcbd..ee20c9d 100644
--- a/counter.inc.php
+++ b/counter.inc.php
@@ -83,7 +83,7 @@ function plugin_counter_get_count($page)
if ($counters[$page]['date'] != $default['date']) {
// New day
$modify = TRUE;
- $is_yesterday = ($counters[$page]['date'] == get_date('Y/m/d', strtotime('yesterday', UTIME)));
+ $is_yesterday = ($counters[$page]['date'] == get_date('Y/m/d', UTIME - 24*60*60));
$counters[$page]['ip'] = $_SERVER['REMOTE_ADDR'];
$counters[$page]['date'] = $default['date'];
$counters[$page]['yesterday'] = $is_yesterday ? $counters[$page]['today'] : 0;
pukiwiki1.4.7 用 -- TOBY?