2011-09-19 20 views
0

在留言板上詢問了此問題,我想獲得關於哪種方法在語義上更加正確且資源密集度更低的明確答案和智能辯論。哪種方法更好?使用PHP散列文件中的每行

說我有一個文件中的每一行包含一個字符串的文件。我想爲每行生成一個MD5散列,並將其寫入同一個文件,覆蓋以前的數據。我首先想到的是要做到這一點:

$file = 'strings.txt'; 

$lines = file($file); 
$handle = fopen($file, 'w+'); 

foreach ($lines as $line) 
{ 
    fwrite($handle, md5(trim($line))."\n"); 
} 

fclose($handle); 

另一位用戶指出,file_get_contents()函數和file_put_contents()比在循環中使用的fwrite()更好。他們的解決方案:

$thefile = 'strings.txt'; 
$newfile = 'newstrings.txt'; 

$current = file_get_contents($thefile); 

$explodedcurrent = explode('\n', $thefile); 

$temp = ''; 
foreach ($explodedcurrent as $string) 
     $temp .= md5(trim($string)) . '\n'; 

$newfile = file_put_contents($newfile, $temp); 

我的論點是,因爲這樣做的主要目的是把文件進入一個數組,和file_get_contents()函數是讀取文件的內容到一個字符串中的首選方式,file()更合適,並允許我們刪除另一個不必要的函數explode()。此外,通過使用fopen(),fwrite()和fclose()(它與file_put_contents()的調用完全相同)直接操作文件,不需要有無關變量來存儲轉換後的字符串;你直接將它們寫入文件。

我的方法與替代方法完全相同 - 文件打開/關閉的次數相同 - 除了我的更短和更正確的語義。

你有什麼要說的,你會選擇哪一個?


這應該是更高效和資源密集程度較低的前兩種方法:

$file = 'passwords.txt'; 

$passwords = file($file); 
$converted = fopen($file, 'w+'); 

while (count($passwords) > 0) 
{ 
    static $i = 0; 
    fwrite($converted, md5(trim($passwords[$i]))); 
    unset($passwords[$i]); 
    $i++; 
} 

fclose($converted); 

echo 'Done.'; 
+7

「智慧辯論」,我的腳。關於「從哪一端打破雞蛋」主題 –

+0

只要做任何事情對你最有意義 – Halcyon

+0

無論採用哪種方法,兩種方法都將文件嗅探到內存中,然後在內存中重複使用。您至少需要2倍於內存的文件大小來處理此重複。對於2或3行文件(短行)沒有什麼大不了的。主要的問題,如果你正在尋找一個多gig網絡服務器訪問日誌。 –

回答

0

作爲一個評論暗示做什麼更有意義給你。由於您可能會在幾個月後回到此代碼,因此您需要花費最少的時間來了解它。然後,如果速度是你所關心的,那麼我會創建兩個測試用例(你幾乎已經得到它們)並使用timestamp(在腳本的開始處使用timestamp創建變量,然後在腳本的末尾減去它從腳本末尾的timestamp中找出差異 - 運行腳本需要多長時間。)準備幾個文件,我將爲大約3個,兩個極端和一個普通文件進行配置。查看哪個版本運行得更快。

http://php.net/manual/en/function.time.php

我認爲差異是邊緣的,但​​它也取決於你的文件大小。

0

我會建議編寫一個新的temporary file,而你處理輸入的。完成後,用臨時文件覆蓋輸入文件。

+0

有趣。在我將這些轉換值寫入文件之後,我決定簡單地取消設置()每個數組元素。我認爲這不是資源密集型的。查看更新的第一篇文章 –

+0

當然,這是可能的。但是不要忘記,你仍然會像源文件一樣分配內存[加上一些內部數據結構信息]。來自@MarcB的評論仍然適用。 – SteAp

+0

的確如此,但我認爲記憶體的使用會逐漸下降嗎?我想另一種方法是手動讀取每行,而不是一次讀取所有內容。 –