2013-07-08 9 views
5

* SOLUZIONE la risposta qui sotto *limite PHP forchetta Childs nel compito

ho avuto un problema con la limitazione Childs nello script php multifork ... Sembra come ultimo bambino non finisce mai .. Sono davvero stanco e non riesco a trovare l'errore, potresti aiutarmi per favore? E non finisce la maggior parte delle volte ...

<?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" 

>

dei risultati il ​​più delle volte è:?

[+][+][+][+][+][~][-][+][~][-][+][~][-][+][~][-][+][~][-][+][~][-][+][~][~][~][-][+] (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 ... 

Sembra come ultimo figlio non si esaurisce affatto o almeno lo grilletto doesnt handler in ordine a ...

  • [+] < - poco prima di sborsare - Numero di pagine: 12
  • [~] < - poco prima di uscire bambino - contare: 12
  • [-] < - handler in ordine dopo l'uscita del bambino - contare: 11

Aiuto?

PS. La cosa strana è che a volte finisce.

risposta

6

Ok trovato la soluzione:

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; 
    } 
} 

Il problema ha partecipato al modo di gestire segnali su sistemi UNIX. Tutti i messaggi inviati in un momento simile sono raggruppati in uno. La funzione sopra risolve quel problema. E non solo quello ... quando il bambino esce immediatamente, non segna più l'errore segfault ("zend_mm_heap corrupted" in alcune configurazioni/versioni PHP). E lo ha fatto nel caso precedente.

PS. Dovrei eliminare questa domanda, ma lascerò la soluzione a tutti coloro che hanno problemi simili come il multithreading negli script PHP è molto utile per alcune attività.

+0

Non hai eliminare questa domanda e questa risposta, perché è solo un singolo codice di lavoro reale che ho trovato! Peccato che non posso invitarvi due volte!) –