Покинул форум
Сообщений всего: 20
Дата рег-ции: Июль 2010
Помог: 0 раз(а)
Помогите пожалуйста новичку.
Уесть ссылка на файл: http://www[dot]nic[dot]ru/auction/freein[dot][dot][dot]t[dot]cgi?format=csv
При вводе её в броузере, броузер закачивает файл: domain_list.csv
При попытке выполнения кода:
$f = fopen("http://www.nic.ru/auction/freeing/list.cgi?format=csv", "rb") or die("Ошибка!");
Выскакивают строки:
Warning: fopen() [function.fopen]: php_network_getaddresses: getaddrinfo failed: Этот хост неизвестен. in C:\Apache2.2\htdocs\pars.php on line 3
Warning: fopen(http://www.nic.ru/auction/freeing/list.cgi?format=csv) [function.fopen]: failed to open stream: php_network_getaddresses: getaddrinfo failed: Этот хост неизвестен. in C:\Apache2.2\htdocs\pars.php on line 3
Ошибка!
Что я не так делаю?
JustUserR
Отправлено: 06 Июля, 2010 - 17:38:35
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
culver пишет:
Warning: fopen() [function.fopen]: php_network_getaddresses: getaddrinfo failed: Этот хост неизвестен. in C:\Apache2.2\htdocs\pars.php on line 3
Во-первых для доступа к внешим файлам не следует использовать url-fopen-оболочки поскольку во многих случаях это приведет к неявным ошибкам - ведь для запроса файлов нужно посылать набор соответствующих HTTP-заголовков и автоматизация процесса может привести к неправильной кодировке или отсутствию cookie для поддержания сессии - поэтому лучше использовать CURL или fsockopen
Во-вторых конкртная проблема заключается в том что PHP-интерпретатор не может обратиться к DNS-серверу для получения IP-адреса хоста - если он вам известен то сформируйте запрос с помощью fsockopen с явным указанием IP-адреса и HTTP-заголовком Host для указания имени виртуального хоста
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Champion
Отправлено: 06 Июля, 2010 - 18:14:26
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
1 - JustUserR уже написал;
2 - dns_get_record ('www.nic.ru') что скажет?
3 - вообще сервер, на которов работает скрипт к чему-нибудь по имени может обратиться?
JustUserR
Отправлено: 06 Июля, 2010 - 18:28:12
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Champion пишет:
Вообще сервер, на которов работает скрипт к чему-нибудь по имени может обратиться
Вероятно на хостинге вообще заблокировали обращение из PHP-скриптов к соответствующей системной улитите распознавания хостов Как варианты обхода можно попробовать напрямую подклчиться через socket-ы по 53 порту к определенному DNS-серверу какого-нибудь интернет-провайдера - а если firewall-ом заблокирована и такая возможность то можно попробовать узнавать имена через сторонние web-сервсисы
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
culver
Отправлено: 06 Июля, 2010 - 18:44:25
Новичок
Покинул форум
Сообщений всего: 20
Дата рег-ции: Июль 2010
Помог: 0 раз(а)
Что-то странное происходит. Из другого компа (тоже Win, Apache2.2) попробовал fopen - файл закачался. Правда fgetcsv не правильно выбрал кодировку, но это уже другой вопрос.
А на dns_get_record ('www.nic.ru') ругается "Удалённый сервер или файл не найден".
Предполагаю, что настройки разные, но что могло помешать закачаться на первом компе?
ALEN
Отправлено: 06 Июля, 2010 - 18:48:31
Участник
Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008 Откуда: Крым
Помог: 11 раз(а)
culver
Вам уже объяснили...
Используйте curl - он надежней в вашем случае!
Champion
Отправлено: 06 Июля, 2010 - 19:05:31
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
а без php просто если ping на этом компе выполнить?
ALEN
Отправлено: 06 Июля, 2010 - 19:09:35
Участник
Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008 Откуда: Крым
Помог: 11 раз(а)
Champion
да 99% что для php запретили такие деяния... ему нужно curl использовать, а fopen тут использовать аморально!
culver
Отправлено: 06 Июля, 2010 - 23:06:07
Новичок
Покинул форум
Сообщений всего: 20
Дата рег-ции: Июль 2010
Помог: 0 раз(а)
Весь вечер изучал curl, пробовал по разному. Остановился на самом, на мой взгяд, правдоподобном варианте:
<?php
ini_set('max_execution_time',600);
$fileName='domain_list.csv';
$host='http://www.nic.ru/auction/freeing/list.cgi?format=csv';
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $host);
$fp=fopen($fileName,"w+");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_REFERER, $host);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_exec ($ch);
curl_close ($ch);
fclose ($fp);
echo "File downloaded";
?>
Файл то создаётся, но пустой. Опять что-то пропустил, подскажите пожалуйста. Может проблема в параметрах запроса?
JustUserR
Отправлено: 07 Июля, 2010 - 14:38:40
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
culver пишет:
Файл то создаётся, но пустой. Опять что-то пропустил, подскажите пожалуйста. Может проблема в параметрах запроса?
В вашем приведенном PHP-скрипте если функция curl_exec и возвращает требуемое содержимое удаленного файла - то вы никуда его не сохраняете и вам нужно сначала его положить возвращенное значение в переменную а потом из этой переменной записать данные в файл Кроме того следует проверить успешно ли получилось CURL-ом соединиться с удаленным web-сервером - для этого можно посмотреть значение возвращаемое функцией http://php.su/functions/?curl_error
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
culver
Отправлено: 07 Июля, 2010 - 14:52:05
Новичок
Покинул форум
Сообщений всего: 20
Дата рег-ции: Июль 2010
Помог: 0 раз(а)
А резве строка
curl_setopt($ch, CURLOPT_FILE, $fp);
не обеспечивает сохранение файла в потоке $fp?
JustUserR
Отправлено: 07 Июля, 2010 - 15:07:43
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
culver пишет:
А резве строка curl_setopt($ch, CURLOPT_FILE, $fp); не обеспечивает сохранение файла в потоке $fp?
Да обеспечивает просто данную стороку я не заметил - и раз данный файл успешно создается хоят при этом является пустым по проблема с правами доступа в данном случае тоже не имеется Тем не менее после совершения операции curl_exec вам следует запустить функцию http://php.su/functions/?curl-errno для просмотра номера ошибки - и если таковая возникла то вы можете посмотреть ее описание здесь http://curl[dot]haxx[dot]se/libcurl/c/li[dot][dot][dot]curl-errors[dot]html
В вашем случае вероятно должна возникать ошибка с номером 6 - что означает что PHP не может распознать IP-адрес удаленного хоста по его имени по причине отсутствия доступа к DNS-серверу
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
culver
Отправлено: 07 Июля, 2010 - 15:17:16
Новичок
Покинул форум
Сообщений всего: 20
Дата рег-ции: Июль 2010
Помог: 0 раз(а)
Да, Вы правы, ошибка 6. Эта проблема решаема?
JustUserR
Отправлено: 07 Июля, 2010 - 15:32:09
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
culver пишет:
Да, Вы правы, ошибка 6. Эта проблема решаема?
В принципе проблема должна быть решаемой в зависимости от того что является конкретной причиной ее появления - конечно например если на вашем хостинге запрещены исходящие соединения от PHP-скриптом и они блокируются firewall-ом - то даже установка IP-адреса удаленного хоста вручную не приведет к успеху и просто ошибка распознавания хоста смениться ошибкой подклчения к этому хосту
В остальных случаях если причиной является именно невозможность доступа к DNS-серверу то проблема решается достаточно легко - самый простой случай это определить IP-адрес удаленного хоста заранее и обращаться к нему с помощью функции fsockopen с указанием в соответствующем HTTP-запроса имя виртуального хоста Данный подход не очень хорош именно привязкой к IP-адресу - поэтому вы можете попытаться обратиться к одному из доступных DNS-серверов с целью ручного определения соответствующего IP-адреса - это делается путем запроса на 53 порт по протоколу описанному здесь http://tools[dot]ietf[dot]org/html/rfc1035 в секции 4.2 Можно также попобовать сделать консольный вызов программы nslookup HOST NS-SERVER с указанием соответствующих полей
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
culver
Отправлено: 07 Июля, 2010 - 15:42:12
Новичок
Покинул форум
Сообщений всего: 20
Дата рег-ции: Июль 2010
Помог: 0 раз(а)
Большая вероятность, что исходящие соединения от PHP-скрипта блокируются firewall-ом (частная компания). Даже запуск кода:
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.