counter.inc.phpで同時アクセスが増えると、0にリセットされる

  • ページ: BugTrack
  • 投稿者: baniko
  • 優先順位: 低
  • 状態: 完了
  • カテゴリー: プラグイン
  • 投稿日: 2003-01-16 (木) 11:46:45
  • バージョン:

メッセージ

数度発生したのですが、再現させるのが難しくて・・・。 ロックをかけてやればOKそうですが、どれくらい負荷が増えるかも調査しないといけなさそう。


  • 私のところでも度々カウンターがリセットされてます。更新の時ってけっこういろんな動作が入ってるからカウンターリセットはしょうがないのかなぁ。 -- kawara 2003-01-16 (木) 20:07:55
  • 1.4では、カウンタファイルを書き出すときに、とりあえずファイルをロック(flock(LOCK_EX))するようにしてみました。 -- ぱんだ 2003-03-19 (水) 12:58:04
  • 1.3.4 ですが、 MorphyWiki でカウンターリセットが度々起きているようです。ちょっと信頼性が確保できるとは言いかねる状態のようです。 MorphyWiki -- 2003-04-08 (火) 21:04:01
    • 1~2日に一回はどこかのページでカウンターが飛ぶ状況のようです(特にトップページが頻繁)、ちょっと 1.4 のソースを見て独自修正を試みるしかないのかなぁ…… MorphyWiki -- 2003-04-10 (木) 18:23:46
    • 一応、1.4 のソースを見て 1.3.4 でも同等にファイルロックするように書き換えてみました。 とりあえず MorphyWiki で有効性を実験してみることになります。 -- 2003-04-10 (木) 19:01:34
      • ちなみに、特に理由がなければトップページで1日おおよそ 2000 弱のカウンターが廻るようです(爆発時にどうなるかが見物)。 -- 2003-04-10 (木) 21:25:35
      • flock も万能ではないようです。ミラー先のトップページでまたしてもカウンターリセットが発生したようです。 (^^;; -- 2003-04-13 (日) 23:40:38
      • あっ、カウンターはページ冒頭のページタイトル直下に移しています。 -- 2003-04-13 (日) 23:55:23
  • カウンタがリセットされる状況をトレースしてみます。 -- ぱんだ 2003-04-13 (日) 23:55:08
    1. プロセス(A)がカウンタを書き戻そうとする。この瞬間、$fileの内容が空になる。
      PHP関数:fopen

      'w' - 書きこみのみでオープンします。ファイルポインタをファイルの 先頭に置き、ファイルサイズをゼロにします。ファイルが存在しない 場合には、作成を試みます。

      $nf = fopen($file, 'w');
      flock($nf,LOCK_EX);
    2. プロセス(B)がファイルを読み出す。fopenを使用していないのでロックは効かない。$arrayは空の配列となってしまう。
      $array = file($file);
    3. プロセス(A)がファイルを書き出して終了。
    4. プロセス(B)が、空のカウンタに1を足してファイルを書き出して終了。
  • 結局、ファイルの読み出しにもfopenを使用し、かつファイルを開いてから書き出して閉じるまでの間、一貫してロック状態を維持しないと、ファイルが別の状態で上書きされてしまう可能性があります。
  • 対処したバージョンをcvs:plugin/counter.inc.php(v1.4:r1.9)に上げました。1.3.xで使用するための説明をBugTrack/292に書いてあります。お試しください。
    • とりあえず参考にさせてもらいます。 MorphyWiki -- 2003-04-14 (月) 00:01:25
    • とりあえずミラーサイト では改良版に差し替えてみました。早速の対応ありがとうございました。 MorphyWiki -- 2003-04-14 (月) 00:14:54
    • MorphyWiki 1.3.4 では結局かなり試行錯誤をした挙げ句にやっと正常稼働するようになりました(正常稼働していなかったことに気がつかなかった (^^;; )。添付しておきます。 -- 2003-04-16 (水) 22:11:49
  • ただ、PHP関数:flockにもあるとおり、以下の状況に当てはまる場合はflockは役に立ちません。いまさらmkdirロックを実装するのも何なんで…困りましたね。 -- ぱんだ 2003-04-14 (月) 00:13:10

    警告 flock()はNFS及び他の多くのネットワークファイ ルシステムでは動作しません。詳細についてはオペレーティングシステ ムのドキュメントを確認下さい。 いくつかのオーペレーティングシステムでflock() はプロセスレベルで実装されています。ISAPIのようなマルチスレッド 型のサーバーAPIを使用している場合、同じサーバーインスタンスの並 列スレッドで実行されている他のPHPスクリプトに対してファイルを保 護する際に flock()を使用することはできません!

    • 一部のレンタル鯖ではflockの使用を禁止しているところもあるようです。そういう鯖ではmkdirなどで回避する必要があるでしょうね。 -- reimy 2003-04-14 (月) 00:29:33
  • 1.4.7をxreaで使用していますが頻繁にカウンタが飛びます どうにかならないでしょうか? -- 2007-02-01 (木) 18:36:44
    • このページを探していただいたのですね。ありがとうございます :) -- henoheno 2007-02-04 (日) 19:47:07
    • ・・・ fopen('w+') が原因だとしても、一旦ファイルが作成された後、どんなきっかけで 'w+' が呼ばれるかが一寸わかりませんけれども、とりあえず 'w+' の代わりに pkwk_touch_file() を使う形にしてみました。何かあれば教えて下さい :) -- henoheno 2007-02-04 (日) 20:25:48
    • cvs:plugin/counter.inc.php (r1.19) -- 2007-02-04 (日) 20:33:19
    • ありがとうございます。入れ替えたので暫く様子を見てみます。 -- 2007-02-04 (日) 22:54:18
    • 今のところ問題は発生していません。 -- &new([nodate]){date}: Invalid date string;
  • cvs:plugin/online.inc.php (r1.10)がうまく動作していないようです。 -- hirokasa 2007-02-10 (土) 14:16:47
    • コメントありがとうございます。official:雑談16でも同様のお知らせがありました。onlineについてはif文の中を逆に評価していました。 -- henoheno 2007-02-10 (土) 15:28:20
    • cvs:plugin/online.inc.php (r1.11)
  • counter, online の両方とも pkwk_touch_file() を使う様になりましたので、ディレクトリへの書き込み権限さえあれば、どちらのデータについても、アクセス権限設定のミスを自動的に修正する様になりました。 -- henoheno 2007-02-10 (土) 15:29:20

添付ファイル: filecounter(for.1.3.4).zip 873件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-03-02 (金) 03:14:38
Site admin: PukiWiki Development Team

PukiWiki 1.5.1+ © 2001-2016 PukiWiki Development Team. Powered by PHP 5.6.36-0+deb8u1. HTML convert time: 0.537 sec.

OSDN