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

[php] funkcja poprawność adresu(nie chodzi o parser)
YE
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 13 lat
  • Postów:48
0

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

Kopiuj
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()


Nigdy nie mów NIGDY
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).

YE
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 13 lat
  • Postów:48
0

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


Nigdy nie mów NIGDY
bordeux
  • Rejestracja:około 18 lat
  • Ostatnio:9 miesięcy
  • Lokalizacja:Chorzów
  • Postów:1130
Ktos
Moderator
  • Rejestracja:prawie 23 lata
  • Ostatnio:około 23 godziny
0

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

Kopiuj
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).

PL
  • Rejestracja:około 19 lat
  • Ostatnio:ponad 13 lat
  • Postów:21
0

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


YE
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 13 lat
  • Postów:48
0

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


Nigdy nie mów NIGDY

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.