Threads mit PHP – ein kurzes Tutorial

Während in vielen Programmiersprachen Threads eine zentrale Rolle spielen, ist dies bei PHP sozusagen „architekturbedingt“ meist nicht so wichtig. Folgendes Beispiel soll jedoch demonstrieren, dass Threads auch in PHP nützlich sein können.

Bild4

Im dem folgenden Beispiel muss eine PHP-Anwendung zwei REST-Webservices kontaktieren, um von dort Daten zu laden. Dafür wird fopen() eingesetzt. Leider sind diese beiden Services relativ langsam, da beispielsweise komplexe Datenbankzugriffe notwendig sind. Die Antwortzeit des einen Servers beträgt ca. 4 Sekunden, des anderen Servers ca. 2 Sekunden. Folgender Codeausschnitt demonstriert den Zugriff (noch ohne Threads):

<?php

$zeit=microtime(true);

$handle = fopen("http://example.de/service", "r");
$response1=fgets($handle);
fclose($handle);
echo $response1."<br/>";

$handle = fopen("http://beispiel.de/service", "r");
$response2=fgets($handle)."<br/>";
fclose($handle);
echo $response2;

echo "Dauer: "  . (microtime(true) - $zeit). " Sekunden";

Um dies selbst testen zu können, ändern Sie dies wie folgt ab:

//...
$handle = fopen("http://localhost/server1.php", "r");

//...
$handle = fopen("http://localhost/server2.php", "r");

Das Server-Script (server1.php und server2.php) für den Test simuliert die Wartezeit (des Datenbankzugriffs) mit sleep() und sieht wie folgt aus:

<?php
sleep(4); //für Server2: sleep(2)
echo "Hallo von Server1!";

Wie zu erwarten war dauert die Ausführung des Test-Scripts ca. 6 Sekunden, da Server1 ca. 4 Sekunden und Server2 ca. 2 Sekunden benötigt (siehe Screenshot oben)

Die Ausführung des Scripts lässt sich nun durch parallele Ausführung mit Threads optimieren. Wenn beide fopen()-Zugriffe (quasi) gleichzeitig starten, also Server1 und Server2 parallel kontaktiert werden, müsste die Ausführung nur ca. 4 Sekunden dauern (=die Laufzeit des langsameren Servers).

Um in PHP Threads nutzen zu können, ist die Bibliothek pthreads zu empfehlen, die leicht zu aktivieren bzw. zu installieren ist. Wie dies geht erfahren Sie auf der PHP-Website. (Tipp: Wenn Sie noch nicht PHP7 verwenden, nutzen Sie die Version 2.0.9).

Jetzt unser Script mit Threads:

<?php

class workerThread extends Thread {
    
    private $url;
    
    public function __construct($url){
        $this->url=$url;
    }

    public function run(){

        $handle = fopen($this->url, "r");
        $response1=fgets($handle);
        fclose($handle);
        echo $response1."<br/>";

    }
}

$zeit=microtime(true);

$worker1=new workerThread("http://localhost/server1.php");
$worker1->start();

$worker2=new workerThread("http://localhost/server2.php");
$worker2->start();

while ($worker1->isRunning())
{
    //in der Praxis nicht so sinnvoll
    //jedoch für Zeitmessung hilfreich 
}

echo "Dauer: "  . (microtime(true) - $zeit) . " Sekunden";

Und der Test – tatsächlich sind es nur ca. 4 Sekunden:

Bild3

Wie Sie ebenfalls sehen, wird das Ergebnis des Workers2 zuerst ausgegeben, da der Server2 ja bereits nach 2 Sekunden fertig ist.

Achtung: Wenn Sie sich noch nicht mit Threads beschäftigt haben, sollten Sie sich unbedingt mit dem Themen Synchronisierung, wait() und notify() beschäftigen, sonst kann es ein großes Durcheinander geben.

P.S.

Probleme? Fragen? Anregungen? Ich helfe jederzeit und gerne  – einfach einen Kommentar oder Mail schreiben, die Antwort kommt schnellstmöglich. Unternehmen, die Unterstützung, Beratung oder Schulung bei der API- oder Webprogrammierung, der Social-Media-Entwicklung oder dem Social-Media-Management benötigen finden zudem entsprechende Angebote meiner Firma auf der Website www.Frank-IT-Beratung.de

Dieser Beitrag wurde unter PHP, Programmierung, Webprogrammierung veröffentlicht. Setze ein Lesezeichen auf den Permalink.

Ein Kommentar zu Threads mit PHP – ein kurzes Tutorial

  1. it berater1 sagt:

    Vielen Dank für den guten Artikel und den guten Erklärungen zur IT Beratung.

Kommentar verfassen