In Bezug auf PHP-Multithreading werden wir auf viele Probleme stoßen. Im folgenden Artikel geht es um kleine Projektprobleme mit PHP-Multithreading. Gleichzeitig haben wir drei Lösungen bereitgestellt.
Projektstatus:
Um 300W+ Benutzerdaten mit qcloud zu synchronisieren, können wir jeweils nur einen Curl synchronisieren, etwa 3 Synchronisierungen pro Sekunde, also haben wir 300W synchronisiert Es wird geschätzt, dass die Datenerfassung mehr als 10 Tage in Anspruch nimmt, daher habe ich darüber nachgedacht, das Problem mithilfe von Multithreading zu lösen.
Option 1:
Schreiben Sie eine Multiprozesslösung in C++ und verzweigen Sie mehrere Prozesse, um sie zu lösen. Der Hauptthread ist für das Lesen/Speichern von Daten verantwortlich, und der Unterthread ist für Curl verantwortlich.
Lösung 2:
Verwenden Sie PHP, um eine Multiprozesslösung zu schreiben, genau wie Lösung 1. Der Hauptthread liest und der untergeordnete Thread rollt.
Da PHP jedoch nicht über mehrere Prozesse verfügt, kann es Threads/Prozesse nicht direkt steuern. Daher können wir uns bei der Implementierung von Multiprozessen nur auf Linux verlassen.
Die PHP-Funktion pcntl_fork() kann einen Prozess erstellen, der dem Linux-Fork entspricht.
Der Unterschied zu fork besteht darin, dass die von pcntl_fork zurückgegebene 0 der untergeordnete Prozess ist und die zurückgegebene ID die PID des untergeordneten Prozesses ist (während fork für den übergeordneten Prozess 0 zurückgibt und der untergeordnete Prozess ppid zurückgibt). .
Hinweis: Die Funktion pcntl_fork() muss unter Linux vorhanden sein. Es heißt, dass das Modul pcntl.so geladen werden muss, aber es scheint, dass es nicht funktioniert.
Option 3:
PHP+Shell simuliert Multithreading
Zum Beispiel: Die Datei test.php implementiert die vom Projekt benötigten Funktionen (einschließlich Datenbanklesen und -schreiben usw.). curl)
Schreiben Sie eine weitere Shell wie folgt und speichern Sie sie als start.sh:
#!/bin/bash //指定bash,必须for(( i=0; i<20; i++))do php test.php & //执行test.php,&符号的意思是把该操作放在后台执行,这样shell就可以继续执行下一步sleep命令了。如果没有这个符号,shell会阻塞在这里。 sleep 1s done
Führen Sie abschließend die Shell aus, sudo ./start.sh
Die Shell wird Starten Sie 20 Prozesse gleichzeitig.
Aber da jeder Prozess dem Hauptprozess entspricht, sind die gemeinsamen Ressourcen schwer zu kontrollieren. In diesem Fall ist die gemeinsame Ressource nur die Datenbank Ich sperre die Datenbank jedes Mal, wenn ich sie betreibe. Siehe Details. Ein weiterer Artikel von mir. MySQL-Sperre. Denn im Vergleich zu Datenbankoperationen, die grundsätzlich jede Sekunde gelöst werden können, benötigt Curl Dutzende Sekunden oder mehr, um Hunderte von Nachrichten kontinuierlich zu senden, sodass die Datenbanksperre kaum Auswirkungen hat.
Zusammenfassung: Obwohl dies nur ein kleiner Fall zum Thema PHP-Multithreading ist, hoffe ich, dass Sie Ihr Gehirn einsetzen können, und ich hoffe, dass dieser Artikel Ihnen Ideen zur Lösung solcher Probleme geben kann.
Verwandte Empfehlungen:
java - pthreads ist PHP-Multithreading.
Socket - Verwendung von PHP-Multithreading, Multiprozess
Zwei Implementierungsmethoden von Multithreading in PHP
Das obige ist der detaillierte Inhalt vonKleiner PHP-Multithreading-Fall. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!