Home
Navigation
Impressum
Coder Welten - Programmierung und Optimierung
Coder Welten
 
 

 

 

OOP: Eine einfache cURL Klasse

Abruf wie durch einen einfachen Bot - III

Übersicht » Einführung OOP

Beispiele:

  1. Parserklasse (eine simple Parserklasse für ein einfaches XML-Dokument)
  2. Socket Klasse (eine TCP/IP Socket Klasse zum Abruf wie durch einen Bot)
  3. Formular Klasse (Socket-Klasse mit einer Formular-Klasse kombinieren)
  4. cURL Klasse (eine cURL Session initialisieren und ausführen)
  5. CSV Klasse (zum Auslesen (rückwärts) von umfangreichen CSV-Dateien)

Vorbemerkungen und Voraussetzungen

Was als erstes bei einem Vergleich mit den vorausgegangenen Beispielen auffallen dürfte, ist wohl, dass der Code in diesem Beispiel wesentlich weniger aufgebläht erscheint. Allein die Klasse EmpfangMessage() hat sich um rund 20 Zeilen verkürzt. Diese Verkürzung liegt unter anderem daran, dass Host und GET nicht einzeln an die Klasse WieBot() zum Aufbau einer Verbindung weitergereicht werden müssen.
Dabei kommt ein Vorteil der Objektorientierten Programmierung etwas mehr zur Geltung, denn das Formular und die Klasse EmpfangMessage() lassen sich für unterschiedliche Aufgabenstellungen wieder verwenden, insofern es bei der Aufgaben­stellung darum gibt, eine vom Nutzer eingegebene URL zu filtern und für die weitere Verarbeitung aufzubereiten.

Falls Sie beabsichtigen dieses Script zu testen, überzeugen Sie sich zuvor, ob der cURL Support ermöglicht ist. Kontrollieren Sie, ob in der PHP-Info ein Eintrag mit cURL support enabled existiert. Sollte dies nicht der Fall sein, suchen Sie in der php.ini nach dem Eintrag extension=php_curl.dll und entfernen das Semikolon vor diesen Eintrag, vorausgesetzt es besteht Zugriff auf die php.ini.

Wie die bereits vorgestellten Scripts, so liefert auch dieses Script eine Ausgabe an den Browser, die den HTTP Message Header und den Message Body enthält, insofern die URL erfolgreich aufgerufen und eine Verbindung zum Server hergestellt werden konnte. Dieses Script wird nachfolgend in zwei Varianten vorgestellt.

Variante I (Formular- und cURL-Klasse ohne Vererbung)

Bei der ersten Variante wird auf eine Vererbung von Eigenschaften und Methoden verzichtet. Der Vorteil besteht darin, dass sich beide Klassen unabhängig voneinander in unterschiedlichen Scripts verwenden lassen. Damit ist jedoch ein kleiner Nachteil verbunden, ohne Vererbung müssen zwei Objekte erzeugt und instanziiert werden, mit Vererbung hingegen nur ein Objekt.

Code-Listing (Formular- und cURL-Klasse ohne Vererbung):

<?php
error_reporting(E_ALL);

/*-- Überprüfung der vom Formular übermittelten URL ---------------------------*/

class EmpfangMessage {

    private $dompath = "";
    private $domain  = "www.example.com";

    public function pruefeMessage() {

        if (isset($_GET["abrufen"]) and !empty($_GET["abrufen"])) {

            $abrufen = trim($_GET["abrufen"]);
            $hrefpos = stripos($abrufen, "http://");
            $abrufen = preg_replace("/[^a-zA-Z0-9.:?&\/=_-]/", "", $abrufen);

            if ($hrefpos === false) {
                $abrufen = "http://".$abrufen;
            }
            $this->dompath = $abrufen;
            return $this->dompath;
        }
        else {
            $this->dompath = $this->domain;
            return $this->dompath;
        }
    }
}

/*-- Klasse zur Initialisierung und Ausführung einer cURL-Session -------------*/

class WieBot {

    public $antwort = "";
    private  $agent = "User-Agent: Mozilla/5.0 (compatible; Demo Botklasse 0.3)";

    public function getVerbindung() {

        $cwbot = curl_init($this->antwort);                    // cURL-Session initialisieren

        curl_setopt($cwbot, CURLOPT_HEADER, true);             // Response Header mit in die Ausgabe aufnehmen
        curl_setopt($cwbot, CURLOPT_USERAGENT, $this->agent);  // User Agent für den Request Header setzen
        curl_setopt($cwbot, CURLOPT_RETURNTRANSFER, true);     // Rückgabe als String

        if (curl_exec($cwbot) !== false) {
            $this->antwort = curl_exec($cwbot);                // Ausführung der cURL-Session
        }
        else {
            $this->antwort = "Fehler: ".curl_error($cwbot);    // oder eine Fehler-Mitteilung ausgeben
        }
        curl_close($cwbot);                                    // Session beenden und Resourcen freigeben
        return $this->antwort;
    }
}

/*-- Vorbereitungen für die Ausgabe -------------------------------------------*/

