Существование файла (удалённо)

2People

Новичок
Существование файла (удалённо)

Мне надо проверить существование файла на удалённой машине.

fopen не подходит, т.к. если файла нет, то скрипт долго пытается достучаться до файла, т.е. мне надо что-то с возможностью выставлять лимит времени.

А точнее, мне надо определять наличие файла http://62.203.*.*:****/listen.pls и выводить в браузер состояние работы.

Мне бы что-то типа ftp_connect
 

2People

Новичок
Пробовал, не работает.
Если адрес вида 62.203.*.* работает, а на 62.203.*.*/listen.php нет.
 

2People

Новичок
Не работает (всегда выводит OFF.jpg):
PHP:
$ip=$ipend . "/listen.pls";
$login_result = fsockopen("$ip", $port);
if ($login_result=="" || $login_result==false) {
	readfile("OFF.jpg");
} else {
	readfile("ON.jpg");
}
(Я не спрашивал, рабочие ли не работают или утюги.)
(Если бы была ошибка, я бы её описал, а это не работает)
 

2People

Новичок
Работает так:
PHP:
$ip=$ipend;  //<= ИЗМЕНЕНО ТОЛЬКО ТУТ
$login_result = fsockopen("$ip", $port);
if ($login_result=="" || $login_result==false) {
	readfile("OFF.jpg");
} else {
	readfile("ON.jpg");
}
но мне это не надо, мне нужен именно файл.
 

alexhemp

Новичок
2People

Тебе нужно основы читать.

ip адрес и HTTP запрос - разные вещи.
Тебе нужно не просто установить соединение, но и послать HTTP запрос, Хотя-бы HEAD.
 

2People

Новичок
Автор оригинала: alexhemp
2People

Тебе нужно основы читать.

ip адрес и HTTP запрос - разные вещи.
Тебе нужно не просто установить соединение, но и послать HTTP запрос, Хотя-бы HEAD.
Типа того : Соединяюсь с сервером, а потом спрашиваю его про нужный мне файл. Смотрю что он мне ответит.

Спасибо.
 

Romeo

Новичок
Реализавл данную проблему так
PHP:
function fast_chec($url)
    {
        $c = curl_init($url);
        curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($c, CURLOPT_TIMEOUT, 2); // максимальное время отклика
        curl_setopt($c, CURLOPT_HEADER, 1);
        $page = @curl_exec($c);
        curl_close($c);
        $page = explode("\n", $page);
		echo $page["0"];
        if (eregi("200", $page["0"]))
        {
            return true; // Файл существует и доступен для скачивания
			
        }
        else
        {
			
            return false; // При любом другом ответе сервера отличного от 200
        }
    }
однако иногда даже если файл существует в $page["0"] возвращает
HTTP/1.1 302 Moved Temporarily
никак не могу понять в чем причина
 

dimagolov

Новичок
Romeo, ты про протокол http и коды статуса слышал что-нибудь? что делает броузер получив HTTP/1.1 302 Moved Temporarily представляешь?
 

Romeo

Новичок
fopen не годиться так как файл большой да и смысл его открывать если нужно проверить только его существование
 

Anarki

Новичок
fsockopen

-~{}~ 18.08.08 02:33:

И freadом читаешь до конца заголовков, курл счас не помню, может так делать или нет.
А 302(редирект) код обрабатывается элементарно strpost или preg_match в руки.
 

Farsh

~ on ~ high ~ wave ~
Romeo
А что по-вашему означает проверить существование , ну-ка? =)
Это и есть - получение только заголовков, не не контента .
Fopen не читает файл, а как раз таки делает подготовку к его чтению .
В общем разницы нет, способов куча .
Anarki
Если курлом - то CURLOPT_NOBODY в true и получаем всю нужную информацию о соединении через curl_getinfo() .
 

Romeo

Новичок
Проблема с HTTP/1.1 302 Moved Temporarily решаеться так
PHP:
curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);
кажалось бы добавить еще.как посоветовал Farsh
PHP:
curl_setopt($ch, CURLOPT_NOBODY, 1);
и все путем будет однако возниклапроблема на удаленном сервере стоит мод реврайт и если файла не существует то они выдает картинку и поэтому с включенным CURLOPT_NOBODY он выдает что файл существует. если же выключить то сценарий завершиться фатальной ошибкой, так как проверяемые файлы большие и не хватит памяти на выполнение скрипта
 

Anarki

Новичок
Смотри заголовки Content-Type и Content-Lenght и по ним ориентируйся. HINT: Если картинка, то они всегда одни и теже и известны.
 

Farsh

~ on ~ high ~ wave ~
если выдача картинки идет как редирект, то можно смотреть в сторону redirect_count из curl_getinfo()
 
Сверху