Multithreading in PHP implementieren? Wenn Sie diesen Titel sehen, müssen Sie denken, dass ich es wirklich mache.
Hier
sind einige meiner Methoden, die tatsächlich getestet wurden
dass PHP selbst kein Multithreading unterstützt, aber unser WEB-Server unterstützt Multithreading.
Mit anderen Worten, es ist für mich auch die Grundlage, Multithreading in PHP zu implementieren .
Angenommen, wir führen jetzt die Datei a.php aus, aber ich fordere auch den WEB-Server auf,
eine weitere b.php auszuführen
,damit die beiden Dateien gleichzeitig ausgeführt werden
gesendet wird, führt der WEB-Server es aus, unabhängig davon, ob der Client beendet wurde.
Manchmal
möchten wir nicht eine andere Datei ausführen, sondern einen Teil des Codes in dieser Datei
kann Parameter verwenden, um zu steuern, welches Programm a.php ausführt.
Hier ist ein Beispiel:
//a .php
PHP-Code:---------------------------------------------- - -------------------
<?php
Funktion runThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn"); //Der zweite Parameter ist hier der im HTTP-Protokoll angegebene Anforderungsheader
//Wenn Sie es nicht verstehen, sehen Sie sich bitte die Definition im RFC an
fclose($fp);
}
Funktion a()
{
$fp = fopen('result_a.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
Funktion b()
{
$fp = fopen('result_b.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
if(!isset($_GET['act'])) $_GET['act'] = 'a';
if($_GET['act'] == 'a')
{
runThread();
A();
}
sonst if($_GET['act'] == 'b') b();
?>
------------------------------------------------ --------------------------------
Öffnen Sie result_a.log und result_b.log und vergleichen Sie die Zugriffszeiten der beiden Dateien. Sie werden feststellen, dass diese beiden tatsächlich in unterschiedlichen Threads ausgeführt werden.
Manchmal ist es genau das Gleiche.
Das Obige ist nur ein einfaches Beispiel, und Sie können es in andere Formen umwandeln.
Da Multithreading in PHP verfügbar ist, tritt ein Problem auf: Wir wissen, dass PHP selbst kein Multithreading unterstützt.
Was sollen wir also tun? 1.
Versuchen Sie, nicht auf dieselbe Ressource zuzugreifen, um Konflikte zu vermeiden. Da die Datenbank gleichzeitige Operationen unterstützt,schreiben Sie bei Bedarf keine Daten in
dieselbe
Datei Wenn Sie schreiben möchten, verwenden Sie andere Methoden zur Synchronisierung. Rufen Sie beispielsweise flock auf, um die Datei zu sperren. Oder erstellen Sie eine temporäre Dateiund warten Sie, bis die Datei in einem anderen Thread verschwindet. while(file_exits('xxx')); äquivalent zu Wenn diese temporäre Datei vorhanden ist, bedeutet dies
, dass diese Datei tatsächlich ausgeführt wird.
2. Versuchen Sie, nach der Ausführung von fputs keine Daten aus diesem Socket zu lesen Um Multithreading zu erreichen, ist es notwendig, den nicht blockierenden Modus zu verwenden. Das heißt, es kommt
sofort
zu Problemen beim Lesen und Schreiben von Daten Es muss auf die obige Rückgabe gewartet werden, bevor es ausgeführt werden kann. Wenn Sie also Daten austauschen müssen, können Sie es wirklich mit socket_set_nonblock() ausführen. $fp), um dies zu erreichen.
Hat dies überhaupt eine praktische Bedeutung?
Die Antwort lautet: Ja. Wie wir alle wissen, ist die Geschwindigkeit des Netzwerks ein Engpass Mit dieser Methode können Sie
verschiedene Seiten mit mehreren Threads gleichzeitig lesen.
Ich habe ein Programm erstellt, das nach Informationen auf Mall-Websites wie 8848 und soaso suchen kann. Es gibt auch ein Programm, das Geschäftsinformationen und Firmenverzeichnisse von der Alibaba-Website ausliest und
diese Technologie ebenfalls nutzt. Denn beide Programme müssen sich ständig mit ihren Servern verbinden, um Informationen auszulesen und in der Datenbank zu speichern. Durch den Einsatz dieser Technologie entfällt der Engpass beim Warten auf eine Antwort.