2013-07-08 22 views
5

* Ben multifork php komut çocuk herkesin sınırlayan bir sorunun mu var *PHP çatal sınırı

ALTINDA CEVAP ÇÖZÜM ... son çocuk hiç bitmez gibi görünüyor görev childs .. Gerçekten yoruldum ve hatayı bulamıyorum, lütfen yardım edebilir misiniz? ?

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

son çocuk gibi görünüyor

tüm sona ya da en azından o doesnt tetik değildir: O

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

>

Sonucu en çok katıdır ... zamanların en bitmiyor sig işleyicisi ...

  • [+] < - sadece çatallanmasını önce - sayısı: 12
  • [~] < - sadece çocuk çıkışından hemen önce - saymak: 12
  • [-] < - sig işleyicisi sonra çocuk çıkış - saymak: 11

Yardım?

PS. Garip olan şey, bazen bitiyor olmasıdır.

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

sorun UNIX sistemlerinde sinyal işleme şekilde oldu:

cevap

6

Tamam çözüm bulundu. Benzer zamanda gönderilen tüm siglar bire gruplandırılmaktadır. Yukarıdaki işlev bu sorunu giderir. Ve sadece o değil ... Çocuğun hemen çıktığı zaman, bazı PHP yapılandırmalarında/sürümlerinde segfault ("zend_mm_heap bozuk" hatası) artık yoktur. Ve önceki durumda yaptı.

PS. Bu soruyu silmem gerekir, fakat PHP komut dosyalarındaki çoklu iş parçacığı gibi bazı problemler yaşayan herkes için çözümden ayrılacağım bazı görevler için çok faydalıdır.

+0

Bu soruyu ve bu yanıtı silmediniz, çünkü bulduğum tek gerçek çalışma kodu! Yazık ki seni iki kere alamam!) –