ShortMan
Новичок
Здравствуйте всем!
Имею у вас спросить два вопроса. Пишу валидатор XML на PHP (используя стандартные библиотеки). Столкнулся с двумя не очень приятными моментами.
Момент первый: Используя класс DOMDocument, при проверке входящего XML файла все работает нормально до использования метода DOMDoucument::schemaValidate();. Т.е. создание самого объекта, загрузка в него XML документа для проверки, все это занимает от 500ms до 1.5ms (в зависимости от размера загружаемого файла). Но как только доходит до проверки документа на соответствие XML-схеме (XSD), то все падает в хроническую обработку до получения ошибки 504 Gateway Time-out.
Если коротко то так:
Все умирает на последнем if.
Момент второй: Тема та же валидация XML-документа, но при этом используя НЕ DOMDocument, а XMLReader (в целях экономии памяти сервера). Картинка похожая, все создается, загружается и парсится. Но не обошлось без "НО". Метод XMLReader::setSchema($name_xsd);, всегда возвращает true. Даже при условии подсовывания битого XML-документа (отсутствие закрывающего тега в корневом элементе), возвращает true.
Прокомментируйте ваши размышления по этому поводу. Возможно у кого то есть какие либо решения.
По первому моменту есть подозрения на проблемы на хостинге, потому как на локальном серве все летает.
По второму ничего не могу предположить, кроме нерабочего метода. (PHP скомпилирован с поддержкой libxml старше 20902 )
Имею у вас спросить два вопроса. Пишу валидатор XML на PHP (используя стандартные библиотеки). Столкнулся с двумя не очень приятными моментами.
Момент первый: Используя класс DOMDocument, при проверке входящего XML файла все работает нормально до использования метода DOMDoucument::schemaValidate();. Т.е. создание самого объекта, загрузка в него XML документа для проверки, все это занимает от 500ms до 1.5ms (в зависимости от размера загружаемого файла). Но как только доходит до проверки документа на соответствие XML-схеме (XSD), то все падает в хроническую обработку до получения ошибки 504 Gateway Time-out.
Если коротко то так:
Код:
libxml_use_internal_errors(true);
$doc = new DOMDocument('1.0','utf-8');
if(!$doc->loadXML($str))
$errors[] = 'Ошибка загрузки XML';
if(!$doc->schemaValidate($xsd))
foreach(libxml_get_errors() as $error){...}
Момент второй: Тема та же валидация XML-документа, но при этом используя НЕ DOMDocument, а XMLReader (в целях экономии памяти сервера). Картинка похожая, все создается, загружается и парсится. Но не обошлось без "НО". Метод XMLReader::setSchema($name_xsd);, всегда возвращает true. Даже при условии подсовывания битого XML-документа (отсутствие закрывающего тега в корневом элементе), возвращает true.
Код:
libxml_use_internal_errors(true);
$reader = new XMLReader();
$reader->open('sale.xml');
var_dump($reader->setSchema('schema.xsd'));
По первому моменту есть подозрения на проблемы на хостинге, потому как на локальном серве все летает.
По второму ничего не могу предположить, кроме нерабочего метода. (PHP скомпилирован с поддержкой libxml старше 20902 )