Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Test URL-a przez PHP (środowisko linux)
Forum PHP.pl > Forum > PHP
ahold
Witam,

Potrzebuję funkcję która sprawdzi czy podany adres URL jest poprawny, i czy nie odpowiada pod nim 404.

Wziąłem taki kod, na oko wydaje się poprawny

Kod
function is_valid_url ( $url )
{
        $url = @parse_url($url);

        if ( ! $url) {
            return false;
        }

        $url = array_map('trim', $url);
        $url['port'] = (!isset($url['port'])) ? 80 : (int)$url['port'];
        $path = (isset($url['path'])) ? $url['path'] : '';

        if ($path == '')
        {
            $path = '/';
        }

        $path .= ( isset ( $url['query'] ) ) ? "?$url[query]" : '';

        if ( isset ( $url['host'] ) AND $url['host'] != gethostbyname ( $url['host'] ) )
        {
            if ( PHP_VERSION >= 5 )
            {
                $headers = get_headers("$url[scheme]://$url[host]:$url[port]$path");
            }
            else
            {
                $fp = fsockopen($url['host'], $url['port'], $errno, $errstr, 30);

                if ( ! $fp )
                {
                    return false;
                }
                fputs($fp, "HEAD $path HTTP/1.1\r\nHost: $url[host]\r\n\r\n");
                $headers = fread ( $fp, 128 );
                fclose ( $fp );
            }
            $headers = ( is_array ( $headers ) ) ? implode ( "\n", $headers ) : $headers;
            return ( bool ) preg_match ( '#^HTTP/.*\s+[(200|301|302)]+\s#i', $headers );
        }
        return false;
}


Próbuję go oszukać:

$adres=('http://onet');


Kod
if(!is_valid_url($adres))
{
    print('Nie można pobrąć pliku, podany adres URL jest nie poprawny...');
    exit();
}
else
{
    print('Poprawny');
}


Kretyn daje się jednak zrobić w konia i wywala
Cytat
Poprawny


Jakiś pomysł ?
Nie ma takiej domeny, więc nie powinno prawa zwrócić true :/
trionet
Chyba można by do tego użyć CURL-a

http://pl.php.net/manual/en/function.curl-init.php tutaj jest jakiś przykład nawet smile.gif
ahold
Gdzie masz ten przykład ?

Nie chce pobierać całej strony WWW, bo mi padnie serwer.
Wystarczy nagłówek, by sprawdzić czy apache pracuję.
bim2
No to daj fsockopen" title="Zobacz w manualu PHP" target="_manual.
i później tylko nagłówki wyciągasz
  1. <?php
  2. while( !feof( $pointer ) ) {
  3.    $line = fgets( $pointer, 128 );
  4.    $content .= $line;
  5.    if( $line == "r\n" ) {
  6.        $header = "passed";
  7.        break;
  8.    }
  9. }
  10. ?>
ahold
Dobra Panowie,

Wracamy do curla:

  1. <?php
  2. $ch = curl_init();
  3. // gzip //na wypadek gdyby jakis debil kompresował sajt :/
  4. curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
  5. // deflate //na wypadek gdyby jakis debil kompresował sajt :/
  6. curl_setopt($ch, CURLOPT_ENCODING, 'deflate');
  7. // gzip, deflate //na wypadek gdyby jakis debil kompresował sajt :/
  8. curl_setopt($ch, CURLOPT_ENCODING, '');
  9.  
  10. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3');
  11. //juzer ejdżent jako fejk
  12. curl_setopt($ch, CURLOPT_URL, $toCheckURL);
  13. curl_setopt($ch, CURLOPT_HEADER, true);
  14. curl_setopt($ch, CURLOPT_NOBODY, true);
  15. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  16. curl_setopt($ch, CURLOPT_MAXREDIRS, 10); //Maksymalnie 10 przekierowań, poprzez HL itp.
  17. $data = curl_exec($ch);
  18. curl_close($ch);
  19. preg_match_all("/HTTP/1.[1|0]s(d{3})/",$data,$matches);
  20. $code = end($matches[1]);
  21. if(!$data) {
  22.  
  23. die('Klaster nie odpowiada. - Od tego momentu jest wykluczony z konfigurajci apache.  Kliknij w poniższy przycisk, aby wysłać wiadomość do technika.');
  24. }
  25. ?>



Teraz mamy taką sytuację, apachowi brakuje zasobów.
I odpowiedz trwa, trwa, trwa, trwa trwa.
Skrypt wyłącza się po 30 sekundach jako phptimeout.

