В настоящее время я создаю веб-приложение, которое извлекает данные из API. API использует XML как форму приема запросов и отправки ответов. У меня отлично работает веб-приложение на моем WAMP-сервере. Я даже развернул его онлайн на бесплатном веб-сервере PHP, чтобы протестировать его, и он работает без проблем. Однако, когда я развернул его на живом сервере, я получил следующие ошибки в моем файле журнала php.
Вт апр 07 17:28:12 2015] [ошибка] [клиент 94.236.7.190] PHP Уведомление:
Неопределенное смещение: 1 в /home/jdsites/camping.blacks.co.uk/api.php on
линия 214
[Вторник, 07 апреля 17:28:12 2015] [ошибка] [клиент 94.236.7.190] Предупреждение PHP: gzuncompress (): ошибка данных в
/home/jdsites/camping.blacks.co.uk/api.php в строке 214
[Вторник, 07 апреля 17:28:12 2015] [ошибка] [клиент 94.236.7.190] Примечание PHP: попытка получить свойство необъекта в
/home/jdsites/camping.blacks.co.uk/api.php в строке 89
[Вторник, 07 апреля 17:28:12 2015] [ошибка] [клиент 94.236.7.190] Примечание PHP: попытка получить свойство необъекта в
/home/jdsites/camping.blacks.co.uk/api.php в строке 89
[Вторник, 07 апреля 17:28:12 2015] [ошибка] [клиент 94.236.7.190] Примечание PHP: попытка получить свойство необъекта в
/home/jdsites/camping.blacks.co.uk/api.php в строке 89
Это код PHP в моем скрипте:
// decode the attachment data and this should return a valid xml string
line 214: $attachment_xml = gzuncompress(base64_decode($matches[1]));
line 215: $responseXml = new SimpleXMLElement($attachment_xml);
Я не могу понять проблему: — |
Ваш код отсутствует фундаментальный проверка ошибок (простите за смелость здесь :)).
// decode the attachment data and this should return a valid xml string
$attachment_xml = gzuncompress(base64_decode($matches[1]));
$responseXml = new SimpleXMLElement($attachment_xml);
Это может быть рабочий код PHP, но только при определенных обстоятельствах. Это именно то, что вы испытываете: на вашем WAMP-боксе все нормально, но в других местах оно выдает много ошибок и предупреждений. Давайте посмотрим, где проблема в первую очередь:
$match = $matches[1];
if (!strlen($match)) {
throw new UnexpectedValueException('No match found');
}
$compress = base64_decode($match);
if (false === $compress) {
throw new RuntimeException('Failed to decode base64');
}
$uncompress = gzuncompress($compressed);
if (false === $uncompress) {
throw new RuntimeException('Failed to gzuncompress');
}
$xml = simplexml_load_string($uncompress);
if (false === $xml) {
throw new RuntimeException('Failed to parse XML');
}
Как очевидно из этого кода, он сам сообщит, какая операция выполняется, потому что возвращаемое значение каждой операции проверяется перед продолжением кода.
Поскольку вы взаимодействуете здесь с внешними данными, это действительно важно, потому что ошибка в данных может быть смешана с различными кодировками, которые у вас есть:
на каждом этапе что-то может потерпеть неудачу, но вы даже не проверяли свой исходный код.
Далее, предполагая, что входные данные всегда ошибочны, код также проверяет совпадение, то есть неизвестную кодировку, которую вы используете, вы анализируете что-то, что, я думаю, с помощью регулярного выражения. Поэтому важно, чтобы вы нашли первое место ошибки как можно раньше. В противном случае вы, возможно, ищете не в том месте, чтобы найти причину ошибки.
Других решений пока нет …