[php] funkcja poprawność adresu(nie chodzi o parser)

0

Jak w temacie. Chciałbym sprawdzić, czy podany przez użytkownika adres
np. PHP czy http://4programmers.net/Forum/viewtopic.php?id=122934
istnieje w sieci. Próbowałem tak:

if (exec("/bin/ping -c 1 ".$strona)) {
     //skrypt wykonujący sie jak adres jest poprawny
}//end if

i tu dla adresu 4programmers.net jest ok,ale jak jest jeszcze coś za adresem nie działa:(
tak samo jest z checkdnsrr()

0

Musisz rozróżnić adres URL od domeny. Adresu nie spingujesz, spingować możesz tylko to, co jest pod domeną (serwer zwykle ;-)).

Jeżeli chcesz sprawdzić poprawność (istnienie) adresu URI to nie przychodzi mi do głowy nic poza fizycznym połączeniem się z serwerem i odebraniu danych nagłówka (jeśli jest to HTTP). W przypadku HTTP jeżęli odbierzesz nagłówek 200 OK to wiadomo, że pod tym adresem coś jest, jeżeli 404 Not Found - to chyba wiadomo, że nie ma.

Problemy są dwa: nie wiem czy potrzebujesz sprawdzać poprawność także innych protokołów i nie wiem jak twój system powinien reagować na np. 302 Moved Permanently (strona przeniesiona) czy nawet 403 Forbidden (dokument pod tym URI może istnieć, ale nie ma do niego dostępu).

Najłatwiejsze do sprawdzania przez HTTP będzie chyba użycie fsockopen() i wysyłanie żadania i odbiór powiedzmy pierwszego kilobajta danych (albo i mniej, bo nie ma sensu więcej, skoro nas interesuje kod odpowiedzi serwera).

0

chodzi tylko o protokół http.
Z tymi nagłówkami bedzie chyba najlepiej.

0

Rozwiązanie bordeuxa wymaga curl. Ja niedawno robiłem pobieranie danych z serwera HTTP przez czyste fsockopen() i wyglądało to tak:

private function get_http_response($host, $uri)
{
	$errno = '';
	$errstr = '';
	$fp = fsockopen($host, 80, $errno, $errstr, 30); // otwarcie połączenia
	if (!$fp)
	{
		throw new APIConnectionException("$errstr ($errno)");
	}
	else
	{
		$out = "GET $uri HTTP/1.1\r\n";			
		$out .= "Host: $host\r\n";
		$out .= "User-Agent: Dashione/Spring2 (Linux)\r\n"; // przedstawiamy się
		$out .= "Accept: text/xml;q=1\r\n"; // akceptujemy tylko XML-a póki co
		$out .= "Connection: Close\r\n\r\n";
	
		fwrite($fp, $out); // zapis do socketu
			
		// pobieranie danych z socketu
		$result = '';			
		while (!feof($fp))
		{
			$result .= fgets($fp, 128);
		}
		fclose($fp);
		
		return $result;
	}
}

Oczywiście pobieranie danych z socketu możesz (powinieneś nawet - bo co, jeśli ktoś nam podał adres kilkusetmegabajtowego pliku?) ograniczyć do kilku(set) bajtów, nie musisz używać while.

Oczywiście nagłówki User-Agent i Accept wypada zmienić (zwłaszcza Accept, zapewne do postaci /;q=1 żeby udawać że akceptujemy co tylko nam serwer poda).

0

Do sprawdzania istnienia wystarczy metoda HEAD, bo właściwe dane są zbędne.

0

skorzystałem z funkcji do której linka podał bordeux.
dzięki za pomoc:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1