Php 简单调用unserialize()函数将换行符添加到输出缓冲区-wtf?
我正在编写支付网关,需要向支付服务器抛出xml响应。但,突然间,我的XML被生成的文档开头的换行符破坏了 我使用Kohana 3框架,它使用PHP函数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);
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