Curl debug php: PHP — Debugging Curl — Stack Overflow

debian — в PHP отсутствуют cURL и XDebug после обновления

спросил

Изменено
4 года, 3 месяца назад

Просмотрено
495 раз

Я только что обновился до Ubuntu 18.04.1 LTS и пошел проверить свою локальную установку apache2, добавив phpinfo() в индексный файл.

Я не вижу записи для cURL или для XDebug.

Вот что я сделал:

  1. Опять же, я проверил phpinfo() и не показал никаких параметров curl или xdebug.
  2. Я перешел к /etc/php/7.1/apache2/php.ini и раскомментировал следующую строку extension=php_curl.dll.
  3. Затем я перезапустил apache.
  4. Кроме того, мой 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 , произошла ошибка, в остальном у нас все хорошо. Для этой проверки необходимо использовать идентичный оператор === .