Multi-Threading in PHP (Thread-Pool)

Gerade beim Laden großer Datenmengen wie Lagerstrukturen oder bei Exporten ganzer Datenbestände, kommt man schnell in Bereiche, wo das Laden und Aufbereiten mehr als ein paar Minuten dauern kann. Bei normalen Desktop-Programmen und Skripten ist das nicht ganz so relevant. Wenn man aber im Web-Bereich arbeitet, kann es schnell zu Problemen mit Timeouts kommen. 3 Minuten können hier schon ein extremes Problem sein. Asynchrone Client helfen hier, aber keiner Wartet gerne und Zeit ist Geld.

Es gibt dann einen Punkt, wo die Zeit pro zu ladenen Element sich nicht mehr weiter verringern lässt. Hier hilft dann nur noch die Verarbeitung der einzelnen Elemente zu parallelisieren. Bei Java gibt es den ExecutorService, in JavaScript die WebWorker und in PHP gibt es pthreads. Es ist nichts für Leute mit einem Shared-Hosted Webspace, weil man eine Extension nach installieren muss.

Installation:
http://php.net/manual/de/pthreads.installation.php

(es sollte die erste DLL reichen)

Hier ist ein kleines Beispiel wo eine Liste von MD5-Hashes erzeugt werden soll. Die Threaded-Variante lief bei mir meistens fast doppelt so schnell
wie die einfache Variante mit der Schleife.

<?php
$files=scandir("c:/xampp/htdocs/files");
$start=microtime();
$cnt=count($files);
$result=array();
for($i=0;$i<$cnt;$i++){
$file=$files[$i];
if($file!="." && $file!=".."){
$result[count($result)]=md5(file_get_contents("c:/xampp/htdocs/files/".$file));
}
}
echo "bench (loop): ".(microtime()-$start)."<br>";

class PWorker extends Collectable{
public $workload;

public function __construct($work){
$this->workload=$work;
}

public function run(){
$this->workload=md5(file_get_contents("c:/xampp/htdocs/files/".$this->workload));
$this->setGarbage();
}
}

$result=array();
$start=microtime();
$p = new Pool(4);
for($i=0;$i<$cnt;$i++){
$file=$files[$i];
if($file!="." && $file!=".."){
$p->submit(new PWorker($file));
}
}
$p->shutdown();

$p->collect(function($checkingTask){
global $result;
$result[count($result)]=$checkingTask->workload;
return $checkingTask->isGarbage();
});
echo "bench (4 threads): ".(microtime()-$start)."<br>";
?>


Man kann also auch in PHP moderne Anwendungen schrieben die Multi-Core CPUs auch wirklich ausnutzen können und muss sich hinter Java in den meisten Bereichen nicht mehr verstecken.
User annonyme 2015-08-09 13:43

write comment:
Four + = 11

Möchtest Du AdSense-Werbung erlauben und mir damit helfen die laufenden Kosten des Blogs tragen zu können?