【问题标题】:file_get_contents displays extra charactersfile_get_contents 显示额外字符
【发布时间】:2014-10-03 11:49:43
【问题描述】:

脚本应该显示文件的内容,但是如果开头和结尾有很多字符(超过 8000 个)添加了意外字符(不同文件的字符可能会发生变化)。

b15f
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
...
</body>
</html>
0

b15f0在哪里?

脚本:

<?php
header("HTTP/1.1 200 OK");
header("Content-Type: text/html; charset=utf-8");
$content = file_get_contents( "index.html" );
echo($content);
?>

【问题讨论】:

    标签: php utf-8 character file-get-contents


    【解决方案1】:

    您似乎看到了块长度。

    您可能正在使用chunked encoding 并保存原始结果。 HTTP 有不同的方式来传输消息体。最常见的是使用 Content-Length,但只有在开始发送内容时知道长度才能执行此操作。这种方法的一个方便的方面是原始消息体不需要解码。您只需读取 Content-Length 字节,这就是您的结果。

    如果页面是动态的,有时您想在知道完整长度之前就开始向客户端写入字节。这是您使用分块编码的时候。每个块前面都有一个十六进制格式的块长度。最后一个chunk之后是一个0,表示一个空的chunk,传输结束。

    服务器有一个 8k 的缓冲区限制(例如,我认为这是 PHP 的默认值),这意味着在 body 大于 8k 后,它会以块的形式发送。因此,在文件大于 8k 后,您的数据中会散布着块大小。

    解决方案:

    ob_start();
    echo($content);
    header('Content-Length: '.ob_get_length());
    ob_end_flush();
    

    【讨论】:

    • 谢谢,看来是真的。我该如何解决?服务器设置中的哪个选项修复?
    • 我不确定您是否可以在不重新编译 PHP 的情况下更改它。此外,它可能是 Apache 或 Nginx 做的。您可能能够显式使用输出缓冲(在内容之前使用 ob_start(),然后在内容之后回显 ob_get_clean()),但我不确定。如果没有,您也可以尝试在回显缓冲内容之前发送一个明确的 Content-Length 标头,这应该会导致问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多