2016-03-29 2 views
0

Я пишу платежный шлюз и нуждаюсь в отправке xml-ответа на сервер оплаты. Но, внезапно, мой XML был поврежден разрывом строки в начале сгенерированного документа.Функция простого вызова unserialize() добавляет разрыв строки в выходной буфер - wtf?

Я использую фреймворк Kohana 3, и он использует функцию PHP unserialize() для извлечения объекта сеанса, а новая строка печатает выходной буфер при вызове этой функции. Этот код:

<?php 
echo 123; 
$object = unserialize($data); 
document_creation_and_outputting; 

возвращает результат как это:

123 
document_body 

Но этот код:

<?php 
$object = unserialize($data); 
echo 123; 
document_creation_and_outputting; 

возвращает документ, как это:

(empty line) 
123document_body 

Таким образом, вы можете увидеть , если сгенерированный doc_body не имеет разрыва строки, мой скрипт не имеет прерывания строки в первой строке (потому что мы не видим разрыв строки до «123» в первом примере), и, я обещаю, я использую UTF- 8 Без спецификации.

Так что мой вопрос: что происходит?


Я использовал ob_end_clean() для очистки буфера перед выводом сгенерированного документа, и решить мою проблему, но я действительно не понимаю поведение unserialize() «s.

+1

Проблема заключается не в вызове unserialize(), а в том, что любой из php-файлов, которые вы включаете для совершения вызова, имеет некоторые (возможно, невидимые) пробелы в начале перед , Проверьте начальные и конечные файлы файлов, которые вы включили. – NineBerry

+0

Единственный способ, которым я могу думать о 'unserialize', заключается в том, что он декодирует объект с помощью метода' __wakeup', который выводит новую строку. Скорее всего, проблема в другом месте. –

+1

В случае, если linebreak является самым первым выходом скрипта, вы можете использовать ['headers_sent ($ file, $ line);'] (http://docs.php.net/headers_sent), а затем проверить $ file/$ line чтобы (надеюсь) увидеть, что произвело этот вывод. – VolkerK

ответ

0

Я идиот. unserialize() получено: My fail

Извините, ребята. Я только что придумал.

+0

@duskwuff - вы были правы в этом: или если десериализация запускает класс для загрузки из файла, содержащего ведущую/конечную новую строку –