Multi-Threading in PHP (Thread-Pool)
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.