在留言板上詢問了此問題,我想獲得關於哪種方法在語義上更加正確且資源密集度更低的明確答案和智能辯論。哪種方法更好?使用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.';
「智慧辯論」,我的腳。關於「從哪一端打破雞蛋」主題 –
只要做任何事情對你最有意義 – Halcyon
無論採用哪種方法,兩種方法都將文件嗅探到內存中,然後在內存中重複使用。您至少需要2倍於內存的文件大小來處理此重複。對於2或3行文件(短行)沒有什麼大不了的。主要的問題,如果你正在尋找一個多gig網絡服務器訪問日誌。 –