2015-09-28 84 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