Консультация № 66408
10.12.2006, 21:21
0.00 руб.
0 9 3
Уважаемые эксперты, есть такая задача. Есть один сервер, на котором разрешено выполнять php скрипты (PHP 4.0). Есть и второй, на котором лежат только html страницы. На первом сервере представлен список ссылок на файлы (лежащие на втором). Каким образом можно определить, не устарели ли ссылки на втором сервере, т.е. существует ли там файл с указанным адресом? Думаю, что можно как-то отправить файлу некий заголовок и посмотреть, какой header вернет сервер, а потом сравнить, не соответствует ли он ошибке 404 ? (т.е. файл отсутствует).

Обсуждение

Неизвестный
10.12.2006, 21:37
общий
это ответ
Здравствуйте, Tatiana L!

Проверить, существует ли удаленный файл можно так:

$open=fopen("http://адрес_сайта/название_файла.html","r");
if (!$open) {
echo "Такой файл не найден";
exit;
}

Измените этот код так, как Вам нужно (в зависимости от того, какие действия Вы хотите запрограммировать, если файл не найден).
Неизвестный
10.12.2006, 21:44
общий
Спасибо, но есть другой нюанс: сайт на втором сервере могут закрыть, перенести, запаролить доступ и т.д., поэтому хотелось бы все-таки получить именно header, чтобы видеть, что пришло - 301, 302, 404, 403, 200 или любой другой ответ. Поэтому Ваш вариант не подходит, к сожалению
Неизвестный
11.12.2006, 00:52
общий
это ответ
Здравствуйте, Tatiana L!
Отвечая на ваш комментарий, между прочим если доступ к файлу "запаролен", то открыть его не удастся. Если его перенесли, то открыть его не удастся и т.д. Иными словами, открытие произойдет только в случае если код возврата 200.

А получить заголовок... Ну посылайте HTTP-запрос с помощью curl (полезная библиотека) и смотрите ответ.

Но мне кажется - это лишняя головная боль. Вашу задачу решает предложенный Денисом Сергеевичем способ.

Буду очень благодарен, если вы мне приведете пример, когда он не работает :)
Неизвестный
11.12.2006, 01:47
общий
это ответ
Здравствуйте, Tatiana L!
Вы совершенно правы, достаточно отправить заголовок и посмотреть ответ.


Приложение:
<?$link[]=‘http://1111111.narod.ru‘;$link[]=‘http://narod.ru‘;$link[]=‘http://www.antichat.ru/crackchat/HTTP/http.html‘;$link[]=‘http://ya.ru‘;foreach($link as $key => $value){$info=parse_url($value);$fp=@fsockopen($info[‘host‘],80,$error_nomer,$error_opisanie,60); if($fp) { fputs($fp,"GET ".$info[‘scheme‘].‘://‘.$info[‘host‘].(isset($info[‘path‘])?$info[‘path‘]:‘‘)." HTTP/1.0\r\n\r\n"); print ‘сайт <b>‘.$value.‘</b> ответил <b>‘.fgets($fp,25)."</b>
\n"; fclose($fp); } else { print "Произошла ошибка при открытии <b>$value</b> !
\n"; print "номер: $error_nomer
\n"; print "описание: $error_opisanie
\n"; }}?>
Неизвестный
11.12.2006, 02:03
общий
Почитайте вот тут - http://www.antichat.ru/crackchat/HTTP/http.html,Если файлы запаролят, то можно и пароль передать через сокеты и соответственно файл прочитать.Вообще по сравнению функциями ( fopen ) работы с файлами сетевые функции ( fsockopen ) работают на более низком уровне, что позволяет добиться большей гибкости и полного доступа к данным
Неизвестный
11.12.2006, 15:20
общий
Для Cimus - попробовала Ваш вариант, получаю на все файлы одинаковое сообщение: Произошла ошибка при открытии !номер: 10060описание: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера. Пробую на локальной машине, установлен Денвер, подключение к Интернету через VPN провайдера. Может, на localhost это не работает?
Неизвестный
11.12.2006, 18:15
общий
Я написал пример используя localhost и всё работало отлично, проверте разрешены ли сокеты в php.ini.
Неизвестный
11.12.2006, 20:09
общий
Спасибо.Я смутно представляю, как должны быть разрешены сокеты php.ini. Поиск в этом файле по слову socket показал: default_socket_timeout = 60extension=php_sockets.dllmysql.default_socket =[Sockets]; Use the system read() function instead of the php_read() wrapper.sockets.use_system_read = OnЭто все, или я что-то не нашла?P.S. Попробовала загрузить на и-нетовский сервер - получила ошибку с номером 0, единственная разница - в скорости выпадения ошибок, на localhost гораздо медленнее.
Неизвестный
11.12.2006, 23:27
общий
Всем спасибо.Рабочий вариант: $info=parse_url($valueURL); echo ‘
<b><i>‘.$valueURL.‘</b></i> - ‘; $fsoc = fsockopen($info[‘host‘],80); fputs($fsoc,"HEAD ".(isset($info[‘path‘])?$info[‘path‘]:‘/‘)." HTTP/1.0\nHost: ".$info[‘host‘]."\n\n"); echo fgets($fsoc,1000); fclose($fsoc);
Форма ответа