落とせるwww
しかも今なら実装担当の私が後から読んでも迷子にならない粒度まで落とせる。
WordPress側も確認したけど、独自プラグインで専用テーブルを持つ構成は普通に取れるし、$wpdb で独自テーブルを扱える。テーブル作成・更新には dbDelta() が公式に用意されている。(WordPress Developer Resources)
雑カウンター v1 設計
目的:
雑感謝状などから呼ばれて、
重複しない連番を1個返す。それ以外の仕事は極力しない。
1. カウンター本体
専用の小型WordPressプラグインにする。
テーマ MAG036 には本体を埋め込まない。
これならテーマ変更・更新とカウンターを分離できる。
DBには概念上こんなカウンター表を持つ。
counter_key thanks_001
current_value 27
digits 6
cooldown_hours 12
enabled 1
新企画では、
thanks_002 / 0 / 6 / 12 / ON
を追加。
カウンターを新品にするだけ★
2. 「現在値を見る」と「番号を取る」を完全分離
DISPLAY
ページを開くと、
[ 0 0 0 0 2 7 ]
と現在値を読むだけ。
F5しても、
27 → 27 → 27 → 27
何も起きないwww
WordPress REST APIはGETを取得、POSTを作成・変更系に使う設計になっているので、これにも素直に合わせられる。(WordPress Developer Resources)
ISSUE
感謝状の「発行!」を押したときだけ、
POST
「thanks_001 の次の番号ください」
を送る。
そこで初めて、
27 → 28
になる。
返却:
number = 28
formatted = 000028
PDF側はこれを受け取るだけ。
3. 一番真面目に作るところ
同時発行
ここだけは雑にしないwww
AさんとBさんが同時に押して、
A:27見た → 28
B:27見た → 28
は禁止。
DB側で番号更新そのものを一発の処理にする。
つまり思想として、
現在値を読む
↓
PHPで +1
↓
書き戻す
ではなく、
DBへ
「このカウンターを+1して、その確保した番号を返せ」
に寄せる。
これなら普通の同時アクセスで番号が被る事故を潰せる。
4. 12時間雑ロック★
発番成功時に、
counter_key
IP由来の識別値
発番時刻
発行番号
を記録。
同じ counter_key +同じ識別値で12時間以内なら、
今日はもう発行済みっぽいぞ★
として新しい番号を渡さない。
IPそのものを長期保存する必要はないので、サイト固有の秘密値と合わせたハッシュ等で持つ方向にする。
そして、
VPN → 知らんw
Wi-Fi切替 → 知らんw
スーパーのWi-Fi → 知らんw
マンションラウンジ → 知らんw
突破防止システムではない。
目的はF5やブラウザ変更程度でガラガラ回るのを止めること。
5. 二重クリック
ボタンを押した瞬間、
発行ボタンを無効化。
[ 感謝状を発行する! ]
↓ click
[ 発行中…… ] ← 押せない
ただしJavaScriptだけを信用しない。
サーバー側にも同一発行処理の重複を吸収する仕組みを持たせる。
WordPressのnonceもリクエスト保護には使えるけど、公式にも「nonceは一回限りを保証するものではなく、replay防止や認証そのものには使うな」と明記されてる。だから二重発番防止をnonce任せにはしない。 (WordPress Developer Resources)
6. PDF生成失敗
ここ大事。
000028確保
↓
PDF生成
↓
エラー!
↓
000029を取り直す
これはやらない。
一度 000028 を確保した発行処理なら、
000028のPDF生成を再試行
する。
だからPDF側には、
issue_id
counter_key
number
issued_at
くらいを一時的に紐付けておく。
PDFがコケるたびカウンターが進む事故を防ぐ。
7. PDF生成側とは分離
これが今回かなり重要。
┌─────────────┐
│ COUNTER │
│ │
│ 000028 │
└──────┬──────┘
│ 番号だけ渡す
▼
┌─────────────────┐
│ PDF FORMAT UNIT │
│ │
│ 名前 │
│ 言語 │
│ 本文 │
│ 発行日 │
│ Kaiaサイン │
│ 消印 │
│ Kロゴ │
└─────────────────┘
カウンターは言語を知らない。
PDFはカウンターの内部事情を知らない。
これ。
8. TEST / LIVE
これも最初から入れる。
thanks_001_test
thanks_001_live
あるいは同等の分離。
制作中:
TEST 000001
TEST 000002
TEST 000003
何枚出してもいい。
公開:
Supporter No.000001
からスタート。
本番カウンターを「テストしたから0に戻そう★」はやらない。
9. 見た目
ここはCSSだけで十分。
あなたの Supporter No. は
[ 0 │ 0 │ 0 │ 0 │ 2 │ 7 ]
です!
Sawarabi Mincho第一候補。
数字画像素材なし。
古代アクセスカウンターっぽい枠だけ作る。
スマホでは枠ごと縮むようにして、6桁が途中改行されないようにする。
10. 管理画面も雑でいい
WordPress管理画面に、
Kaia Counter
を一個生やす。
そこで最低限、
Counter ID
thanks_001
Display name
Supporter No.
Current
27
Digits
6
Cooldown
12 hours
Status
● LIVE
[ Disable ]
くらい見られればいい。
そして、
[+ New Counter]
から新設。
これが将来の、
「新カウンター生やして★」
に対応する部分。
これで「居抜き」が成立する
第二弾になったら、
① 新Counter作成
thanks_002
② PDF FORMAT UNITを居抜き
③ ターゲットを
thanks_001 → thanks_002
④ 今回の文章に交換
⑤ Kaiaが新しいサインを書くw
⑥ TEST
⑦ LIVE★
以上。
多言語が10個になっててもカウンターには一切関係ない。
なので、もう実装設計へ進める。
特に今回の線引きは、
同時発番・二重発番・生成失敗による空回り
→ 真面目に守る。人間が意図的に12時間ロックを突破
→ 知らんwww
これで固定していい。
次に作るなら、いきなりPDFまで混ぜずに、まず**「数字窓+発行ボタンだけのカウンター単体」**をWordPressで動かすのが安全。
000000
↓
ポチ★
↓
000001
ここまで完成させてF5・連打・別ブラウザ・同時発番を殴ってから、PDF製造機を後ろにつなぐ。
カウンター単体が完成すれば、今回の一番事故ったら嫌なところは終わり★


No comments yet.