Lin.Log|Studio
// 01 · weberp-platform-maintenance$ cat weberp-platform-maintenance.md

接手 4000 個 PHP 檔的那天

北部某傳統批發商貿企業2024.10 – 2025.12
Enterprise ERPPHP 8.xMicrosoft SQL ServerIIS 10 + FastCGIBootstrap 5TCPDFPhpSpreadsheet 1.25PHPMailer 6.6.3Composerserena MCPgit
接手 4000 個 PHP 檔的那天
// 02 · Client Background$ cat client_background.md

Client Background

北部某傳統批發商貿企業,使用 WebERP(經典字母分類架構 A-Z)維運核心業務多年。系統累積 4000+ PHP 檔,跨 26 個字母模組(A 訂單 / B 採購 / C 客戶 / D 出貨 ...)。前端 Bootstrap 3、後端 PHP 5/7 版本混雜、資料庫 MS SQL Server。

長期由內部 IT 維護,但規模超出 1 人能 cover 的程度,需要外部系統工程師介入。

// 03 · Challenges$ cat challenges.md

Challenges

  1. [01]

    接手 4000 個 PHP 檔,多版歷史文件散落在不同資料夾,版本混亂、無唯一真實源

  2. [02]

    沒測試覆蓋、沒 git history,變更影響範圍難以評估

  3. [03]

    Bootstrap 3 → 5 升級涉及全站樣式 / 元件 / breakpoint 系統

  4. [04]

    IIS + PHP FastCGI 環境特殊,部署細節跟主流 LAMP 教學不同

  5. [05]

    既有 cron / autoMailSend / webhook 不能停,維護期間業務不可中斷

  6. [06]

    多年累積的 SQL 注入風險(inline string concatenation),要逐步降級

  7. [07]

    hot fix 與 dead code 混雜,改 A 影響 B 是日常

  8. [08]

    客戶不接受 downtime,所有升級都得 hot-deploy

// 04 · Solution$ cat solutions.md

Solution

  1. [01]

    程式碼地圖

    用 grep + serena MCP(語意化 AST 工具)梳理 4000 檔的相互依賴,標出活躍區塊與死碼,做出可視化模組圖,新進工程師有對照參考

  2. [02]

    漸進式 Bootstrap 5 升級

    不做全站 big-bang 重構,改用 module-by-module 滾動升級;WEBERP_Bootstrap5/ 子目錄做 sandbox,逐個頁面遷移後再切換

  3. [03]

    IIS + PHP FastCGI 調校

    handler mapping 對應 *.php → C:php8php-cgi.exe,php.ini 套件啟用、FastCGI Settings 調整 PHP_FCGI_MAX_REQUESTS,從零文件到可重複部署的 web.config 模板

  4. [04]

    cron 重構

    把散落的 PHP CLI 排程腳本(autoMailSend / DC 出貨 / Excel→PDF 自動轉換)整合到單一排程器,排程設定後台化,失敗有 log

  5. [05]

    安全性回填

    prepared statement 改寫舊 inline SQL、所有表單加 CSRF token、Session 強制超時、敏感頁面權限重新審視

  6. [06]

    部署管線

    引入 git(原本沒)、staging 與 production 環境分離、release note 制度,客戶可自助發版

// 05 · Results$ cat outcomes.md

Results

  • 4000

    4000 檔程式碼地圖 + 模組依賴圖完成,新進工程師有對照可循

  • [02]

    Bootstrap 3 → 5 漸進升級全站完成,過程零停機

  • [03]

    cron / autoMailSend / DC / Excel→PDF 整合到單一排程,失敗自動重發 + log

  • [04]

    SQL 注入風險全面降級,prepared statement 覆蓋核心表單頁

  • [05]

    客戶可在 staging 自驗收後一鍵 push 到 production,不需聯絡工程師

// 06 · Use Cases$ cat scenarios.md

Use Cases

  • 工程師

    接手第 1 週,從「README 0 行」到「模組依賴圖」

    打開 4000 個 PHP 檔毫無頭緒。先用 grep 統計 include / require 關係,再用 serena MCP 做語意化掃描,標出每支檔被誰呼叫、呼叫誰。第 5 天得到第一版模組依賴圖,第 7 天標出 30+ 支死碼可清。從此每次改檔不再像打地鼠。

  • 客戶

    從「排工程師 2 週」到「dev → staging → production 1 天」

    過去客戶想加一個欄位、改一張報表,得排隊等工程師。現在他們在 dev 環境自己改、staging 試 SIT、確認沒問題就 push 到 production。整段流程從 2 週縮到 1 天內,工程師只在卡關時介入。

// 07 · Data Model$ cat data_model.md

Data Model

weberp-platform-maintenance/data_model.sql

COPMA // 客戶主檔 — 客戶基本資料、聯絡方式、信用額度、業務歸屬

ORD // 訂單 — 訂單抬頭、訂購日期、客戶、業務、狀態(草稿 / 確認 / 出貨 / 結案)

PO // 採購單 — 對供應商的採購,跟 ORD 一對一或多對一

DC // 出貨單 — 出貨抬頭與明細,從 ORD 衍生,跟 ERP 庫存連動

SUPP // 供應商主檔 — 供應商基本資料、付款條件、評等

linlog@studio $ exit

Got something you want to build together?

[Contact me]
email dannylaii@linlogstudio.com
hours Mon – Fri · After 7PM
base Taiwan · Remote-first
Connection to lin.log closed. © 2026 Lin.Log|Studio