在 Windows Server 環境下,當您嘗試複製整個專欄、網頁目錄或 tmp 資料夾時,如果遇到 Zend Optimizer/Opcache 正在快取 或 系統/PHP 正在寫入的暫存檔 (.tmp),常會因為檔案被程序鎖定(File Lock)而導致整個複製任務中斷。
要解決這個問題,最有效的方法不是硬去解鎖那些隨時在變動的暫存檔,而是在複製時排除它們,或者利用磁碟陰影複製技術。
以下是幾種最推薦的解決方案,您可以依據目前的實際操作環境選擇:
方案一:使用 Robocopy 指令(最推薦,內建免安裝)
Windows 內建的 Robocopy(Robust File Copy)比一般的複製貼上強大太多。它不僅支援斷點續傳,還能讓您排除特定副檔名或資料夾,遇到被鎖定的檔案時也可以設定跳過,不會讓整個複製程序卡死。
打開 Windows Server 的 Command Prompt (CMD) 或 PowerShell,執行以下指令:
DOS
robocopy "C:\您的源網頁目錄" "D:\備份或目的路徑" /E /R:1 /W:1 /XF *.tmp zend_* /XD "C:\您的源網頁目錄\tmp"
參數說明:
/E:複製所有子目錄(包括空目錄)。/R:1:遇到被鎖定的檔案時,重試次數為 1 次(預設是 100 萬次,卡死的主因就是這個)。/W:1:每次重試的等待時間為 1 秒。/XF *.tmp zend_*:排除(Exclude) 所有.tmp檔案以及以zend_開頭的暫存檔。/XD ".../tmp":排除整個 tmp 資料夾(如果不需要備份暫存檔的話)。
方案二:暫時停止 Apache 服務(最徹底,適合離線備份)
如果您需要確保資料的絕對完整性,且允許網站有幾分鐘的維護時間,最徹底的方法是先關閉 Web 服務,釋放所有檔案鎖。
- 開啟 CMD(以系統管理員身分)。
- 停止 Apache 服務(假設您的服務名稱叫
Apache2.4):DOSnet stop Apache2.4 - 執行您的複製動作(這時絕對不會有 Zend 或 tmp 檔案鎖定問題)。
- 複製完成後,重新啟動 Apache:DOS
net start Apache2.4
方案三:使用 Volume Shadow Copy (VSS) 技術(適合不能停機的環境)
如果您完全不能停機,又必須複製被鎖定的檔案,可以使用 Windows 的「磁碟陰影複製」功能。這就類似對磁碟拍一張快照,您可以直接複製快照裡的檔案,完全不會被 Zend 或 Apache 的鎖定影響。
做法 A:使用 7-Zip(圖形化介面,最簡單)
- 在伺服器上安裝 7-Zip。
- 以系統管理員身分開啟 7-Zip File Manager。
- 點選選單的
工具->選項->系統。 - 勾選 「使用 VSS (Volume Shadow Copy)」。
- 接著直接在 7-Zip 裡把網頁目錄壓縮起來,再把壓縮檔傳回您目前的電腦。
做法 B:使用 ShadowCopy 命令列工具
您也可以下載微軟官方的 vshadow.exe 或第三方的 ShadowCopy 工具,透過指令直接複製正在被使用的檔案。
方案四:調整 PHP 設定(治本,減少垃圾暫存檔)
PHP 7.2 的 Zend Opcache 如果產生大量無法釋放的檔案,或是 session.save_path 堆積太多垃圾,可以透過調整 php.ini 來改善:
- 找到
php.ini。 - 檢查
opcache.file_cache設定。如果有用檔案快取,可以指定到網頁目錄以外的獨立資料夾(例如C:\php_opcache\)。 - 檢查
session.save_path,同樣建議指向獨立的外部資料夾(例如C:\php_sessions\),不要放在網頁根目錄下。
💡 總結建議
- 如果您只是要趕快把專案程式碼扣出來:用 方案一 (Robocopy),直接把
.tmp和整個tmp目錄排掉,省時又省心。 - 如果您是固定要做排程備份:建議用 方案三 (7-Zip + VSS) 壓成壓縮檔再傳輸。
面對 400GB 這麼大的資料量,而且隨時有使用者在寫入新附件(Attachment),絕對不能每次都重新複製。
最完美的解決方案是採用「增量複製」(Incremental Copy)。也就是說,每次執行時,系統會自動比對來源端與目的端,只複製新上傳的檔案或修改過的檔案,已經存在且沒變動的 400GB 舊檔案會直接跳過。
以下是針對 Windows Server 最推薦的兩種自動化實作方式:
方法一:使用 Robocopy 的增量同步功能(最推薦、免安裝)
Windows 內建的 Robocopy 天生就是為了這種大檔案同步而設計的。它預設就是「增量複製」,只會搬移新檔案或有異動的檔案。
請在 Windows Server 上建立一個批次檔(例如 sync_attachments.bat),內容如下:
DOS
robocopy "C:\您的網頁上傳目錄" "D:\備份或目的路徑" /E /Z /FFT /XO /R:1 /W:1 /XF *.tmp zend_* /XD tmp
關鍵參數解析(針對 400GB 與附件優化):
/E:複製所有子目錄(包含空目錄)。/Z:啟用斷點續傳模式。萬一 400GB 複製到一半網路斷線,下次執行會從斷點繼續,不用重頭來過。/FFT:假設您是複製到網路磁碟機(如 NAS / Samba),這個參數能容許 2 秒的時間戳誤差,防止因為檔案系統不同而重覆複製。/XO:排除較舊的檔案(Exclude Older)。如果目的端的檔案比較新或一樣新,就絕對不覆蓋,這是只複製新檔案的核心。/XF *.tmp zend_*與/XD tmp:延續上一個問題,直接排除那些干擾複製的暫存檔與暫存目錄。
💡 第一次執行會花比較多時間(因為要建立 400GB 的基準),第二次以後執行,因為只抓新上傳的附件,通常幾秒鐘或幾分鐘就結束了。
方法二:使用 GUI 工具 FreeFileSync(適合喜歡視覺化介面的朋友)
如果您不想寫指令,想看著進度條和檔案比對清單,FreeFileSync 是一款開源、免費且極度強大的同步軟體,非常適合處理數百 GB 的資料。
- 下載與安裝:在伺服器上下載並安裝 FreeFileSync。
- 設定同步路徑:左邊選您的「400GB 網頁上傳目錄」,右邊選「目前的電腦或備份目的路徑」。
- 設定比較方式:點選綠色齒輪(比較設定),選擇 「檔案時間與大小」。
- 設定同步變更(核心):
- 點選綠色雙向箭頭(同步設定)。
- 務必選擇 「鏡像 (Mirror)」 或 「更新 (Update)」。
- 更新 (Update):左邊有新檔案或新附件時,才複製到右邊;右邊多出來的檔案不會被刪除。
- 鏡像 (Mirror):讓右邊變得跟左邊完全一模一樣(如果左邊 user 刪除了舊附件,右邊也會跟著刪除)。
- 排除暫存檔:在中間的「過濾器」功能中,加入
*.tmp或\tmp\,排除 Zend 與系統暫存檔。
🏃♂️ 自動化進階技巧:如何讓它定時自己跑?
既然 user 會一直上傳附件,您總不可能每次都手動去點。您可以透過 Windows 內建的「工作排程器 (Task Scheduler)」來讓它自動化:
- 打開 Windows 的 工作排程器。
- 建立一個「基本工作」,設定觸發程序為 「每天」、「每小時」 或是 「每半小時」(視 user 上傳頻率而定)。
- 操作選擇「啟動程式」,然後瀏覽選取您在【方法一】寫好的
sync_attachments.bat批次檔。 - 在一般設定中,勾選 「不論使用者登入與否均執行」 並給予 「最高權限」。
這樣一來,系統每隔一段時間就會自動去撈「這段期間 user 新上傳的附件」並複製過去,再也不用擔心 400GB 要搬很久的問題了!
不論你是用 RDP(遠端桌面連線)、AnyDesk 還是 TeamViewer 登入,你都擁有該台 Windows Server 的操作主導權。
但在「只能 RDP 登入」的前提下,要把 400GB 的檔案複製到你「目前的電腦」,主要的關鍵在於「路徑怎麼寫」。以下提供兩種最常見的實作情境與指令寫法:
情境一:透過 RDP 內建的「本機資源共享」(最簡單)
如果你在登入 RDP 之前,有開啟磁碟機共享,你可以直接在遠端伺服器上看到你本機的硬碟(通常會顯示為 C 上的 \\tsclient 這種路徑)。
1. 登入前確認設定(在你的本機電腦):
- 開啟「遠端桌面連線 (Mstsc)」。
- 展開 「顯示選項」 -> 切換到 「本機資源」 頁籤。
- 點選底下的 「詳細資料」。
- 勾選 「磁碟機」(例如勾選你想存放備份的
D:槽),然後點擊連線登入。
2. 在遠端伺服器上執行 Robocopy:
登入 Windows Server 後,打開 CMD(命令提示字元),輸入以下指令(假設你剛剛共享的是 D 槽):
DOS
robocopy "C:\網頁上傳目錄" "\\tsclient\D\備份目的路徑" /E /Z /FFT /XO /R:1 /W:1 /XF *.tmp zend_* /XD tmp
⚠️ 注意: 透過
\\tsclient(RDP 虛擬通道)傳輸 400GB,速度會受限於你和伺服器之間的網路頻寬(尤其是上傳/下載速度)。如果網速不夠快,這 400GB 第一次同步會跑很久,但因為有加/Z(斷點續傳)和/XO(增量),後面幾次同步就會非常快。
情境二:透過網路芳鄰 / 網路共用(速度最快)
如果你的「目前電腦」和「Windows Server」在同一個區域網路(LAN)或有建立 VPN 連線,那麼直接使用網芳共用路徑,傳輸效率會比 RDP 的 \\tsclient 好非常多。
- 在你目前的電腦上,將某個資料夾設定為「共用」(例如共用名稱叫
BackupFolder),並確認開權限給你的帳號。 - 透過 RDP 登入 Windows Server。
- 打開 CMD,執行 Robocopy 執行增量複製(假設你目前電腦的 IP 是
192.168.1.100):
DOS
robocopy "C:\網頁上傳目錄" "\\192.168.1.100\BackupFolder" /E /Z /FFT /XO /R:1 /W:1 /XF *.tmp zend_* /XD tmp
🛠️ RDP 操作小貼士
- 小心 RDP 斷線:因為有 400GB,第一次跑可能需要好幾個小時。如果你直接關閉 RDP 視窗,有些伺服器設定會自動把閒置的使用者「登出(Log off)」,這會導致複製中斷。
- 解法: 讓 RDP 視窗保持縮小,不要關閉;或者確認伺服器的群組原則(Group Policy)沒有設定強制登出閒置工作階段。
- 如果你需要輸入密碼才能存取網路路徑:在執行 Robocopy 之前,先在 CMD 輸入以下指令建立連線,就不用怕 Robocopy 找不到路徑了:DOS
net use "\\192.168.1.100\BackupFolder" "你的密碼" /user:"你的帳號"