- ssl — Curl не работает из PHP на Nginx и localhost
- Решение
- PHP Curl не работает на localhost?
- 6 ответов
- curl: (7) не удалось подключиться к хосту Что не так в моих настройках?
- 3 ответа
- PHP CURL вдруг не работает без причины
- 3 ответа
- Решение проблемы с работой модуля cURL на PHP 5.6.1, PHP 5.5.17 и выше (на Windows)
- Как узнать, работает ли у вас cURL?
- Fatal error: Call to undefined function curl_multi_init() in …
- 2 thoughts to “Решение проблемы с работой модуля cURL на PHP 5.6.1, PHP 5.5.17 и выше (на Windows)”
ssl — Curl не работает из PHP на Nginx и localhost
Когда я отправляю запрос Curl из локального PHP-скрипта на локальный сервер через SSL (с nginx 1.9.4 в Windows через WPN-XM), браузер «ждет», пока не получит ошибку 504. PHP-fpm, вероятно, мертв, потому что веб-сервер не обрабатывает любой другой запрос.
Когда я отправляю тот же запрос на производственный сервер, он работает правильно.
Когда я отправляю запрос Curl из командной строки, тогда он работает.
Когда я открываю последний ресурс в веб-браузере, он работает.
Я потратил 4 часа на поиски и поиски Stac Owerflow, но не нашел другой ситуации, как у меня.
Решение
Этот сценарий не будет работать с конфигурацией по умолчанию WPN-XM v0.8.6,
потому что есть только один процесс php-cgi, слушающий в фоновом режиме, но вашему примеру нужны (как минимум) два из них. php-cgi уже используется сценарием, выполняющим запрос curl, поэтому Nginx не может переслать его в php-cgi. Это означает, что вы сначала столкнетесь с пустой страницей с индикатором загрузки, а затем выберете время ожидания соединения.
Основная проблема заключается в том, что php-cgi не запускает автоматически новые процессы (когда это необходимо). Вопрос обсуждается здесь: https://github.com/WPN-XM/WPN-XM/issues/323
Есть два решения:
- использовать инструмент для порождения серверов, как
- https://github.com/WPN-XM/php-cgi-spawner/releases
- или же spawn-fcgi от http://www.lighttpd.net/ проект для начала php-cgi
- или запустите больше процессов php-cgi и настройте балансировку нагрузки nginx / исходящий пул
Обновление 03-2016:
Чтобы решить ситуацию со стеком WPN-XM, я добавил php-cgi-spawn\spawn.exe по умолчанию. Это позволяет создавать несколько PHP
Демоны. Спавнер будет использоваться в версии PHP ниже v7.1.
В PHP v7.1 это решение будет реализовано и обеспечит лучшую FCGI
Мультиплексирование из коробки.
мицелий-FCGI
Первое решение является модификацией start.bat , Вы бы просто поместили spawn-fcgi перед php-cgi, вот так:
spawn-fcgi -f «%_dir%\php-cgi.exe» -a 127.0.0.1 -p 9100 -C 6 -F 4 -P «%_dir%..\temp\php.pid»
Я понятия не имею, где скрывается этот инструмент, возможно, где-то есть отдельная загрузка, но, возможно, это часть дистрибутива lighttpd для Windows.
Я думаю, что я скомпилирую его из исходного кода и сделаю его доступным для WPN-XM.
php upstream pool
Второе решение требует двух небольших шагов для запуска и работы пула PHP.
Первым шагом является изменение start.bat файл для запуска нескольких демонов php-cgi, каждый из которых прослушивает свой порт. Добавим еще несколько запусков php-cgi:
Следующим шагом является изменение server\bin\nginx\conf\nginx.conf и активировать php_pool вместо того, чтобы использовать единственный восходящий.
Просто искать fastcgi_pass php; и изменить его на fastcgi_pass php_pool; ,
Это изменение активирует следующий восходящий пул, который уже определен:
Источник
PHP Curl не работает на localhost?
Я использую MAMP Pro 1.9.4 на Mac OSX
В phpinfo() я вижу, что curl включен
Мой скрипт предназначен для геокодирования lat из Google apis. Он работает онлайн на моем сервере хостинг-провайдеров, но не на localhost .. ПОЧЕМУ?
6 ответов
Вероятно, это проблема брандмауэра. Curl по умолчанию пытается использовать порт 1080, который, вероятно, не открыт на вашем локальном хосте /маршрутизаторе /ISP.
Дело не в прокси, а в том, как использовать googleapis.
Добавьте CURLOPT_SSL_ on свой код и установите его в false
Вам может потребоваться установить версию SSL и соответствующий шифр для $ch :
Точные параметры вы можете передать в CURLOPT_SSLVERSION : http://php.net/manual/en/function.curl-setopt.php
Кроме того, следующие сообщения могут отображать ошибки, связанные с версиями SSL, которые используются для точного определения конфликта версий:
Если в MAMP вы получаете ошибки при подключении к узлам HTTPS, просто установите этот параметр:
curl_setopt ($ ch, CURLOPT_SSLVERSION, 3);
Эквивалент по командной строке:
У вас действительно есть бинарный файл curl ? Вы можете установить библиотеку curl с PHP без фактического наличия curl двоичный файл в вашей системе. Перейдите в приглашение оболочки и введите curl . (Если это стандартно для OSX, то, пожалуйста, прости мое невежество — я не парень Mac)
Если вы находитесь за прокси-сервером, попробуйте добавить, например, CURLOPT_PROXY (если ваш прокси-сервер находится на 192.168.1.2 порту 3128 ):
Источник
curl: (7) не удалось подключиться к хосту Что не так в моих настройках?
Когда я запускаю команду:
Я получаю такую ошибку:
Далее, когда я запускаю команду curl с подробным флагом, т.е.
Это заканчивается ошибкой:
Я действительно не могу понять, почему эта ошибка происходит. Что не так в моих настройках? Как я могу это исправить?
3 ответа
Очевидно, ваш сервер не прослушивает порт 9201 .
Вы должны сначала проверить это, если ваш сервер успешно начал слушать на указанном вами порту. Как yudong shen, вы можете использовать команду netstat для проверки этого.
Чтобы перечислить все пары вместе с их состоянием и соответствующим процессом:
Наблюдайте за столбцами Local address , State и PID/Program name , чтобы идентифицировать ваш процесс и его обозначенный с состоянием.
Чтобы проверить, используется ли назначенный порт процессом независимо от его состояния:
Чтобы убедиться, что порт открыт для прослушивания:
Вы также можете использовать клиент REST, например Почтальон Google Chrome взаимодействовать с вашим веб-сервером из графического интерфейса.
Другой причиной может быть неправильная настройка в /etc/hosts ; если нет строки, аналогичной
localhost не будет преобразован в 127.0.0.1 .
В моем случае я не смог открыть хост, обслуживаемый Apache.
Этот ответ отсутствует
Добавление 127.0.0.1 localhost в /etc/hosts решило проблему.
Служба, к которой вы пытаетесь подключиться, чтобы быть недоступной, является первой проверкой, которую вы должны сделать. Тем не менее, в моем случае, он работал и получил странную ошибку:
Почему не тот порт ?! Ну man curl описывает флаг -v , так что давайте использовать его:
И теперь мы можем смириться с тем, что у нас нет прокси-сервера.
Источник
PHP CURL вдруг не работает без причины
В настоящее время я работаю над проектом, который выполняет ajax-вызов моего API на том же сервере. Все шло хорошо, пока несколько часов назад cURL внезапно перестал работать без причины , и это выдает мне следующую ошибку
Но это не имеет никакого смысла, потому что это работало ранее, и единственное, что я изменил, было что-то на экране входа в систему (только PHP) и часовой пояс на сервере по умолчанию на «Европа / Берлин» с
Я уже перезапустил apache2, перезагрузил сервер, проверил файл php.ini и мой phpinfo, все без ошибок и изменений, но curl просто не будет работать. Я пытался свернуть другие хосты и localhost, но ничего не работает. Я также проверил / var / mail / root, ошибок нет.
Немного информации на мой сервер
- Debian 8
- Сертификат SSL от Symantec
- полный root-доступ без каких-либо ограничений
Это код cURL, который я использую
Как я уже сказал, он работал нормально и без проблем дольше 1 месяца. Это самая странная вещь, которую я когда-либо видел. Я надеюсь, что кто-нибудь может мне помочь. Если нет, есть ли хорошие альтернативы скручиванию? (POST — запросы)
3 ответа
Спасибо всем за помощь, но я нашел ошибку. Проблема заключалась в следующем:
curl не работал с протоколом https, потому что в папке с библиотеками была битая ссылка / файл. Если curl не работает для вас, проверьте с curl —version , если вы получаете следующую ошибку:
Если да, перейдите на /usr/local/lib и удалите обе libcurl ссылки / файлы. Это решило проблему для меня. После этого просто перезапустите apache2, и он должен снова заработать.
Обратите внимание, что это решило проблему только для меня, и это не глобальная проблема. Так что будьте в курсе того, что вы удаляете на своем сервере. Всегда делайте резервную копию!
Я узнал, что по какой-то причине мой сервер обновился с PHP 7.3 до PHP 7.4. Я фактически понизил до 7.3, потому что тот, кто скомпилировал эту копию 7.4, испортил компиляцию до такой степени, что любому здравомыслящему человеку было бы неловко выходить на национальное телевидение без штанов. Перезагрузка сервера не требуется.
Я поймал проблему, потому что я реализовал обнаружение через function_exists() для некоторых важных функций PHP после того, как я обнаружил эту абсолютно ужасную копию PHP.
Поэтому убедитесь, что вы используете несколько версий PHP, чтобы ваш сервер не решил вслепую обновиться до более новой и неполной (скомпилированной) версии.
Одна вещь, которая может сделать проблему
curl_setopt($ch, CURLOPT_POST, count($params));
Попробуйте определить так:
curl_setopt($ch, CURLOPT_POST, true);
Вот одна настройка, которая прекрасно работает для меня:
Но обратите внимание: CURLOPT_HTTPHEADER в этом примере настроен для принятия JSON.
Также http_build_query может исправить некоторые проблемы с анализом в ваших данных. Не важно использовать, но может помочь.
Источник
Решение проблемы с работой модуля cURL на PHP 5.6.1, PHP 5.5.17 и выше (на Windows)
Те, кто использует cURL, после обновлений на 5.6.1, 5.5.17 столкнулись с тем, что модуль cURL перестал работать. Проблема с тех пор не исчезла. Даже в последней на сегодняшней момент версии PHP 5.6.4 эта проблема сохранилась.
Как узнать, работает ли у вас cURL?
Создайте php файл и скопируйте туда:
Откройте его с сервера. Если на выходе что-то вроде:
Значит с cURL всё в порядке, если вместо этого ошибка PHP, значит проблема существует.
Во-первых, конечно же проверьте файл php.ini, найдите там строчку
И убедитесь, что перед ней не стоит точка с запятой.
Если всё так, а cURL не работает, то можно провести ещё один тест, для подтверждения необычности ситуации. Создайте ещё один php файл с содержанием:
Через поиск в браузере найдите cURL, если совпадение всего одно, значит модуль cURL не загружен:
При этом и Apache и PHP работают как обычно.
- Способ первый (не кошерный). Если у вас PHP 5.6.*, то возьмите версию PHP 5.6.0, оттуда возьмите старый файл php_curl.dll и замените его вместо вашего нового из версии, например, PHP 5.6.4. Для тех, у кого PHP 5.5.17 и выше, нужно взять этот же файл из PHP 5.5.16 и также его заменить. Проблема здесь одна — найти эти старые версии. Можно, конечно, покавыряться в http://windows.php.net/downloads/snaps/php-5.6, но лично я там не нашёл того, что мне нужно. Да и само решение какое-то не совсем кошерное.
- Способ второй (очень быстрый, но тоже не кошерный). Из каталога PHP скопировать файл libssh2.dll в каталог Apache24bin и перезапустить Apache.
- Способ третий (кошерный — кошерные люди аплодируют стоя). Нужно добавить вашу PHP директорию в PATH. Как это сделать очень хорошо расписано в официальной документации.
Вуаля, секция cURL на месте.
Почему так? Откуда взялась эта проблема? Ответа на этот вопрос нет, хотя уже описан механизм её возникновения.
Проблема связана, вроде, с тем, что 5.6.1 должен был выпущен с обновлённым libcurl 7.38.0. Но это доподлинно не известно, авторы PHP кивают на Apache, мол это там какие-то баги.
Механизм возникновения проблемы: если в системную PATH не включён каталог PHP, то когда служба Apache запускается, она не способна найти новый dll (libssh2.dll), который является зависимостью для php_curl.
Соответствующие баг репорты:
Fatal error: Call to undefined function curl_multi_init() in …
Вообще, проблемы с cURL на PHP были, кажется, если не всегда, то очень часто. В процессе гугления своей проблемы, я натыкался на темы, некоторым из которых было больше чем дюжина лет.
Кроме этого, гугление дало ещё несколько выводов:
В Интернете достаточно «инструкций для дибилов», в которых подробно, с картинками, рассказывают как раскомментировать строку extension=php_curl.dll в файле php.ini.
На официальном сайте PHP, в разделе по установке cURL, есть всего два предложения относительно системы Windows:
Для работы с этим модулем в Windows файлы libeay32.dll и ssleay32.dll должны существовать в системной переменной окружения PATH. Вам не требуется файл libcurl.dll с сайта cURL.
Я прочитал их десяток раз. Переключился на английский язык и прочитал ещё несколько раз на английском. С каждым разом всё больше убеждаясь, что эти два предложения написали животные, или кто-то просто попрыгал попой на клавиатуре — я не понимаю их смысла.
Ещё есть несколько каких-то сумасшедших советов и инструкций (некоторые я успел даже опробовать).
На сайте баг репортов ПХП я уже вплотную подобрался к разгадке, что нужно в системную переменную PATH включить каталог с PHP.
В общем, для тех, у кого проблема с cURL и кому нужно «в системную переменную PATH включить каталог с PHP», перейдите к уже названной выше инструкции http://php.net/manual/ru/faq.installation.php#faq.installation.addtopath. Там всё просто, а, главное, человеческим языком написано, что нужно сделать.
2 thoughts to “Решение проблемы с работой модуля cURL на PHP 5.6.1, PHP 5.5.17 и выше (на Windows)”
Способ второй (очень быстрый, но тоже не кошерный). Из каталога PHP скопировать файл libssh2.dll в каталог Apache24bin и перезапустить Apache.
Спасибо большое, второй способ очень быстро исправил проблему.
Источник