MAINTENANCE
製造業のサイトで、問い合わせの一覧を書き出すと途中で止まっていた
数字で見ると
- 2万件超たまっていた問い合わせ
- 1,000件ずつ取り出して書き足す方式に変更
- 約1/4書き出し中のメモリ使用のピーク
- 0バイト旧方式との出力の差
行ったこと
- 再現本番と同じデータで再現
本番のデータを手元に複製し、同じ操作で止まることと、メモリの使われ方を確かめました。
- 作り替え少しずつ書き出す方式に
全件を一度に読み込むのをやめ、1,000件ずつ取り出して一時ファイルに書き足す形にしました。進み具合は画面に出ます。
- 照合出力が同じことを確認
旧方式と新方式の出力を比べ、1バイトも違わないことを確かめました。
- 反映テスト環境から本番へ
テスト環境で依頼者に確認いただいてから、バックアップを取り、本番に反映して読み戻しました。
対応の前と後
| BEFORE対応前 | AFTER対応後 | |
|---|---|---|
| 書き出し方 | 全件を一度に読み込む | 1,000件ずつ取り出す |
| メモリ使用のピーク | 約258MB | 約63MB |
| 進み具合 | 分からない | 画面に表示 |
| 止まる心配 | 件数が増えるほど高い | 件数が増えても変わらない |
こまかな作り込み
問い合わせの受付と管理8項目
- 問い合わせを専用の表に保存し、種別・対応の状態・メモを持たせる
- フォームは6種。入力の検査15種を、画面とサーバーの両方で
- 二重の送信と、期限切れへの対策
- 迷惑な送信の判定と、送信の直前の取り直し、再試行
- 種別ごとに、通知先と自動返信の文面を管理画面から編集
- 対応していない問い合わせを1時間ごとに点検し、担当へ催促のメール
- 一覧の絞り込み(種別、項目、年月、期間)、対応の状態3段階、対応のメモ
- 特定の利用者は、閲覧だけにできる
CSV の書き出し5項目
- 「いまの検索結果」と「全データ」の2通り
- 郵便番号や電話は、先頭の0が落ちない形で出す
- 全データは、1,000件ずつ書き足し、件数と割合を画面に表示
- 書き出しの途中に新しい問い合わせが入っても、重複しない
- 書き出しの保護(権限の確認、本人だけ、同時に1つ、公開されない場所に保存、1時間で失効、ダウンロード後に削除)
送信の記録と見張り5項目
- 成功・失敗・判定の結果を、日ごとに記録
- 記録は、大きくなったら分け、30日で削除
- 管理画面で、日付・成否・言葉で絞り込み
- 定期的に点検し、まとめを管理者へメール
- 営業時間・土日・祝日・会社の休日を考えて、通知の出し方を変える
バックアップ6項目
- 毎日、公開のファイル一式とデータベースを、当社のバックアップ専用の外部ストレージへ
- 送る前の検査(圧縮の検査、読めないファイルがあれば中止)
- 途中から再開できる送信と、サイズと内容の照合
- 世代の管理(ファイル7世代、データベース30世代)
- 成功も失敗も、毎回メールで通知
- 本番で動かす前の、壊さない事前テスト9項目
PHP の切り替えの前の検証6項目
- 全部の PHP ファイル(約1.4万)の構文を検査
- 本番のデータの写しで、起動・製品ページ・会員のログインを実際に操作
- 製品のデータ7ファイル(約1.5万行)を実際に取り込み、前後を比較
- メモリの実測にもとづいて、上限を見直し
- 設定の差を洗い出し、切り替えと切り戻しの手順を文書に
- 切り替えの前に、直した19ファイルを本番へ反映し、内容の一致を確認
進め方と記録4項目
- 手元→検証環境→依頼者の確認→本番、の順
- 毎回、バックアップの場所・変更の前後の照合用の値・戻し方・未実施の確認を記録
- 決まった日時に公開する予約(照合→配置→公開→読み戻し→完了のメール)
- 情報の漏れの有無の一次確認。結論は範囲を限って書き、記録のない期間を明記
この案件で続けていること
- サイト全体とデータベースを、毎日、当社のバックアップ専用の外部ストレージへ保存しています。サイトは7世代、データベースは30世代を残し、終わるたびにメールで通知します。
- 依頼は指示書で受け、テスト環境で確認いただいてから本番に反映します。作業ごとに、日付入りの記録を1件ずつ残しています。
