Используя немодифицированную демонстрацию soda-php, получая «Ошибка 0 с сервера:»

Я использую XAMPP/Win10, PHP 7.0.1. Я взял Socrata/soda-php с GitHub и запустил index.php. Я не вносил изменений в файл.

Когда я отправляю форму, я всегда получаю Error "0" from server: без какой-либо другой информации. В моих журналах ошибок PHP ничего нет.

Я могу без проблем получить доступ к выходным данным JSON напрямую. Я также могу получить и проанализировать его с помощью клиентского JavaScript.

Я просмотрел другой вопрос с той же проблемой, но это был другой набор данных, поэтому ответ не применим. Я также проверил предложение по этому вопросу о включении cURL, которое Я подтвердил.

Я надеюсь использовать этот пример PHP для доступа к данным из CMS (что я уже делаю с помощью JavaScript), но мне нужно сначала заставить его работать как есть, чтобы я мог научиться следующим шагам.


person aardrian    schedule 14.02.2016    source источник


Ответы (1)


Чтобы убедиться, что это не проблема в soda-ruby, я провел локальное тестирование, и мне удалось заставить образец нормально работать в PHP 7.0.3 (CLI-сервер, только что установленный через homebrew).

Пример кода не дал никаких результатов, поскольку опасные собаки в этом месте, по-видимому, ушли, поэтому я обновил местоположение по умолчанию и диапазон поиска. Я также обновил образец, чтобы использовать новую конечную точку SODA 2.1 для этот набор данных, хотя версия 2.0 пока работает нормально. Поэтому убедитесь, что вы получаете последние обновления, чтобы мы были синхронизированы.

Сообщение Error "0" на самом деле исходит от самого libcurl. Это означает, что у cURL была проблема даже с подключением к data.austintexas.gov, что очень часто означает, что ваша система не смогла выполнить рукопожатие SSL, потому что PHP/libcurl не доверяет сертификату удаленного сервера. Я видел это несколько раз на сайте Остина и часто у пользователей Windows. Я подозреваю, что это так, особенно учитывая, что вы можете получить доступ к тому же API через JavaScript.

Решение состоит в том, чтобы либо обновить корневые сертификаты, либо указать внешний центр сертификации, который не связан с XAMPP. Я никогда не делал этого с XAMPP сам, но это кажется надежным ответом: Включение поддержки SSL для CURL в XAMPP

Одно из предложенных исправлений также полностью отключает проверку SSL, что было бы нормально, если бы вы просто собирались использовать PHP для небольшого взлома, а не в рабочей среде. Но, пожалуйста, не используйте этот обходной путь в производственной среде, так как он делает вас уязвимыми для MITM-атак.

person chrismetcalf    schedule 16.02.2016
comment
К вашему сведению, я также обновил библиотеку, чтобы выводить больше деталей отладки, когда вы получаете ошибку cURL, это должно помочь выяснить, что там происходит. Убедитесь, что у вас установлена ​​последняя версия: github.com/socrata/soda-php/commit/ - person chrismetcalf; 16.02.2016
comment
Я также добавил проверку ошибок (вы можете увидеть мою вилку), которая сообщила мне, что проблема заключается в сертификате эмитента. В старом сценарии добавление curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false); ничего не дало, но в вашем обновлении страница теперь отображается. Так что похоже, что теперь мне нужно переустановить сертификаты и отследить эту проблему (поскольку никто не любит MitM), но, по крайней мере, теперь у меня есть направление. Спасибо за обновленный скрипт. - person aardrian; 17.02.2016
comment
Потрясающий. Если вы найдете хороший способ обновить сертификаты в XAMPP, дайте мне знать, так как это обязательно появится снова. Остин выбрал более нового провайдера SSL, который есть в обновленных браузерах, но отсутствует в старых хранилищах доверия OpenSSL CA. - person chrismetcalf; 17.02.2016
comment
Я добавил curl_setopt($handle, CURLOPT_CAINFO, getcwd().'/curl-ca-bundle.crt'); (путь зависит от вашей настройки), используя файл сертификата, который я взял из сайт cURL, который я только что переименовал и поместил в тот же каталог, что и файлы PHP (я также установил его правой кнопкой мыши на всякий случай). Я отключил curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);, и все было готово. - person aardrian; 17.02.2016