2013-06-25 70 views
3

的奇怪問題我正在研究一個PHP腳本來自動解壓縮和掃描位於外部USB驅動器上的tar.gz存檔,而且我遇到一些奇怪的問題,一旦腳本找到一個檔案,它會嘗試在USB驅動器上創建一個臨時目錄來解壓檔案,爲了保證唯一的臨時目錄名稱(因爲這個腳本可能同時運行多次)我使用當前時間的MD5的隨機5位部分爲文件命名,例如:PHP:shell_exec(「mkdir」)和shell_exec(「rm -rf)

$temp = "/media/$driveName/".substr(md5(microtime()), rand(0, 26), 5);

因爲USB驅動器未安裝在服務器文件系統,我無法使用PHP的內置文件管理命令(mkdir(),glob()等),而只能使用exec()或shell_exec()執行的終端命令與文件系統交互。因此,實際創建上述名稱的臨時目錄,我用一個基本的終端mkdir命令:

shell_exec("mkdir $temp");

接下來,我解壓存檔到臨時目錄:

shell_exec("tar -xzf $archivePath -C $temp");

最後,在完成存檔分析後,刪除臨時目錄及其內容:

shell_exec("rm -rf $temp");

不過,我遇到了個怪問題:

  1. 偶爾,也許就是每五隻奔跑的,臨時目錄與一個已損壞的名稱創建。當使用ls directory顯示時,它看起來像06191v??????.???v???。但是,使用Tab鍵自動填充cd命令時,它會填充更長的字符串,如06191v\342\226\200\342\225\232.\342\211\2100v\342\226\200/。我知道在將字符串傳遞給shell_exec()之前該字符串沒有問題(我甚至試圖使用substr()將其限制爲正確的長度,但無濟於事),並且第一個斜槓後面的一系列字符(從342​​開始)始終是相同的,不管最初的五個字符是什麼(最初的五個字符和斜槓之間的字符總是一個字母,但是在其他情況下是隨機的)。但是,除此之外,我很茫然。

  2. 由於某種原因,我用來刪除腳本末尾的臨時目錄的shell_exec("rm -rf $temp");只有在執行兩次時纔有效。如果我只執行一次,我會得到以下錯誤:rm: cannot remove '/media/FILESYSTEM/f3637': Directory not empty,這本身很奇怪,因爲-rf應該重寫此錯誤。此行爲也可以在服務器的命令提示符中重複。

我似乎無法找到與這些問題之一在網上任何東西,所以我希望這只是我做出愚蠢的錯誤,而不是與我的安裝或USB驅動器有問題。預先感謝任何幫助!

編輯:我其實有第三個問題,可能與第一個問題有關。運行shell_exec("tar -xzf")命令解壓縮我的壓縮文件後,生成的目錄總是附加了一些奇怪的字符。例如,對於名爲BOOT的壓縮目錄執行一次運行,解壓縮的目錄在終端中顯示爲BOOT??w??????.???w???,其回顯輸出顯示爲BOOT²w▀╚.∙wâ–€。在使用Tab鍵填寫cd命令到這個目錄後,我得到一個幾乎相同模式的字符串:BOOT\302\262w\342\226\200\342\225\232 2.\342\210\231w\342\226\200/。 99%的時間,這不影響腳本的執行,但偶爾它會導致腳本無法掃描目錄。

回答

0

事實證明,所有這三個問題有相同的解決方案:讓臨時檔案的地方,除了USB驅動器。我不知道是什麼導致了額外的字符,但是當我將臨時目錄位置移動到Linux的/ tmp目錄時,它們一勞永逸地消失了。

0

對於#1,看起來像是一些奇怪的角色進入那裏。

想這在我的機器上,並且它似乎工作:

<?php 

for($x = 0; $x < 30 ; $x++) 
    shell_exec('mkdir ' . substr(md5(microtime()), rand(0, 26), 5)); 
    sleep(1); 

我從引號內分離變量並添加回用「」

-Ken

+0

這個問題是我需要能夠將臨時目錄的名稱保存到一個變量(我可以使用終端命令找到它,但似乎不必要地迂迴)。我嘗試過這樣:'shell_exec(「mkdir」。$ temp);'但它似乎沒有什麼區別。 – NinjaBlob

+0

你可以直接回顯$ temp變量嗎?我的猜測是一些非ASCII字符正在進入。 –

+0

我試過了,但我仍然遇到同樣的問題: 'ob_start(); echo $ temp; $ temp = ob_get_clean();' – NinjaBlob