2013-07-08 9 views
5

* LÖSUNG IN DER ANTWORT UNTER *PHP Gabel Limit Childs in der Task

ich ein Problem mit Kindern im multifork PHP-Skript zu begrenzen ... Scheint wie letztes Kind endet nie .. Ich bin wirklich müde und kann den Fehler nicht finden, könnten Sie bitte helfen? Es ist nicht die meisten Zeiten enden ...

<?php 
declare(ticks = 1); 

$max=5; 
$child=0; 

function sig_handler($signo) { 
    global $child; 
    switch ($signo) { 
     case SIGCHLD: 
     $child -= 1; 
     echo "[-]"; 
    } 
} 

pcntl_signal(SIGCHLD, "sig_handler"); 

$found = array(1,2,3,4,5,6,7,8,9,10,11,12); 

echo "LETS GO!\n"; 

foreach($found as $item){ 

      while ($child >= $max) { 
      sleep(1); 
     } 

     $child++; 
     echo "[+]"; 
     $pid=pcntl_fork(); 

     if($pid){ 
     }else{ // CHILD 
      sleep(rand(1,5)); 
      echo "[~]"; 
      exit(0); 
     } 

} 

while($child != 0){ 
    echo "($child)"; 
    sleep(1); 
} 

echo "THE END.\n" 

>

Ergebnis meiste Zeit ist:

[+][+][+][+][+][~][-][+][~][-][+][~][-][+][~][-][+][~][-][+][~][-][+][~][~][~][-][+] (5)[-](4)(4)[~][-](3)[~][-](2)(2)[~](2)[-](1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)... etc etc ... 

wie letztes Kind scheint am Ende gar nicht oder zumindest tut Trigger sig-Handler ...

  • [+] < - kurz vor Forking - Anzahl: 12
  • [~] < - kurz vor dem Kind Ausfahrt - zählen: 12
  • [-] < - sig Handler nach Kind Ausfahrt - zählen: 11

Hilfe?

PS. Das Seltsame ist, dass es manchmal endet.

Antwort

6

Ok fand die Lösung:

function sig_handler($signo){ 
    global $child; 
    switch ($signo) { 
    case SIGCLD: 
     while(($pid = pcntl_wait ($signo, WNOHANG)) > 0){ 
     $signal = pcntl_wexitstatus ($signo); 
     $child -= 1; 
     echo "[-]";  
     } 
    break; 
    } 
} 

Das Problem in der Art und Weise war Signale auf UNIX-Systemen zu verarbeiten. Alle in ähnlicher Zeit gesendeten Signale werden zu einer Gruppe zusammengefasst. Die obige Funktion behebt dieses Problem. Und nicht nur das ... wenn child sofort beendet wird, segmet es nicht mehr ("zend_mm_heap korrumpiert" Fehler in einigen PHP Konfigurationen/Versionen). Und es hat im vorherigen Fall getan.

PS. Ich sollte diese Frage löschen, aber ich werde die Lösung für alle, die ähnliche Probleme haben, hinterlassen, da Multithreading in PHP-Skripten für einige Aufgaben sehr nützlich ist.

+0

Sie haben diese Frage und diese Antwort nicht löschen, weil es nur einzelne echte Arbeitscode, den ich gefunden habe! Schade, dass ich dich nicht zweimal upbooten kann!) –