Curl debug php: PHP — Debugging Curl — Stack Overflow
Содержание
debian — в PHP отсутствуют cURL и XDebug после обновления
спросил
Изменено
4 года, 3 месяца назад
Просмотрено
495 раз
Я только что обновился до Ubuntu 18.04.1 LTS и пошел проверить свою локальную установку apache2, добавив phpinfo() в индексный файл.
Я не вижу записи для cURL или для XDebug.
Вот что я сделал:
- Опять же, я проверил phpinfo() и не показал никаких параметров curl или xdebug.
- Я перешел к /etc/php/7.1/apache2/php.ini и раскомментировал следующую строку extension=php_curl.dll.
- Затем я перезапустил apache.
- Кроме того, мой phpinfo() показывает загруженный файл конфигурации
/etc/php/7.1/apache2/php.ini, и именно ЭТО я редактировал.
Тем не менее, WordPress по-прежнему сообщает следующее: Неустранимая ошибка PHP:
Вызов неопределенной функции curl_init().
Я думаю, что ДОЛЖЕН редактировать не тот ini-файл.
Есть идеи? Я мертв в воде здесь. 😥
- debian
- php
- curl
Короткий ответ: если вы не нашли расширение/модули curl и/или xdebug после обновления ОС, вам нужно переустановить их.
В дистрибутивах, совместимых с Debian, таких как Ubuntu, команды:
sudo apt-get install php7.1-curl php-xdebug
После установки этих модулей PHP перезапустите Apache.
Пакет: php7.1-curl
Модуль CURL для PHP [по умолчанию]
Этот пакет содержит модуль CURL для PHP.
Xdebug:
Пакет: php-xdebug
Модуль Xdebug
для PHP
Расширение Xdebug помогает отлаживать сценарий, предоставляя много ценной отладочной информации. Отладочная информация, которую может предоставить Xdebug, включает следующее:
- трассировки стека и трассировки функций в сообщениях об ошибках с:
- Отображение полного параметра для определяемых пользователем функций
- имя функции, имя файла и индикация строки
- поддержка функций-членов
- выделение памяти
- защита от бесконечных рекурсий
Xdebug также предоставляет:
- информация профилирования для скриптов PHP
- анализ выполнения скрипта
- возможности интерактивной отладки сценариев с помощью клиента отладки
Что касается вашего редактирования, php_curl. dll
предназначен для Microsoft Windows, а не для Linux; пожалуйста, прокомментируйте это снова.
4
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie
Отладка неработающего отчета об ошибках cURL Lite от Google
Пока я работал над своим новым приложением App Engine и реализовывал его интеграцию с Twitter, я столкнулся с некоторым странным поведением и множеством ошибок в реализации Google cURL Lite, когда дело дошло до обработка ошибок и отчетность. Излишне говорить, что я провел достаточное количество исследований, чтобы узнать, сталкивались ли другие с той же проблемой, и они сталкивались с ней еще в 2015 году, 3 года назад почти до даты, и ответ Google был — «Мы не утверждаем, что curl_lite является полной реализацией cURL» .
Похоже, что с тех пор не было никаких обновлений файлов среды выполнения PHP в github, что я нахожу удивительным. cURL Lite является частью среды выполнения. Ответ Google также меня не устроил, поскольку проблемы с cURL Lite были связаны не с полной реализацией, а с очевидными ошибками, которые необходимо было устранить.
Поэтому вместо того, чтобы писать обходной путь и работать над своим собственным кодом, я решил посмотреть, что происходит с cURL Lite. Основной рассматриваемый здесь файл — CurlLite.php. Этот файл находится в папке google-cloud-sdk/platform/google_appengine/php/sdk/google/appengine/runtime после установки Cloud SDK. Здесь задействованы и другие файлы, такие как CurlLiteStub.php , но в основном они предназначены для предоставления функций curl_* среде выполнения PHP и сопоставления их с cURL Lite, поэтому я не буду касаться этого здесь.
Первая проблема, которую я рассмотрю, заключается в том, что curl_error() всегда возвращает значение, даже если все было успешно (или даже не выполнено). Следующий фрагмент кода показывает это…
В среде App Engine это вернется как…
PHP-среды, не относящиеся к App Engine, и реальное расширение cURL будут вместо этого выводить следующий вывод…
Это значительно нарушает обработку ошибок в местах, которые фактическая строка ошибки сравнивается. Так было в библиотеке Twitter, которую я использовал. Я бы сказал, что такой подход к проверке ошибок является плохой практикой, и вместо этого следует использовать curl_errno() , который корректно работает в GAE. Тем не менее, cURL Lite не должен вносить такое изменение кода в поведение важной функции.
Вышеприведенное вызвано этой строкой в CurlLite.php:179 …
Упс! Это оплошность, и я сделал ошибки похуже, и эту я могу пропустить. Так двигаться дальше!
Следующая проблема, которую я обнаружил, заключалась в том, что cURL Lite всегда возвращал «URL не задан!» как ошибка, даже при успешных выборках. На отслеживание этого потребовалось больше времени, и это было связано с ошибкой и нарушением логики в setOption() в CurlLite.php .
Следующий код воспроизводит ошибку…
В App Engine вывод —
В то время как среды PHP без App Engine и реальное расширение cURL выдают —
Boo. Я установил URL! Так почему ты лжешь мне cURL Lite!?
Что ж, код ошибки и сообщение связаны с функцией setRequestUrl() в CurlLite. php , но это не виновник, это просто мессенджер!
В приведенном выше коде нет ничего плохого, и ясно, как мы можем получить условие, при котором «URL не задан!» Ошибка устанавливается. Хотя я не большой поклонник того, как называется tryGetOption() , я бы сам объявил $value как false .
Теперь к настоящей ошибке. Обратите внимание, что setRequestUrl() не принимает никаких параметров функции, вместо этого использует tryGetOption() для получения значения URL. Теперь, если мы перейдем к setOption() , который вызывается при вызове curl_setopt_array() , он сразу же вводит оператор switch , а затем мы получаем этот код…
Что это? $value передается в setRequestUrl() , но он не принимает его! Очевидный баг очевиден. Само по себе это не вызывает setRequestUrl() к ошибке, но есть дополнительная логическая ошибка!
Сразу после этого switch оператор, который я только что обсуждал, есть эта строка…
Это устанавливает значение URL в правильном индексе CURLOPT_URL, который ищет setRequestUrl() , но так как он установлен после вызова setRequestUrl() уже слишком поздно, и к этому моменту сообщение об ошибке и код ошибки уже установлены, а состояние ошибки сеанса cURL отравлено. Поскольку состояние ошибки не сбрасывается во время сеанса, cURL Lite всегда возвращает ошибку.
Теперь есть способ обойти это. Хитрость заключается в проверке возвращаемого значения curl_exec() . Если установлено значение false , произошла ошибка, в остальном у нас все хорошо. Для этой проверки необходимо использовать идентичный оператор === .