info@a-coding-project.de

PHP-Beispiele: Netzwerke und Internet

Die Verbindung zwischen Client und Server kann von PHP geprüft und beeinflusst werden.

Verbindungssteuerung

Die Laufzeit eines Skripts ist standardmäßig auf 30 Sekunden begrenzt. Einige Anweisungen können aber durchaus mehr Zeit beanspruchen, z.B. das Einfügen einer Serie von Datensätzen in die Datenbank. Die Funktion set_time_limit() kann den Standardwert außer Kraft setzen und einen anderen Wert einstellen. Der Wer 0 stellt eine unbegrenzte Laufzeit ein. Beispiel:

set_time_limit(0);

Darüber hinaus gibt es einige Funktionen, die steuern, was passieren soll, wenn die Verbindung abgebrochen wird. Das folgende Beispiel zeigt, wie verschiedene Funktionen zur Verbindungssteuerung kombiniert werden können:

<?PHP
// bei Abbruch der Verbindung soll die Funktion 
// funcBeiAbbruch() noch ausgeführt werden
register_shutdown_function('funcBeiAbbruch');

// nach 5 Sekunden soll die Ausführung des Skripts 
// abgebrochen werden
set_time_limit(5);

// Eine Schleife wird gestartet
for($i=1;$i<=10000;$i++)
{
 // $i wird hochgezählt und angezeigt
 echo $i ."|";
 // Ausgabe der Anzeige
 flush();
 // 1 Sekunde Pause 
 // (sleep() funktioniert nur in Windows-Betriebssystemen; 
 // sonst usleep() benutzen
 sleep(1);
}

function funcBeiAbbruch()
{
 // Connection-Status abfragen
 $Status = connection_status();
 switch ($Status) 
 {
  case 0:
         // bei Status 0 - Normal - keine Aktion
         break;
  case 1:
         // bei Status 1 die Daten in eine Datei schreiben
         $f = fopen('Datei.txt','a');
         fwrite($f,"a");
         fclose($f);
         break;
  case 2:
         // bei Status 2 - Abbruch - 
         // Daten und Hinweis auf Abbruch in Datei schreiben
         $f = fopen('Datei.txt','a');
         fwrite($f,"b - bei Abbruch noch gespeichert");
         fclose($f);
         break;
 }

 // Alternative:
 if (Connection_timeout()) 
 { $Ereignis = "Abbruch, weil Zeitlimit überschritten"; }
 elsif (connection_aborted())
 { $Ereignis = "Abbruch durch benutzer"; }
 else 
 { $Ereignis = "Skript normal beendet"; }
 $f = fopen('Datei.txt','a');
 fwrite($f,$Ereignis);
 fclose($f);
}

Socketverbindungen

Für Socket-Verbindungen stellt PHP eine Erweiterung für Datenaustauschfunktionen zur Verfügung. Es handelt sich dabei um eine hardwarenahe Schnittstelle die auf BSD Sockets aufbaut. Um die Socket-Erweiterung nutzbar zu machen, muss sie beim Kompilieren mit der Option --enable-sockets beim Befehl configure eingebunden werden. Änderungen in der php.ini sind nicht nötig.

Für den Aufbau von Socket-Verbindungen stellt PHP speziell die Funktion fsocket() bereit:

int fsockopen ( string target, int port [, int errno 
                [, string errstr [, double timeout]]] )

Sie öffnet eine Socketverbindung zum Internet über den Hostnamen oder den angegebenen Port. Timeout ist die Anzahl der Sekunden der Wartezeit in Sekunden. Timeout = 0 heißt unbegrenzt. Die Verbindung kann mit AF_INET (TCP oder UDP) oder - bei Unix - mit AF_UNIX hergestellt werden. Wenn man UDP verwendet, muss udp://hostname angegeben werden.

Das folgende Beispiel definiert zwei Funktionen mit denen ein HTTP-Client (vgl. Browser) simuliert werden kann. Dazu wird eine Soketverbindung aufgebaut und eine HTTP-Anfrage abgesetzt:

