#php #apache #curl #apache2
#php #apache #curl #apache2
Вопрос:
У меня есть PHP-скрипт, который использует cURL для доступа к файлу, также расположенному на моем сервере (установлена программа email-маркетинга). Я написал быстрый скрипт для тестирования моей установки cURL, и он завершается с ошибкой при указании на файл на моем собственном сервере. Скрипт:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.mysite.com/test.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec($ch);
if($contents) {
echo $contents;
} else {
$err = curl_error($ch);
echo $err;
}
curl_close($ch);
Когда я запускаю этот код, он возвращает ошибку: не удалось подключиться к хосту
Если я изменю URL на http://www.google.com или любой другой сайт, он работает просто отлично. Кроме того, когда я пытаюсь открыть определенную страницу через cURL на другом сервере, все работает так, как должно. Предположения, которые я делаю из этих тестов, заключаются в том, что PHP cURL установлен и (вроде как) работает, и что проблема не в странице, которую пытаются открыть.
Я подумал, что это может быть проблема с портом, поэтому я попытался указать порт с тем же результатом (не подключаясь к хосту). Я пытался как curl_setopt
, так и http://www.mysite.com:80/
указать порт, который, как я знаю, открыт.
Это наводит меня на мысль, что проблема кроется в моей установке apache, но я не эксперт по apache и весь день безрезультатно бился головой о Google. Есть идеи, что может вызвать такой конкретный сбой cURL?
Комментарии:
1. Вы когда-нибудь решали это? У меня точно такая же проблема, скрипт на моем собственном сервере работает нормально, когда я получаю доступ через браузер, но когда я запускаю cURL для доступа к нему из поддомена, он завершается ошибкой 7.
Ответ №1:
Столкнулся с той же проблемой, когда мое доменное имя не разрешалось на сервере, что приводило к сбою CURL
запросов к самому себе.
Моя проблема заключалась в том, что мой веб-сервер не мог разрешить проблему самостоятельно из-за некоторых правил брандмауэра (перед веб-сервером установлен балансировщик нагрузки, который блокировал трафик с сервера).
Другими словами, выполнив следующую команду на моем сервере
curl -I http://www.mywebserver.com
в результате:
$ curl -I http://www.mywebserver.com
curl: (7) couldn't connect to host
Обновление файла /etc / hosts на сервере для сопоставления доменного имени с локальным IP-адресом решило проблему, и fopen
и curl
изнутри мои скрипты снова заработали.
Комментарии:
1. Я знаю, что этот вопрос был некоторое время назад, но я хотел дать вам положительный отзыв, поскольку это было решение, которое сработало для меня после целого дня выдергивания волос.
2. большое вам спасибо, спустя долгое время это сработало и у меня. У меня был тайм-аут cURL на wordpress каждый раз, когда он пытался получить доступ к api, но query monitor сообщал, что это какая-то ошибка ssl, хотя я мог скручивать URL-адреса https с терминала. Затем я решил попробовать свой собственный домен, и время ожидания также истекло, это было странно, поскольку я мог получить доступ к WP API просто отлично через браузер, оказывается, единственное, что нужно было добавить запись в файл hosts для домена с локальным IP. После этого все заработало.
Ответ №2:
Вы можете выполнить пинг www.mysite.com
?
Проверьте свой /etc/ hosts … возможно, для www.mysite.com
указан неправильный IP.
Ответ №3:
Попробуйте открыть http://www.mysite.com/test.php
в веб-браузере. Если это работает, то проблема в cURL. Если это не так, то проблема либо в вашей сети, либо в конфигурации apache.
Вы можете проверить конфигурацию вашего apache, убедившись, что он запущен в вашей системе. Затем попробуйте telnet <apache server ip> 80
из командной строки. После подключения попробуйте выполнить следующее:
GET /test.php HTTP/1.1
Host: www.mysite.com
<2 line breaks>
Если вы получаете ответ от apache, то это звучит как проблема с сетью. Убедитесь, что mysite.com преобразуется в IP-адрес вашего сервера apache, и трафик с порта 80 может поступать на ваш сервер. Это также может быть проблема с обратной маршрутизацией, когда ваш маршрутизатор пытается отправить запрос на свой собственный ip-адрес (при условии, что ваш ящик apache находится за маршрутизируемым сетевым подключением, тем же подключением, что и вы).
Ответ №4:
Я также столкнулся с этим на удаленном веб-сервере. Запустив curl на этом компьютере, я не смог получить доступ к файлам, размещенным сервером apache на том же компьютере. Странно, что я мог получить доступ к файлу с помощью
curl -O http://example.com/file1.txt
но
curl -0 http://sub.example.com/file1.txt
не сработало.
Я решил проблему, добавив отсутствующую DNS-запись на DNS-сервер, работающий на компьютере. Похоже, nslookup
etc сначала взгляните на локальный DNS-сервер, прежде чем спрашивать кого-то еще. И поскольку локальный DNS-сервер ответил «не удается найти», curl
сдался.