Avatar billede mike2002 Nybegynder
21. juli 2009 - 13:43 Der er 5 kommentarer og
1 løsning

Ping server med php script

Hej eksperter

Jeg har følgende situation:

På en hjemmeside, har jeg en iframe, hvori jeg gerne vil have vist en log in box fra en secure server. Serveren er imidlertid nede indimellem pga. back-up, og i disse perioder, vil jeg gerne have, at der i stedet for log in boxen kommer meddelelse herom.

Jeg har et script, der virker ok til dette formål (jf. nedenfor).

Der er dog det problem, at hvis serveren er helt slukket, fx pga. strømafbrydelse eller server-nedbrud, så viser min iframe en 404-side. Det vil jeg selvfølgelig gerne undgå. Kan det lade sig gøre?

Her er mit script:

<?php

class user_misc {

public function renderLogin() {
       
        function isOnline($url) {
        if (!$url_info = parse_url($url)) {
            return false; 
        }
     
        switch ($url_info['scheme']) {
            case 'https':
                $scheme = 'ssl://';
                $port = 443;
                break;
            case 'http':
            default:
                $scheme = '';
                $port = 80; 
        }
     
        $data = "";
        $fid = @fsockopen($scheme . $url_info['host'], $port, $errno, $errstr, 5);
        if ($fid) {
            fputs($fid, 'HEAD ' . (isset($url_info['path'])? $url_info['path']: '/') . (isset($url_info['query'])? '?' . $url_info['query']: '') . " HTTP/1.0\r\n" .
                        "Connection: close\r\n" .
                        'Host: ' . $url_info['host'] . "\r\n\r\n"); 
            while (!feof($fid)) {
                $data .= @fgets($fid, 128);
            }
            fclose($fid);
            return !empty($data);
        } else {
            return false;
        }
    }
   
    if(isOnline('https://mysecure.server.dk'))
        return '<div style="vertical-align:top;"><iframe src="https://mysecure.server.dk/portal/lgi.html" width="116" scrolling=no frameborder="0" height="88" marginheight="0" marginwidth="0" style="margin-bottom:4px;"></iframe></div>';
    else
        return '<p>Der er i øjeblikket ikke adgang til<br />serveren på grund af backup.</p>';
   
    }

}

?>
Avatar billede mrgumble Nybegynder
21. juli 2009 - 14:42 #1
Nu hvor du har sådan et fint script, hvorfor så ikke prøve efter? Umiddelbart ser det fornuftigt ud.
Giver det ikke det forventede resultat? Virker det slet ikke? Eller hvorfor er det, du spørger herinde?
Avatar billede mike2002 Nybegynder
21. juli 2009 - 16:07 #2
Hej

Som jeg skriver i spørgsmålet, så virker scriptet fint, så længe der bare er tale om almindelig vedligehold af serveren. Dvs. den er ikke nede, den svarer bare ikke. Hvis den er nede, fx pga. strømsvigt eller servernedbrud, kommer der en 404-side i min iframe, og det er ikke pænt!

Som scriptet kører nu, henter den enten login siden eller viser fejlmeddelelsen. Der mangler en mulighed: at serveren er helt nede. Hvordan gør man det?

Og ja, det er et fint script. Jeg har nolet det fra php.net og modificeret det lidt.

Håber det er muligt at lave det?
Avatar billede mrgumble Nybegynder
21. juli 2009 - 16:40 #3
Ja, undskyld, det kan jeg godt se nu.

Jeg tror du skal ind og se på, hvad de enkelte funktioner i nedenstående stykke returnerer, når den ikke kan få fat i serveren:
$fid = @fsockopen($scheme . $url_info['host'], $port, $errno, $errstr, 5);
        if ($fid) {
            fputs($fid, 'HEAD ' . (isset($url_info['path'])? $url_info['path']: '/') . (isset($url_info['query'])? '?' . $url_info['query']: '') . " HTTP/1.0\r\n" .
                        "Connection: close\r\n" .
                        'Host: ' . $url_info['host'] . "\r\n\r\n");
            while (!feof($fid)) {
                $data .= @fgets($fid, 128);
            }

Bemærk, at der er @ foran funktionerne, så evt. fejl bliver ignoreret. Så prøv at fjerne dem og kør scriptet og se hvad dukker op (eller ikke dukker op).
Avatar billede mike2002 Nybegynder
21. juli 2009 - 19:00 #4
OK! Jeg har altid undret mig over, hvorfor der er @ foran funktioner..... Og jeg har da ellers programmeret en del i php.... ;-)

Men jeg er ikke så stærk i, hvad de forskellige funktioner kaster afsted til serveren og hvad den så svarer i de forksellige tilfælde. Måske skal spørgsmålet i virkeligheden stilles i server-forummet i stedet...?

Men tak for input - jeg kigger nærmere på det.
Avatar billede mrgumble Nybegynder
21. juli 2009 - 20:53 #5
Jeg vil gætte på, at fsockopen vil enten påråbe sig en fejl eller returnerer Falsk; det sidste bliver behandlet af din kode.
Så du kan prøve at fylde lidt på så:
$fid = @fsockopen($scheme . $url_info['host'], $port, $errno, $errstr, 5);
bliver til
try {
  $fid = @fsockopen($scheme . $url_info['host'], $port, $errno, $errstr, 5);
} catch (Exception $e) {
    return false;
}

Men nej, det kan være svært at gætte på hvad alle funktionerne returnerer i diverse tilfælde. Derfor skal man læse dokumentationen og ellers prøve sig frem. Frem provokere nogle fejl og håbe du tager hånd om dem.
Avatar billede mike2002 Nybegynder
21. juli 2009 - 22:20 #6
OK, tak for dine input. Point givet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester