【问题标题】:unset() works on unix platform, not in Windows 10 [duplicate]unset() 适用于 unix 平台,不适用于 Windows 10 [重复]
【发布时间】:2020-05-24 14:32:59
【问题描述】:

我有这段代码可以解析远程 TXT 文件。它在运行在 unix 上的远程服务器上运行良好,但在 Windows 10 Apache 上,它无法到达 echo <hr>Reached here...<hr>; 行。

这是代码:

<?php
if (!file_exists('unicode-13.txt')) {
    file_put_contents('unicode-13.txt', file_get_contents('https://unicode.org/Public/emoji/13.0/emoji-test.txt'));
}

$blocks = explode(PHP_EOL.PHP_EOL, file_get_contents('unicode-13.txt'));

// var_dump($blocks);

unset($blocks[0]);

$emoji = [];

foreach ($blocks as $chunk) {

    echo "<hr>Reached here...<hr>";

    $top = explode(PHP_EOL, $chunk)[0];

    if (substr($top, 0, strlen('# group:')) == '# group:') {

        $group = trim(str_replace('# group:', '', $top));

    } elseif (substr($top, 0, strlen('# subgroup:')) == '# subgroup:') {

        $lines = explode(PHP_EOL, $chunk);
        unset($lines[0]);

        foreach ($lines as $line) {

            $subgroup = trim(str_replace('# subgroup:', '', $top));
            $linegroup = explode(';', $line);
            $parts = explode('#', $linegroup[1]);
            $icon = explode(' ', trim($parts[1]), 2);

            $var_codepoint =    trim($linegroup[0]);
            $var_status =       trim($parts[0]);
            $var_sub_group =    trim($subgroup);
            $var_emoji =        trim($icon[0]);
            $var_emojiname =    trim($icon[1]);

            echo "var_codepoint: " . $var_codepoint . "<br />";
            echo "var_status: " . $var_status . "<br />";
            echo "group: " . $group . "<br />";
            echo "var_sub_group: " . $var_sub_group . "<br />";
            echo "var_emoji: " . $var_emoji . "<br />";
            echo "var_emojiname: " . $var_emojiname . "<hr />";

        } // line
    } // subgroup
} // foreach
?>

我在 Windows 上没有收到任何错误 - 我已验证 $blocks 数组已在 Windows 测试中填充,因为 var_dump($blocks); 显示该数组。

但是,似乎在 Windows 上,除了unset($blocks[0]); 之外的任何代码都不会被触发/到达。

我在 windows php 错误日志中没有收到任何错误,所以我不确定会发生什么。

【问题讨论】:

  • 您尝试过什么来调试该问题?通过 XDebug 运行调试会话并没有那么困难,甚至在您认为不起作用的那一行之前的 var_dump 也应该很简单

标签: php


【解决方案1】:

在这里使用PHP_EOL 是错误的。在 Unix 上是 \n,在 Windows 上是 \r\n,但远程文件的内容不依赖于您的操作系统——不管怎样,文件都使用 \n。所以只需在你的代码中使用"\n" 而不是PHP_EOL,它就会起作用。目前它失败了,因为文件不包含任何"\r\n\r\n" 的实例,所以第一个explode 只返回一个包含整个文件的“块”,然后你扔掉第一个块,什么都没有。

【讨论】:

    猜你喜欢
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多