Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Скачивание файла

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: Не могу скачать файл по ссылке
culver
Отправлено: 06 Июля, 2010 - 17:25:37
Post Id


Новичок


Покинул форум
Сообщений всего: 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
Ошибка!
Что я не так делаю?
 
 Top
JustUserR
Отправлено: 06 Июля, 2010 - 17:38:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 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/
 
 Top
Champion Супермодератор
Отправлено: 06 Июля, 2010 - 18:14:26
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




1 - JustUserR уже написал;
2 - dns_get_record ('www.nic.ru') что скажет?
3 - вообще сервер, на которов работает скрипт к чему-нибудь по имени может обратиться?
 
 Top
JustUserR
Отправлено: 06 Июля, 2010 - 18:28:12
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Champion пишет:
Вообще сервер, на которов работает скрипт к чему-нибудь по имени может обратиться
Вероятно на хостинге вообще заблокировали обращение из PHP-скриптов к соответствующей системной улитите распознавания хостов Как варианты обхода можно попробовать напрямую подклчиться через socket-ы по 53 порту к определенному DNS-серверу какого-нибудь интернет-провайдера - а если firewall-ом заблокирована и такая возможность то можно попробовать узнавать имена через сторонние web-сервсисы


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
culver
Отправлено: 06 Июля, 2010 - 18:44:25
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Июль 2010  


Помог: 0 раз(а)




Что-то странное происходит. Из другого компа (тоже Win, Apache2.2) попробовал fopen - файл закачался. Правда fgetcsv не правильно выбрал кодировку, но это уже другой вопрос.
А на dns_get_record ('www.nic.ru') ругается "Удалённый сервер или файл не найден".
Предполагаю, что настройки разные, но что могло помешать закачаться на первом компе?
 
 Top
ALEN
Отправлено: 06 Июля, 2010 - 18:48:31
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




culver
Вам уже объяснили...

Используйте curl - он надежней в вашем случае!
 
 Top
Champion Супермодератор
Отправлено: 06 Июля, 2010 - 19:05:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




а без php просто если ping на этом компе выполнить?
 
 Top
ALEN
Отправлено: 06 Июля, 2010 - 19:09:35
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




Champion
да 99% что для php запретили такие деяния... ему нужно curl использовать, а fopen тут использовать аморально!
 
 Top
culver
Отправлено: 06 Июля, 2010 - 23:06:07
Post Id


Новичок


Покинул форум
Сообщений всего: 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";
?>

Файл то создаётся, но пустой. Опять что-то пропустил, подскажите пожалуйста. Может проблема в параметрах запроса?
 
 Top
JustUserR
Отправлено: 07 Июля, 2010 - 14:38:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




culver пишет:
Файл то создаётся, но пустой. Опять что-то пропустил, подскажите пожалуйста. Может проблема в параметрах запроса?
В вашем приведенном PHP-скрипте если функция curl_exec и возвращает требуемое содержимое удаленного файла - то вы никуда его не сохраняете и вам нужно сначала его положить возвращенное значение в переменную а потом из этой переменной записать данные в файл Кроме того следует проверить успешно ли получилось CURL-ом соединиться с удаленным web-сервером - для этого можно посмотреть значение возвращаемое функцией http://php.su/functions/?curl_error


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
culver
Отправлено: 07 Июля, 2010 - 14:52:05
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Июль 2010  


Помог: 0 раз(а)




А резве строка

curl_setopt($ch, CURLOPT_FILE, $fp);

не обеспечивает сохранение файла в потоке $fp?
 
 Top
JustUserR
Отправлено: 07 Июля, 2010 - 15:07:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 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/
 
 Top
culver
Отправлено: 07 Июля, 2010 - 15:17:16
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Июль 2010  


Помог: 0 раз(а)




Да, Вы правы, ошибка 6. Эта проблема решаема?
 
 Top
JustUserR
Отправлено: 07 Июля, 2010 - 15:32:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 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/
 
 Top
culver
Отправлено: 07 Июля, 2010 - 15:42:12
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Июль 2010  


Помог: 0 раз(а)




Большая вероятность, что исходящие соединения от PHP-скрипта блокируются firewall-ом (частная компания). Даже запуск кода:
PHP:
скопировать код в буфер обмена
  1. $ch = curl_init('http://php.su');
  2. curl_setopt  ($ch, CURLOPT_HEADER, true);
  3. curl_exec($ch);
выдаёт 6 ошибку. В то же время браузер работает спокойно.
Можно обмануть firewall?
(Добавление)
Сделал так:
PHP:
скопировать код в буфер обмена
  1. $ch = curl_init('http://php.su');
  2. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1');
  3. $headers = array
  4. (
  5.     'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8',
  6.         'Accept-Language: ru,en-us;q=0.7,en;q=0.3',
  7.         'Accept-Encoding: deflate',
  8.         'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7'
  9. );
  10. curl_setopt($ch, CURLOPT_COOKIEJAR, "my_cookies.txt");  
  11. curl_setopt($ch, CURLOPT_COOKIEFILE, "my_cookies.txt");
  12. curl_setopt($ch, CURLOPT_PORT, 8080);
  13. curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
  14. curl_setopt  ($ch, CURLOPT_HEADER, true);
  15. curl_exec($ch);

Не ведётся. Что ещё можно попробоавать?


Отредактировано модератором: JustUserR, 07 Июля, 2010 - 16:00:35
Обрамил PHP-коды в соответствующий BB-тег
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB