Сервер A использует xmlreader для чтения XML из xmlwriter на сервере B - PullRequest
4 голосов
/ 03 декабря 2010

У меня есть два сервера

Сервер A читает http://www.some -url.com / xmlwriter_src.php , используя

$reader = new XMLReader();
$reader->open('http://www.some-url.com/xmlwriter_src.php');
while ($reader->read()) 
{
  /* -- do something -- */
}

Сервер B создает поток xml

$writer = new XMLWriter();
$writer->openURI('php://output');
$writer->startDocument("1.0");

$writer->startElement("records");
while(!$recordset->EOF)
{
  $writer->startElement($fieldname) 
  $writer->text($recordset->fields[$fieldname]);
  $writer->endElement();
  $recordset->movenext();
}

xmlreader на сервере A продолжает жаловаться, что сервер B не отвечает, хотя я вижу результат xml в браузере.

Генерация занимает менее секунды

Если я скопирую xml в статический файл, xmlreader выведет файл.

Ответы [ 3 ]

1 голос
/ 11 декабря 2010

Вы пытались добавить

header("Content-Type: text/xml");

В противном случае читатель будет считать его простым текстом и работать не будет.Попробуйте дать это в начале файла.

0 голосов
/ 14 декабря 2010

Попробуйте записать все, что xmlReader читает на диске, и проверьте созданный файл. У меня есть предчувствие его пустой или недействительный (неполный) XML. Если я прав, то у вас может быть тайм-аут , который истекает раньше, чем тот, который вы получаете в реальном браузере. Либо это, либо соединение, которое требует либо закрытие соединения, либо сохранение активности (я видел серверы, сломанные вот так).

Кроме того, убедитесь, что на сервере, где работает клиент, нет брандмауэра, который может заблокировать xmlReader от общения с xmlWriter :) Попробуйте iptables -L в консоли сервера проверить все правила брандмауэра.


Изменить: вам также может понадобиться вызвать что-то вроде xmlReader->close(), или end(), или любого другого члена, который у вас там есть, который закрывает соединение и сигнализирует клиенту, что передача окончена.

0 голосов
/ 14 декабря 2010

По умолчанию писатель будет буферизовать ваш вывод.Когда вы закончите, вы ДОЛЖНЫ вызвать flush ().

$writer = new XMLWriter();
$writer->openURI('php://output');
$writer->startDocument("1.0");

$writer->startElement("records");
while(!$recordset->EOF)
{
  $writer->startElement($fieldname) 
  $writer->text($recordset->fields[$fieldname]);
  $writer->endElement();
  $recordset->movenext();
}
$writer->flush();

Кстати: где вы закрываете элемент records?

...