Zunächst einmal...
Nein, es handelt sich nicht um echte Threads im Sinne der CS-Definitionen, aber man kann den Unterschied wirklich nicht erkennen. Ich sage es so: Diese Bibliothek kommt dem Gefühl des echten Einfädelns näher als das neue Hamburger-Patty „McPlant“ von McDonalds dem Rindfleisch. ?
Wenn Sie wie ich sind, lieben Sie PHP! Sie lieben die Flexibilität und Leistungsfähigkeit der Sprache – die Freiheit, schlampigen Code zu schreiben (ich befürworte das nicht, aber ich werde das Recht, schlampigen Code zu schreiben, bis zum Tod verteidigen) oder unbestreitbar schöne logische Kunstwerke zu schaffen! Jetzt haben Sie für alle meine C-Programmierer (und C++-Programmierer, denke ich) eine Bibliothek, mit der Sie nicht nur die Leistungsfähigkeit von PHP wirklich zur Schau stellen, sondern auch Ihr nächstes Projekt auf Hochtouren bringen können!
Diese Bibliothek ermöglicht Ihnen eine sehr effiziente Parallelverarbeitung, die dem POSIX-Multithreading sehr, sehr ähnlich ist. Sie können globale Variablen zwischen allen phpthreads teilen, Werte/Objekte/Arrays bei der Erstellung an Ihren PHPTHread übergeben, Werte/Objekte/Arrays einfach zwischen laufenden phpthreads teilen und PHPThread-Exit-Werte/Objekte/Arrays empfangen, wenn jeder PHPThread über phpthread_join()
beendet wird. Familie von Funktionen.
Ich habe diese Bibliothek entworfen, weil ich einen leistungsstarken WebSocket-Server schreiben wollte, der problemlos Tausende gleichzeitiger Verbindungen verarbeiten kann, über die große Datenmengen schnell übertragen werden können (denken Sie an Bilder oder Videos). Ja, im Grunde handelt es sich um einen fork()
ing-Server, aber die darüber liegende PHPThread-Schicht macht die Bereitstellung sehr einfach und bietet gleichzeitig einen Mechanismus für einfaches (und Thread-ähnliches) IPC. Ich hätte C verwenden und eine bessere Leistung erzielen können, aber für mich schien es portabler und einfacher zu implementieren zu sein, wenn die Server hochgefahren werden, also ist es jetzt hier.
Für die eher technisch versierten Leute: Diese Bibliothek ist zeitlich nicht durch die Notwendigkeit der Verwendung von „Ticks“ eingeschränkt. Das ist einer der Gründe, warum es so schnell ist. Die Bibliothek verwendet intern Signale (z. B. SIGUSR1 und SIGUSR2), um die Ausführung zu unterbrechen und den Kontext sehr fließend zu wechseln. Ja, wir belasten SIGUSR1 und 2. Wenn Ihr Projekt diese Signale verwendet, sollten Sie die Verwendung phpthread_send_message()
für eine bestimmte Nachrichtenhandlerfunktion in Betracht ziehen (siehe: Beispiele/Nachrichten1.php und Beispiele/Nachrichten2.php). Es sollte vollkommen zu Ihrem Zweck passen.
Es gibt Beispiele, die Sie im Verzeichnis „examples“ ausführen können. Fühlen Sie sich frei, einen Shebang für eine einfache Ausführung zu platzieren oder sie auszuführen, indem Sie ihnen php <filename>
voranstellen. Ich habe sie noch nicht alle fertiggestellt, aber ich habe eine ganze Reihe davon fertiggestellt. Zumindest genug, um ein gutes Verständnis der Fähigkeiten zu bekommen.
phpthreads erfordert die folgenden PHP-Erweiterungen:
<?php
require_once '../lib/phpthread.php'; /* Use correct path! */
function thread_proc( $thread,
$param)
{
echo "nt[PHPTHREAD] - I've started and have a param: "" . print_r($param, true) . ""!n";
for ($i = 0; $i < 15; $i++) {
usleep(1000000);
echo "t[PHPTHREAD] - Tick!n";
}
$myobj = (object)array(
'seconds_alive'=>$i,
'lucky_number'=>rand(0, 10000)
);
echo "nt[PHPTHREAD] - I'm returning this:n";
print_r($myobj);
echo "n";
echo "<--------------------------------------->nn";
return $myobj;
}
$id = phpthread_create($phpthread, array(), "thread_proc", null, array("this awesome string!"));
for ($i = 0; $i < 5; $i++) {
echo "n[MAIN] - Doing my thing...n";
usleep(1000000);
}
echo "n[MAIN] - Okay, I'm tired. Waiting on child to quit.n";
phpthread_join($id, $retval);
echo "n[MAIN] - Child is done. It returned:n";
print_r($retval);