Я пишу платежный шлюз и нуждаюсь в отправке 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.
Проблема заключается не в вызове unserialize(), а в том, что любой из php-файлов, которые вы включаете для совершения вызова, имеет некоторые (возможно, невидимые) пробелы в начале перед Php или в конце после?> , Проверьте начальные и конечные файлы файлов, которые вы включили. – NineBerry
Единственный способ, которым я могу думать о 'unserialize', заключается в том, что он декодирует объект с помощью метода' __wakeup', который выводит новую строку. Скорее всего, проблема в другом месте. –
В случае, если linebreak является самым первым выходом скрипта, вы можете использовать ['headers_sent ($ file, $ line);'] (http://docs.php.net/headers_sent), а затем проверить $ file/$ line чтобы (надеюсь) увидеть, что произвело этот вывод. – VolkerK