Dieser Artikel stellt hauptsächlich die Anweisungen zu PHP-Mehrprozessausführungsaufgaben vor. Er hat einen gewissen Referenzwert. Jetzt kann ich ihn mit allen teilen, die ihn benötigen.
Ja Eine bestimmte Anzahl mehrerer Aufgaben wird gleichzeitig ausgeführt und die Anzahl der Prozesse wird kontrolliert
Die Prozesse sind unabhängig voneinander und beeinflussen sich nicht gegenseitig.
Codebeispiel:
<?php $task = 0; //任务id $taskNum = 10; //任务总数 $processNumLimit = 2; //子进程总量限制 while(true){ //产生分支 $processid = pcntl_fork(); //创建子进程失败 if( $processid == -1 ){ echo "create process error!\n"; exit(1); } //主进程,获得子进程pid elseif($processid){ $task++; //下一个任务 $currentProcessid = posix_getpid(); //当前进程的Id $parentProcessid = posix_getppid(); // 父级进程的ID $phpProcessid = getmypid(); //当前php进程的id echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\n"; //控制进程数 if($task >= $processNumLimit) { echo "wait chl start!\n"; $exitid = pcntl_wait($status); //等待退出 echo "wait chl end!extid:",$exitid,"\tstatus:",$status,"\n"; } //任务总量控制 if($task >= $taskNum) { echo "taskNum enough!\n"; break; } } //processid=0为新创建的进程 else{ //模拟不同任务的不同执行时长 $sleep = rand(1, 5); $currentProcessid = posix_getpid(); //当前进程的Id $parentProcessid = posix_getppid(); // 父级进程的ID $phpProcessid = getmypid(); //当前php进程的id echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\tsleep:",$sleep,"\tbegin!\n"; sleep($sleep); echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\tsleep:",$sleep,"\tend!\n"; exit(0); //子进程执行完后退出,防止进入循环创建子进程 } }
Ausführungsergebnis:
task:1 processid:32225 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 task:0 processid:0 currentProcessid:32225 parentProcessid:32224 phpProcessid:32225 sleep:5 begin! task:2 processid:32226 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:1 processid:0 currentProcessid:32226 parentProcessid:32224 phpProcessid:32226 sleep:2 begin! task:1 processid:0 currentProcessid:32226 parentProcessid:32224 phpProcessid:32226 sleep:2 end! wait chl end!extid:32226 status:0 task:3 processid:32228 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:2 processid:0 currentProcessid:32228 parentProcessid:32224 phpProcessid:32228 sleep:1 begin! task:2 processid:0 currentProcessid:32228 parentProcessid:32224 phpProcessid:32228 sleep:1 end! wait chl end!extid:32228 status:0 task:4 processid:32229 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:3 processid:0 currentProcessid:32229 parentProcessid:32224 phpProcessid:32229 sleep:2 begin! task:0 processid:0 currentProcessid:32225 parentProcessid:32224 phpProcessid:32225 sleep:5 end! wait chl end!extid:32225 status:0 task:5 processid:32270 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:4 processid:0 currentProcessid:32270 parentProcessid:32224 phpProcessid:32270 sleep:1 begin! task:3 processid:0 currentProcessid:32229 parentProcessid:32224 phpProcessid:32229 sleep:2 end! wait chl end!extid:32229 status:0 task:6 processid:32271 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:5 processid:0 currentProcessid:32271 parentProcessid:32224 phpProcessid:32271 sleep:4 begin! task:4 processid:0 currentProcessid:32270 parentProcessid:32224 phpProcessid:32270 sleep:1 end! wait chl end!extid:32270 status:0 task:7 processid:32273 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:6 processid:0 currentProcessid:32273 parentProcessid:32224 phpProcessid:32273 sleep:1 begin! task:6 processid:0 currentProcessid:32273 parentProcessid:32224 phpProcessid:32273 sleep:1 end! wait chl end!extid:32273 status:0 task:8 processid:32274 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:7 processid:0 currentProcessid:32274 parentProcessid:32224 phpProcessid:32274 sleep:2 begin! task:5 processid:0 currentProcessid:32271 parentProcessid:32224 phpProcessid:32271 sleep:4 end! task:7 processid:0 currentProcessid:32274 parentProcessid:32224 phpProcessid:32274 sleep:2 end! wait chl end!extid:32274 status:0 task:9 processid:32277 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! wait chl end!extid:32271 status:0 task:8 processid:0 currentProcessid:32277 parentProcessid:32224 phpProcessid:32277 sleep:2 begin! task:10 processid:32278 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:9 processid:0 currentProcessid:32278 parentProcessid:32224 phpProcessid:32278 sleep:2 begin! task:8 processid:0 currentProcessid:32277 parentProcessid:32224 phpProcessid:32277 sleep:2 end! task:9 processid:0 currentProcessid:32278 parentProcessid:32224 phpProcessid:32278 sleep:2 end! wait chl end!extid:32277 status:0 taskNum enough
Nachdem pcntl_fork einen untergeordneten Prozess erstellt hat, Das Kind Der Prozess führt den Funktionscode aus und der übergeordnete Prozess erhöht weiterhin die Aufgaben-ID und erstellt den nächsten Aufgabenprozess.
Warten Sie bis pcntl_wait, bis die Ausführung des untergeordneten Prozesses abgeschlossen ist, und beenden Sie ihn dann Erstellen Sie einen neuen Prozess, um die Gesamtzahl der Prozesse zu erreichen.
Nachdem der Hauptprozess die Erstellung abgeschlossen hat, verlassen Sie die Schleife durch Pause. Möglicherweise werden derzeit noch untergeordnete Prozesse ausgeführt.
Generieren Sie einen Zweig (untergeordneten Prozess) an der aktuellen Position des aktuellen Prozesses. Bei Erfolg wird die PID des generierten untergeordneten Prozesses im Ausführungsthread des übergeordneten Prozesses und 0 im Ausführungsthread des untergeordneten Prozesses zurückgegeben. Bei einem Fehler wird -1 im übergeordneten Prozesskontext zurückgegeben, der untergeordnete Prozess wird nicht erstellt und ein PHP-Fehler wird ausgelöst.
Warten oder den untergeordneten Prozessstatus von fork zurückgeben. Die Wartefunktion unterbricht die Ausführung des aktuellen Prozesses, bis ein untergeordneter Prozess beendet wird oder ein Signal empfängt, das eine Unterbrechung des aktuellen Prozesses oder den Aufruf einer Signalverarbeitungsfunktion erfordert. Wenn ein untergeordneter Prozess beim Aufruf dieser Funktion beendet wurde (allgemein als Zombie-Prozess bekannt), kehrt diese Funktion sofort zurück. Alle vom untergeordneten Prozess verwendeten Systemressourcen werden freigegeben.
1. Probleme mit Zombie-Prozessen und verwaisten Prozessen
Einige Zombie-Prozesse erhalten den Status und geben Ressourcen durch pcntl_wait frei, und nicht genutzte Prozesse werden zu verwaisten Prozessen. Der Waisenprozess wird vom Init-Prozess übernommen, um die Statuserfassung und Ressourcenfreigabe des Wartens abzuschließen.
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Studium aller hilfreich ist. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.
Verwandte Empfehlungen:
PHP-Variablenbereich, globale, statische und andere Schlüsselwörter
Das obige ist der detaillierte Inhalt vonAnweisungen für PHP-Mehrprozessausführungsaufgaben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!