Странно, что метод класса по умолчанию иногда дает сбой таким образом, даже если аргументы, переданные методу, совпадают, что обычно занимает доли секунды.
Превышено максимальное время выполнения 30 секунд в script_path в строке script_line_number
Именно в этой строке:
$result = $DOMDocument -> schemaValidate($schemaPath);
$DOMDocument всегда один и тот же. И он ссылается только на части одного и того же XML с атрибутами ID. У него нет атрибута типа URL, кроме атрибутов Algorith и xmlns, которые по своей природе не вызывают никаких ресурсов ниоткуда, и мы говорим о классе DOMDocument PHP и стандартах XML.
$schemaPath
всегда один и тот же, и он указывает на локальный XSD-файл сервера, который всегда есть до и после попытки проверки, независимо от того, успешна она или нет. Схема указывает только на другие локальные файлы xsd, расположенные в той же папке, т.е. <xs:include schemaLocation="schema2.xsd"/>
Единственный возможный ответ, который я могу придумать, это то, что файл XSD находится по методу, но по какой-то причине он не может быть прочитан, потому что диск занят.
Что может быть причиной того, что выполнение метода занимает так много времени?
Какие меры следует предпринять, чтобы предотвратить возникновение ошибки, кроме увеличения максимального времени выполнения PHP?
Файлы XML и XSD довольно малы, на самом деле проверка одних и тех же файлов XML и XSD обычно занимает менее ~ 0,1 секунды, но очень редко (~ 1 из 1000) время выполнения превышает 30 секунд.
ИЗМЕНИТЬ
Я изолировал проблему, поэтому публикую образцы.
Схема.xsd:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema targetNamespace="http://www.foo.bar/Car" xmlns:SiiDte="http://www.foo.bar/Car" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:include schemaLocation="schema2.xsd"/>
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsignature_v10.xsd"/><!-- just the standar signature schema -->
<xs:element name="ROOT" type="SiiDte:ROOTDefType"/>
<xs:complexType name="ROOTDefType">
<xs:sequence>
<xs:element name="Element"></xs:element>
<xs:element ref="ds:Signature">
<xs:annotation>
<xs:documentation>Firma Digital sobre Documento</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
<xs:attribute name="version" type="xs:decimal" use="required" fixed="1.0"/>
</xs:complexType>
</xs:schema>
Схема2.xsd:
<xs:schema targetNamespace="http://www.foo.bar/Car" xmlns:ns1="http://www.foo.bar/Car" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:simpleType name="MOOType">
<xs:restriction base="xs:positiveInteger">
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
<xs:enumeration value="3"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
Код:
// ... a bunch of ther code...
$XML =
'<?xml version="1.0"?>
<ROOT xmlns="http://www.foo.bar/Car" version="1.0">
<Element ID="A1">hello</Element>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="#A1">
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>base64string</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>base64string</SignatureValue>
<KeyInfo>
<KeyValue>
<RSAKeyValue>
<Modulus>base64string</Modulus>
<Exponent>AQAB</Exponent>
</RSAKeyValue>
</KeyValue>
<X509Data>
<X509Certificate>base64string</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
</ROOT>'
;
$DD = new DOMDocument();
$DD -> loadXML($XML);
$i = 0;
while ($i < 100) {
// ... a bunch of other code...
libxml_use_internal_errors(true);
$old_libxml_disable_entity_loader = libxml_disable_entity_loader(false); $result = $DD -> schemaValidate(__DIR__ . '/schema.xsd');
libxml_disable_entity_loader($old_libxml_disable_entity_loader); // Se desactiva nuevamente carga de entidades para descartar entidades maliciosas
$i++;
echo str_pad($i, 5) . ($result ? 'true' : 'false') . '<br>';
// ... a bunch of other code...
}
XSD file is located by the method but for some reason it cannot be read, because the disc is busy
- или ему нужно что-то из сети, чего нет в данный момент? - person VolkerK   schedule 11.09.2015ini_set('allow_url_fopen', false);
для безопасности. Схема ссылается только на локальные файлы, хранящиеся в той же папке (например:<xs:include schemaLocation="other_schema.xsd"/>
). - person mikl   schedule 11.09.2015<xsd:include/import schemaLocation="http://..."
не повлияет на allow_url_fopen=false. Но в любом случае, если вы говорите, что нет задействованного инет-ресурса, будем считать, что это исключено ;-) - person VolkerK   schedule 11.09.2015schemaLocation
, который не использует парные токены (раздельные пробелы, в парах, URI и местоположение), возможно, позволяя синтаксическому анализатору думать, что он должен рассматривать его как местоположение. Известно, что некоторые парсеры XSD делают это, хотя технически такой атрибут неверен. - person Abel   schedule 11.09.2015<xs:include schemaLocation="schema2.xsd"/>
, т. е. ссылка на xsd, расположенный в той же папке. Он не разделен попарно, но проверка в 99% случаев выполняется успешно менее чем за 0,1 секунды с точно такими же XML и схемами. - person mikl   schedule 11.09.2015schemaLocation
в корне. Вы там проверяли? - person Abel   schedule 11.09.2015