【问题标题】:PHP explode: script working on Windows, not on DebianPHP 爆炸:脚本在 Windows 上工作,而不是在 Debian 上
【发布时间】:2015-12-25 10:25:10
【问题描述】:

我有一个脚本可以在 Windows 上完美运行,但在 Debian 上却不行。两者都运行相同的 PHP 版本,我似乎无法弄清楚为什么它不能在 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)。由于 $i 返回 NULL,似乎仍然无法正常工作。

【问题讨论】:

  • linux文件系统区分大小写
  • 知道了。似乎不是问题,我使用了正确的大小写。

标签: php windows foreach debian explode


【解决方案1】:

您可能会发现它更易于使用

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

关于$i = explode(' ', $x); 的情况 - 它也可能有点不同。最好使用preg_split(",\s+,", $x); 之类的东西,但取决于确切的文件内容。

谢谢。

【讨论】:

  • 这实际上出于某种原因解决了问题。我想我可能会将此作为 PHP 中的错误提交,但我不确定。
  • 不,这不太可能是 PHP 错误。 On 可以在任何平台上创建具有各种 EOL 的文件。重要的是要有一种方法,这样人们就不必关心那些 EOL。像preg_split(",[\n\r]+,", file_get_contents(...)) 这样的东西可以做同样的工作,将文件分成几行。
  • 但是,在测试了所有可以想象到的 EOL 爆炸后,我不确定这是否真的是问题所在。
  • 好吧,explode() 不仅仅专注于一项工作。说 explode("b", "abc") 将给出一个包含 'a' 和 'c' 的数组,所以由你决定使用哪个分隔符。知道一个确切的字符(如在这种情况下依赖于平台的 EOL)将做同样的工作。
【解决方案2】:

除了@Kayasax 评论 Linux 文件系统区分大小写(即 Hello.txt 与 hello.txt 不是同一个文件)之外,我还有一点要说明。

在 Windows 上,PHP_EOL 将默认为 \r\n,而在 Linux 上则仅为 \n。因此,如果文件是在 Windows 上创建的,而您在 Linux 上运行代码,它可能会尝试查找 Linux 的行尾,而无法正确分解文件,反之亦然。

【讨论】:

  • 我刚刚使用 '\n' 对其进行了测试,但仍然返回 'NULL'。 Windows 确实返回了正确的字符串。
  • 所以你确定文件在那里,它被正确命名并且具有正确的访问权限,所以 PHP 可以实际读取它?
  • 是的。当我输出带有回显的文件时,它工作得很好。
  • 好吧,您是否尝试过使用"\n" 手动拆分文件,而不是使用PHP_EOL 常量-var_dump(PHP_EOL) 输出是什么?
猜你喜欢
  • 2012-12-23
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多