Проверка доступности сайта!

salex

Новичок
Проверка доступности сайта!

Помогите! Уже упарися...
PHP-скрипт находится на сайте, он должен проверить доступен ли (жив, отвечает, пингуется и т.п.) другой сервер (например "php.net").
Ну никак не выходит, пробовал и exec и system и сокеты...
Как это сделать просто???
 

salex

Новичок
Вывод сообщений об ошибках включен. Но ошибок нет! Просто ничего... :(
Что не верно:
exec("ping php.net");
passthru("ping www.php.net");
$ping=popen("ping yandex.ru","r");
exec("ping -с 5 www.php.net", $ping);
system("ping -с 5 php.net", $ping);
и т.п...
В $ping - пустота!? :(

-~{}~ 05.11.05 15:45:

Что, никто не знает, как это делается? Или это вообще не возможно таким способом???

P.S. Еще раз поясню - этот PHP-скрипт находится на моем сайте (лежит на сервере у хостера), он должен проверять доступны ли сейчас в данный момент другие сервера (сайты по URL).
 

Profic

just Profic (PHP5 BetaTeam)
[m]proc_open[/m]()
PHP:
<?php
if (substr(PHP_OS, 0, 3) == 'WIN') {
    $ping = 'ping -n 5 ';
} else {
    $ping = 'ping -c 5 ';
}
$ping .= 'yandex.ru';
$ph = popen($ping, 'r') or die('popen() failed');
$output = '';
while ($buf = fgets($ph, 1024)) {
    $output .= $buf;
}
$ec = pclose($ph);
echo 'cmd: ' . $ping . '<br />';
echo 'exit code: ' . $ec . '<br />';
echo 'output:' . '<br />';
echo nl2br($output);
?>
 

salex

Новичок
УВЫ ВЫДАЕТ ТОЛЬКО:
> cmd: ping -c 5 yandex.ru
> exit code: 127
> output:
Причем в любом случае, как для существующик, так и нет! :(
Странно, да...
 

SiMM

Новичок
> Причем в любом случае, как для существующик, так и нет!
Даже для localhost'а и/или IP-сервера?
А ты вообще уверен, что у тебя разрешены исходящие соединения, а не запрещены файрволом хостера?
 

salex

Новичок
Да и для IP-сервера ничего не выдается - пустота. :(
Исходящие соединения вроде разрешены.
 

Krisha

pain in the neck
salex
ты уверен, что тебе нужно именно пинговать, может быть тебя просто интересует жив сайт или нет ?
 

salex

Новичок
Именно пинговать не обязательно.
Крайне необходимо проверить - доступен в данный момент сайт или нет!!!
P.S. Там (на других проверяемых сайтах) будут лежать изображения и проверка необходима, дабы не выдавать посетителям нерабочие в данный момент картинки.
 

Profic

just Profic (PHP5 BetaTeam)
Исходя из недавнего топика, safe_mode == On => кроссплатформенно попингать не выдет. Только под виндами.

-~{}~ 05.11.05 16:28:

Именно пинговать не обязательно.
Блин, с этого и надо было начинать :)
Либо как посоветовал Krisha, либо [m]fsockopen[/m](). Но первое думаю проще.
 

salex

Новичок
Т.е. пропинговать с одного сайта другой вообще не возможно?! Как же так? Странно...
Советуете делать проверку через fopen?
 

Profic

just Profic (PHP5 BetaTeam)
Невозможно в данном случае.
Наверное таки лучше fsockopen() если вернет false - недоступен.
 

salex

Новичок
И что же я теперь не вено делаю:
PHP:
$port=80;
$fp=fsockopen($host,$port);
if(!$fp){
 echo 'Сервер ', $host, ' не отвечает'; 
 }
 else{
  fputs ($fp, "HEAD ".$path." HTTP/1.0\r\nHost: ".$host."\r\n\r\n");
  $response = fgets($fp, 1024);
  print $response;
  }
Для любых $host всегда выдает HTTP/1.1 200 OK. :(
 

SiMM

Новичок
> Для любых $host всегда выдает HTTP/1.1 200 OK.
Так уж и для любых?
PHP:
$host = 'www.ya.ru';
$path = '/404';
 

salex

Новичок
Да. Самая глупость в том, что всегда выдает данные моего же сайта!
Сделал по другому:
PHP:
if(empty($host)){$host="www.site.ru";}; 
if(empty($path)){$path="/";}; 
if(empty($port)){$port=80;}
print "host=".$host."<br>\n";
print "port=".$port."<br>\n";
$hostbyname=gethostbyname($host);
print "gethostbyname(".$host.")=".$hostbyname."<br>\n";
$hostbyaddr=gethostbyaddr($hostbyname);
print "gethostbyaddr(".$hostbyname.")=".$hostbyaddr."<br>\n";
print "<hr>\n";
$fp=fsockopen($host,$port,&$errno,&$errstr);
if(!$fp){
 echo "$errstr ($errno)<br>\n";
 }else{
  fputs($fp,"GET / HTTP/1.0\n\n");
  while(!feof($fp)) {
   echo fgets($fp,128);
   }
  fclose($fp);
  }
И в итоге вижу странный результат:
Код:
host=www.site.ru
port=80
gethostbyname(www.site.ru)=217.23.МОЙ.АДРЕС
gethostbyaddr(217.23.МОЙ.АДРЕС)=localhost
--------------------------------------------------------------------------------
HTTP/1.1 200 OK Date: Sun, 06 Nov 2005 09:00:35 GMT Server: Apache/1.3.26 (Unix) PHP/4.3.3 .......
Бред...
Это может быть связано с хостингом?

-~{}~ 06.11.05 12:29:

PHP:
$fp=fsockopen($host,$port,$errno,$errstr,$timeout);
Выдает $errno=0 и вываливает тудаже все содержимое страницы запрашиваемого $host.
 

Sepuka

Новичок
в тему о доступности сайта:
fopen работает медленнее чем fsockopen или у меня просто так получилось? Я открываю подряд три сайта: яндекс, гугл и пхпклуб сначала сокетом, потом фопеном, получаю по времени 0.27236199378967 от сокета и 1.0821130275726 от фопена, второй раз 0.1201860904693 и 1.7695338726044 соответственно.
 

kruglov

Новичок
Я не понял, вы на каждом хите собираетесь пинговать кучку сайтов, откуда взяты картинки?

Вас задосят, причем совершенно незлонамеренно.
 
Сверху