$vonform = new EmpfangMessage();        // Erzeugen und Instanziieren des Objektes EmpfangMessage
$fuerant = $vonform->pruefeMessage();   // Rückgabewert der Methode pruefeMessage der Variablen $fuerant zuweisen

$vonbot = new WieBot();                 // Erzeugen und Instanziieren des Objektes WieBot
$vonbot->antwort = $fuerant;            // $antwort die übernommenen Werte der Eigenschaften zuweisen
$ausgabe = $vonbot->getVerbindung();    // Rückgabewert der Methode getVerbindung für Ausgabe
?>
<!DOCTYPE html>
<html>

<head>
<title>Abruf wie durch Bot</title>
</head>

<body>
<div style="text-align:center">
<h1>Abruf wie durch Bot</h1>

<?php  echo htmlentities($fuerant, ENT_QUOTES)."<br>\n"; ?>

<form action="<?php echo basename($_SERVER["PHP_SELF"]); ?>" method="get">
  <input type="text" name="abrufen" size="60" maxlength="120"><br>
  <input type="reset" value=" Reset ">
  <input type="submit" value=" Senden ">
</form>
</div>
<?php echo "<pre>".htmlentities($ausgabe, ENT_QUOTES)."</pre>"; ?>
</body>
</html>

Im Beispiel enthält die Klasse WieBot() die Methode getVerbindung(). Wird nun ein Objekt WieBot erzeugt und instanziiert, weiterhin eine URL als Wert der Eigenschaft $antwort zugewiesen sowie die Methode getVerbindung() aufgerufen, so wird mit curl_init eine cURL-Session initialisiert. Mit der Funktion curl_setopt lassen sich unterschiedliche Option für die Verbindung und Datenübertragung setzen, die an die jeweilige Aufgabenstellung angepasst werden können.

Variante II (Formular- und cURL-Klasse mit Vererbung)

Bei dieser Variante mit Vererbung wird die Formular-Klasse EmpfangMessage zur Elternklasse, von der die Kindklasse WieBot die Eigenschaften und Methoden erbt. Im nachfolgenden Code-Listing werden nur die Code-Abschnitte aufgeführt, die sich gegenüber Variante I veränderten.
Zu diesen Veränderungen gehört, dass die Elternklasse EmpfangMessage mehr gekapselt wurde, womit weder die Eigenschaften noch die Methode pruefeMessage öffentlich zugänglich sind. Weiterhin wurde in der Kindklasse WieBot zusätzlich die Methode getAdresse definiert, um die protected Methode pruefeMessage aus der Elternklasse aufzurufen und auszuwerten.
Ein Vorteil bei Variante II mit Vererbung besteht unter anderem darin, dass nur noch ein Objekt erzeugt und instanziiert werden muss, um die volle Funktionalität der Klassen nutzen zu können. Als ein Nachteil könnte hingegen angesehen werden, dass sich beide Klassen nicht mehr unabhängig voneinander für andere Aufgabenstellungen verwenden lassen.

Verändertes Code-Listing (Formular- und cURL-Klasse mit Vererbung):

<?php
error_reporting(E_ALL);

/*-- Überprüfung der vom Formular übermittelten URL ---------------------------*/

class EmpfangMessage {

    private $dompath;
    private $domain  = "www.example.com";

    protected function pruefeMessage() {

        /* Aus der public function wurde eine protected function ... */
        /* ... der restliche und unveränderte Code ... */
    }
}

/*-- Klasse zur Initialisierung und Ausführung einer cURL-Session -------------*/

class WieBot extends EmpfangMessage {

    private $antwort;                                        // Aus public wurde private
    private $agent = "User-Agent: Mozilla/5.0 ...";

    public function getAdresse() {                           // Eine zusätzliche Funktion getAdresse

        return $this->pruefeMessage();                       // Aufruf der geerbten Funktion pruefeMessage
    }
    public function getVerbindung() {

        $this->antwort = $this->pruefeMessage();
        $cwbot = curl_init($this->antwort);                  // cURL-Session initialisieren

        /* ... der restliche und unveränderte Code ... */

    }
}

/*-------------------------------------------------------------------------------
 Die Vorbereitungen für die Ausgabe haben sich vereinfacht, da nur noch ein
 Objekt erzeugt und instanziiert werden muss.
 --------------------------------------------------------------------------------
*/
$vonbot  = new WieBot();                 // Erzeugen und Instanziieren des Objektes WieBot
$fuerant = $vonbot->getAdresse();        // Die per Formular übergebene URL bzw. Webadresse mit getAdresse() ermitteln
$ausgabe = $vonbot->getVerbindung();     // Rückgabewert der Methode getVerbindung für die Ausgabe

?>

Die Frage, welcher Variante der Vorzug zu geben ist, kann nicht pauschal beantwortet werden, da letztendlich beide Varianten Vor- und Nachteile besitzen.

Formular Klasse « / » CSV Klasse mit Blätterfunktion

 

Copyright © Verlag Horst Müller - Stendal - 2006 - Impressum - Datenschutz - Nutzungsbedingungen