Php 简单调用unserialize()函数将换行符添加到输出缓冲区-wtf?

Php 简单调用unserialize()函数将换行符添加到输出缓冲区-wtf?,php,serialization,kohana,Php,Serialization,Kohana,我正在编写支付网关,需要向支付服务器抛出xml响应。但,突然间,我的XML被生成的文档开头的换行符破坏了 我使用Kohana 3框架,它使用PHP函数unserialize()检索会话对象,调用此函数时,换行符打印到输出缓冲区。 此代码: <?php echo 123; $object = unserialize($data); document_creation_and_outputting; 但是这个代码: <?php $object = unserialize($data);

我正在编写支付网关,需要向支付服务器抛出xml响应。但,突然间,我的XML被生成的文档开头的换行符破坏了

我使用Kohana 3框架,它使用PHP函数
unserialize()
检索会话对象,调用此函数时,换行符打印到输出缓冲区。 此代码:

<?php
echo 123;
$object = unserialize($data);
document_creation_and_outputting;
但是这个代码:

<?php
$object = unserialize($data);
echo 123;
document_creation_and_outputting;
因此,您可以看到,如果生成的doc_主体没有换行符,那么我的脚本在第一行就没有换行符(因为在第一个示例中,我们在“123”之前没有看到换行符),并且,我保证,我使用不带BOM的UTF-8

所以我的问题是:发生了什么


在输出生成的文档之前,我使用了
ob\u end\u clean()
来清理缓冲区,它解决了我的问题,但我真的不理解
unserialize()
的行为。

我是个白痴。 取消序列化()收到以下消息:


对不起,伙计们。我刚开始工作。

问题不在于调用unserialize(),而是在调用之前包含的任何php文件的开头都有一些(可能是不可见的)空白。检查包含的文件的开头和结尾。我能想到的唯一方法是使用输出换行符的方法对对象进行解码。问题更可能出现在其他地方。如果换行符是脚本的第一个输出,您可以使用它,然后检查$file/$line(希望)看看是什么产生了这个输出。@AlexanderO'Mara或者反序列化是否触发从包含前导/尾随的文件加载类newline@NineBerry,看看例子,在这两种情况下,我都包含相同的文件,并插入我的echo“123”;直接在取消序列化函数之前和之后。此外,如果我只是用unserialize()注释行,空白就会消失。此外,我在脚本中不使用?>。仅在模板中,我检查它们。@Dashwuff-您的回答是对的:或者如果反序列化触发从包含前导/尾随换行符的文件加载类
<?php
$object = unserialize($data);
echo 123;
document_creation_and_outputting;
(empty line)
123document_body