function HTTPGET($host,$ip,$port,$file)
{

 $ua = 'PHP/HTTP';
 $res = '';
 $socket = socket_create (AF_INET, SOCK_STREAM, 0);
 if ($socket >= 0)
 {
  $con = socket_connect($socket, $ip, $port);
  if ($con >= 0)
  {
   $lb = "rn";
   $in1 = 'GET '.$file.' HTTP/1.0'.$lb.
   'Host: '.$host.$lb.
   'User-Agent: '.$ua.$lb.
   'Accept: text/*, */*'.$lb;
   $in2 = 'Connection: close'.$lb.
   'Accept-Ranges: none'.$lb.
   $lb;
   $in = $in1.$in2.$lb.$lb;

   //Request
   socket_write($socket, $in, strlen ($in));
   $out = ''; $a = ''; $dl = 0;
   //Response
   while($r = trim(socket_recv($socket,$a,1024,0)) && 
         strlen($out) < 1024*64 && $dl < 64)
   {
    if($r == 0){break;}//Closed
    if($r < 0){break;}//fehler
    $out .= $a;
    $dl++;
   }

   /*returncode ermitteln*/
   $rc = substr($out,9,3);
   $rc2 = substr($out,9,1);

   //fehler aufgetreten?
   if($rc2 == '2' || $rc2 == '3')
   {
    //content rausschreiben
    $res = GetBodyFromHTTPMsg($out);
   }
   else{$res = '%';}
  }
  socket_close ($socket);
 }
 return $res;
}

function GetBodyFromHTTPMsg($msg)
{
 //content rausschreiben
 $lb = "rn";
 $j = strpos($msg,$lb.$lb);
 if(substr_count($msg,$lb.$lb)>0)
 {
  $cont = substr($msg,$j+4);
  $head = substr($msg,0,$j);
  //chunked?
  if(substr_count(strtolower($head),'transfer-encoding: chunked'))
  {
   $rest = $cont;
   while(strlen($rest)>0)
   {
    //erste zahl entfernen
    $j = strpos($cont,$lb);
    if(substr_count($cont,$lb)>0)
    {
     $char = substr($cont,0,$j);
     $cont = substr($cont,$j+2);
     if(is_int(hexdec($char)))
     {
      $rest = substr($cont,hexdec($char)+2);
      $cont = substr($cont,0,hexdec($char));

      //hintere zahl entfernen
      $j = strpos($rest,$lb);
      if(substr_count($rest,$lb)>0)
      {
       $char = substr($rest,0,$j);
       if($char == '0'){break;}
       $rest = substr($rest,$j+2);
      }else{break;}
     }else{break;}
    }else{break;}
   }

  }
 }
 else{$cont = '';}
 return $cont;
}

//Aufrufbeispiel:
$seiteninhalt = HTTPGET('www.meinhost.de', 
                        gethostbyname('www.meinhost.de'),
                        80,'/index.html');

Mails verschicken

Mails können mit PHP sehr einfach verschickt werden. Die Funktion mail führt das Verschicken bei Aufruf sofort aus. Die mail-Funktion kann z.B. so aufgerufen werden:

mail("Empfaenger@abc.de", "Betreff", "Text");

Beim Ausführen dieser Zeile des PHP-Skripts wird die Mail sofort gesendet.
Will man die Mail an mehrere Empfänger senden, gibt man diese im Empfänger-Parameter durch Komma getrennt an:

mail("a@abc.de, b@abc.de, c@abc.de", "Gruß an alle", 
     "Text für alle");

Man kann einen vierten Parameter angeben. Dessen Inhalt wird dann an den Mail-Header angehängt:

mail("Empfaenger@abc.de", "Betreff", "Text", 
     "From: Absender@abc.denReply-To: antwort@abc.den");

Mehr zum Mail-Versand in PHP findest Du hier.

Weiterlesen: ⯈ Grafiken generieren

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Auch interessant