Pytanie, można dać jakąś flagę dla curl-a pt "max wait".
Po czym zerwie oczekiwanie ?

(zakładamy, że adres jest poprawny. Ale apache może być przeciążony, ale nie do tego stopnia by wywalić np 505 lub inną interialkę).

Taki timeout... po którym sprawdza -> odebrałem jakieś dane ? ok
nie odebralem w tym czasie ? -> kill


Proszę o pomoc, nie mogę się nigdzie tej flagi doszukać.
pyro
Odpowiedź na pytanie: flaga CURLOPT_CONNECTTIMEOUT

Poza odpowiedzią na pytanie: @ahold, Twoje komentarze w kodzie są głupie. Rób to po ludzku. W niektórych przypadkach debilem to trzeba być, żeby nie używać kompresji strony.

Cytat
//juzer ejdżent jako fejk


To TaKiE EmO... tongue.gif
ahold
Witam,

Przepraszam za komentarze, nie tylko ja edytuję kod winksmiley.jpg



Faktycznie, o tę flagę mi chodziło.
Jak ustawię na 2 sekundy, to jak ją zinerpretuje ?

Jak pobierze w 2 sekundy 100% = ok, a jak nie pobierze $data = 0 ?
Czy jak nie pobierze w 2 sekundy, to przerywa, i $data = połowa strony ? [do momentu pobierania] ?





Kompresowanie strony jest nierozsądne, ciągnie procesor, no chyba że prowadzimy stronę typu Wikipedia gdzie 90 % contentu to tekst.

Poza tym zamierzasz przez PHP kompresować, fragmenty tekstu który bedzie dynamicznie pobierany z bazy SQL ?
To było fajne 5 lat temu, kiedy witryny były w HTML.
Teraz witryna to PNG + dynamiczny content
pyro
Cytat(ahold @ 24.06.2009, 18:50:07 ) *
Kompresowanie strony jest nierozsądne, ciągnie procesor, no chyba że prowadzimy stronę typu Wikipedia gdzie 90 % contentu to tekst.

Poza tym zamierzasz przez PHP kompresować, fragmenty tekstu który bedzie dynamicznie pobierany z bazy SQL ?
To było fajne 5 lat temu, kiedy witryny były w HTML.
Teraz witryna to PNG + dynamiczny content


Właśnie miałem na myśli sytuacje typu wikipedia. Wtedy kompresowanie poprawia wydajność.

Co do flagi: o ile dobrze pamiętam $content == false gdy potrwa to więcej niż wskazany czas, ale od kiedy ktoś Ci zabronił tego osobiście sprawdzić winksmiley.jpgquestionmark.gif
ahold
Ustawiłem na 2 sekundy. Ale nie mogę znaleźć nigdzie serwera który odpowiada dłużej.

Przeleciałem wszystkie typu
- google
- wp
- hoga

Działa smile.gif

Wrzuciłem jeden fake serwer który ma awarie (całkowicie padł, apache dogorywa ) - po 2 sekundach ładnie zwrociło fail.
Dokładnie to o co mi chodziło.

Nie przewidziałem takiej sytuacji.

1) sprawdzam IP -> domena - ip
2) curlem

No i wrzuciłem mu domene gdzie leżał apache. Ale mówił że działa. Czyli nie dawał drop-a połączenia. Bo przy dropie CURL wywala od razu fail że nie połączył się na 80 dziesiątym.

Pierwszy test przeszło, zabrało się za drugi.
I po 30 sekundach po mojej stronie timeout.
Naewt nie zalogowało do bazy danych awarii.

Za pierwszym razem aż serwer rebootłem, jak zobaczyłem interialkę.
Nie przewidziałem takiego scenariusza. Człowiek się uczy całe życie.

A co do kompresji, myślisz że można (zapisać stronę www do pliku, dać prawy kompresuj jako tag.gz) i porównać ?
Będzie taki sam stopień kompresji, jak przy module mod_gzip ?

Chciałem z Ciekawości, ile zaoszczędził bym przy moich witrynach, no a nie będę teraz rebootować apache, wyczerpałem dzienny limit restartów smile.gif.
pyro
Kompresowanie jest wskazane jedynie tam, gdzie jest `dużo w źródle strony`. W miejscach, gdzie cały kod strony zajmuje 40 linijek kompresowanie może co najwyżej zaszkodzić.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.