2015-09-28 86 views
2

我有一個腳本,它在Windows上完成工作,但不在Debian上。兩者都運行相同的PHP版本,我似乎無法弄清楚爲什麼它不適用於Debian。PHP爆炸:腳本工作在Windows上,而不是在Debian上

$content = file_get_contents('ua.log'); 
$arr = explode(PHP_EOL, $content); 

foreach($arr as $x) { 
    $i = explode(' ', $x); 
    if($i[11] == '"user/agent1.0"'){ 
     $ips[] = $i[0]; 
    } 
    else{ 
    }; 
}; 

我檢查了權限並使用了長目錄(/var/www/ua.log)。仍然似乎沒有工作,因爲$我返回NULL。

+1

linux文件系統區分大小寫 –

+0

明白了。似乎沒有問題,我使用了正確的案例。 – Marlon

回答

0

除了@ Kayasax的評論,Linux文件系統是區分大小寫(即Hello.txt與hello.txt不是同一個文件),我還有一個註釋要做。

在Windows上,PHP_EOL將默認爲\r\n,而在Linux上則只有\n。因此,如果文件是在Windows上創建的,並且在Linux上運行您的代碼,它可能會嘗試查找Linux的行尾並且無法正確地分解文件,反之亦然。

+0

我剛剛使用'\ n'進行了測試,但仍然返回'NULL'。 Windows確實會返回正確的字符串。 – Marlon

+0

所以你確定文件存在,它的名字是正確的,並且有正確的訪問權限,所以PHP實際上可以讀取它? –

+0

是的。當我用echo輸出文件時,它工作得很好。 – Marlon

1

您可能會發現它更容易使用

foreach (file("/some/file.txt", FILE_IGNORE_NEW_LINES) as $x) { 
.... 
} 

關於案件$i = explode(' ', $x); - 它也可能是一個有點不同。最好使用類似preg_split(",\s+,", $x);的東西,但要看具體的文件內容。

謝謝。

+0

這實際上解決了這個問題,出於某種原因。我想我可能會提交這個錯誤在PHP中,但我不知道。 – Marlon

+0

不,不太可能出現PHP錯誤。 On可以在任何平臺上創建具有各種EOL的文件。重要的是要有一個方法,所以人們不必關心那些EOL。例如'preg_split(「,[\ n \ r] +,」,file_get_contents(...))''可以完成將文件分割成多行的相同工作。 –

+0

但是,經過測試每個爆炸可想象的EOL後,我不確定這是否真的是問題。 – Marlon