Я не могу загрузить xml-файл.
Этот код отлично работает:
$url = 'http://www.w3schools.com/xml/note.xml'; $xml = simplexml_load_file($url); print_r($xml);
Но этот
$url = 'https://www.boardgamegeek.com/xmlapi2/thing?id=105551'; $xml = simplexml_load_file($url); print_r($xml);
не работает. Я получаю эту ошибку:
Предупреждение: simplexml_load_file (): операция SSL завершилась неудачно с кодом 1. OpenSSL Сообщения об ошибках: ошибка: 14090086: SSL-процедуры: SSL3_GET_SERVER_CERTIFICATE: проверка сертификата не выполнена /storage/content/59/113059/boardgamelevelup.com/public_html/index.php on line 19 Предупреждение: simplexml_load_file (): Не удалось включить криптографию в каталоге /storage/content/59/113059/boardgamelevelup.com/public_html/index.php в строке 19 Предупреждение: simplexml_load_file ( https://www.boardgamegeek.com/xmlapi2/thing ? id = 105551 ): не удалось открыть поток: операция не удалась /storage/content/59/113059/boardgamelevelup.com/public_html/index.php в строке 19 Предупреждение: simplexml_load_file (): предупреждение ввода-вывода: не удалось загрузить внешние entity " https://www.boardgamegeek.com/xmlapi2/thing?id=105551 " в /storage/content/59/113059/boardgamelevelup.com/public_html/index.php в строке 19
Файл xml от boardgamegeek работает на других сайтах. Должен ли я использовать другой php-код для загрузки этого XML-файла?
короткий ответ в кулинарной книге:
Добавить
$ context = stream_context_create (массив ('ssl' => массив ( 'verify_peer' => true, 'cafile' => '/path/to/ca-bundle.crt' ))); libxml_set_streams_context ($ контекст);
к вашему скрипту, чтобы он выполнялся до simplexml_load_file ().
Или – вместо кода выше – установите в openssl.cafile=/path/to/ca-bundle.crt
.
Очень короткое объяснение:
Ваша версия php использует openssl для обработки транспорта http. openssl пытается проверить, действительно ли сервер является тем, кем он себя утверждает. Он делает это, проверяя, является ли его сертификат надежным. Сертификат X.509 содержит некоторые данные о владельце и подписывается эмитентом (сам имеет сертификат, который снова подписан и так далее, и до тех пор, пока сертификат, в котором владелец и эмитент не идентичен, -> самоподписанный / корневой сертификат). Сертификат считается «доверенным», если в этой цепочке сертификатов есть (по крайней мере) один сертификат, на котором openssl «говорит»: «ОК, мне было поручено доверять этому». Эта инструкция принимает форму (или может принимать форму) «вот файл, содержащий сертификаты, которым вы должны доверять» (cafile).
Вышеприведенный код сообщает libxml-оболочке php сообщать openssl, где этот cafile – это когда simplexml_load_file использует https / openssl-wrapper.
И openssl.cafile=/path/to/ca-bundle.crt
просто устанавливает его по умолчанию; если не указано иначе, все операции openssl будут использовать этот файл, включая libxml / simple_xml_loadfile.
Ссылка ca-bundle.crt, с которой я связан, – это проект, который «утверждает», чтобы предоставить извлеченные корневые сертификаты, поставляемые с mozilla firefox. Что касается «претензий»: у меня нет оснований сомневаться в том, что это действительно нетривированный список сертификатов корней; но вы никогда не знаете: вы ставите свое доверие а) в этом проекте и b) mozilla делает хорошую работу и ставит только надежные сертификаты в этом списке ….
для более подробного объяснения см. http://phpsecurity.readthedocs.org/en/latest/Transport-Layer-Security-%28HTTPS-SSL-and-TLS%29.html#php-streams