我的環境是:Windows,MsSQL和PHP 5.4。PHP rename()不能總是在Windows環境中找到源文件(代碼2)
我的場景: 我正在做一個小的shell腳本,它可以從我想要的數據庫創建一個完整備份到一個臨時文件夾,然後將它移動到一個新位置。
備份正常,文件創建到我的臨時文件夾。然後我將它重命名爲第二個文件夾,有時它會正常,有時它找不到源文件。
當然在這一點上,我知道我可以跳過所有的臨時位置,但沒有找到該文件的實際問題困擾我。爲什麼它是如此隨機,並且可能會影響我在此之前編寫的其他文件功能......另外,我需要能夠控制文件如何以及何時移動到目的地。
的基本代碼很簡單,因爲它應該是(雖然這是我的實際代碼的簡化版本,因爲我懷疑任何人有興趣在我的錯誤處理/記錄條件):
$query = "use test; backup database test to disk '//server01/temp/backups/file.bak', COMPRESSION;";
if($SQLClass->query($query)) {
$source="////server01//temp//backups//file.bak";
$destination="////server02//storage//backups//file.bak";
if(!rename($source , $destination)) {
//handleError is just a class function of mine that logs and outputs errors.
$this->handleError("Moving {$source} to {$destination} failed.");
}
}
else {
die('backup failed');
}
我已嘗試的是:
- 我在它之前添加了一個file_exists,它無法找到源文件,當重命名不能。
- 由於文件無法找到,在SQL備份副本後()和unlink()將不工作,要麼
- 嘗試clearstatcache()函數
- 嘗試睡眠(10)完成
無這些根本沒有幫助。我和谷歌似乎沒有想法做什麼或嘗試下一步。當然,我可以使用一些shell_execing,但這並不能消除我對早期產品的擔憂。
我只在連續多次運行命令時才注意到這個問題。有沒有某種clearstatcache()不會觸及的文件名緩存?它似乎與某種幽靈文件現象有關,其中php遲到刷新文件系統內容等。
我會感激任何想法接下來要嘗試什麼,如果你讀到這遠,謝謝你:)。
您是否檢查過fil的權限e在你當前用戶的服務器中? – Javad
您是否曾嘗試將重命名調用放在一個可以睡眠一段時間的循環中,並在調用'handleError'之前重試3-5次?有時這有助於偶爾超時的文件操作。 – Dan
是的,我有和權利是好的。這也是我早期的想法,但結果是該文件有時無法找到。我沒有嘗試循環它,但我確實嘗試了10秒鐘睡眠。我會嘗試一下,看看它是否工作,也許調用相同的函數兩次重置。 – MacRedrum