Salve a tutti,
il problema che sto cercando di risolvere è il seguente.
Ho uno script con un lunghissimo array (800 elementi) in cui ciascun elemento deve essere opportunamente elaborato per un tempo variabile da qualche millisecondo fino al caso peggiore di ben 4 secondi.
Se fate quindi i conti, nel caso peggiore l'esecuzione del mio script durerebbe quasi un'ora!
La soluzione è quindi sfruttare al meglio i 4 core del web server che ospita lo script effettuando un FORK su 4 figli, e far elaborare a ciascuno di esso circa 200 elementi contemporaneamente.
Logicamente il tutto dovrebbe funzionare.
Ho scritto un codice di prova dove l'array conta solo 47 elementi giusto per simulazione.



codice:
<?php 
function esecuzione($i,$arr,$inizio,$fine){ 
	$fp = fopen("forktest", "a");
 	for($a=$inizio;$a<=$fine;$a++) { 
		sleep(rand(0,1)); 
		fwrite($fp, "SONO IL FIGLIO ".$i." elaborato elemento ".$arr[$a]."\n");
	 	} 
        fclose($fp); 
}       
$arr=array(); 
$dim_arr = 46; /////////////////////////////////////CREO L'ARRAY 
for($x=1;$x<=$dim_arr;++$x){ 	
$arr[]=$x;
 } /////////////////////////////////////CREO GLI INDICI NEL CASO DI 4 CORE 
$num_core=4;  
$start_1=1; 
$end_1=round(count($arr)/$num_core);    
$start_2=$end_1+1; 
$end_2=(2*$end_1);   
$start_3=$end_2+1;
 $end_3=(3*$end_1);   
$start_4=$end_3+1;
 $end_4=count($arr); //L'ultimo arriva fino alla fine  
for ($i = 1; $i <= 4; ++$i) {        
     $pid = pcntl_fork();         
      if (!$pid) { 	    	   
	switch($i) { 		
                       case 1:
   esecuzione($i,$arr,$start_1,$end_1);	 			
case 2 : 
   esecuzione($i,$arr,$start_2,$end_2); 
case 3 :
  esecuzione($i,$arr,$start_3,$end_3); 	
case 4 : 
 esecuzione($i,$arr,$start_4,$end_4); 				 		} 		exit($i);       
  } 

 }      
while (pcntl_waitpid(0, $status) != -1) {        
 $status = pcntl_wexitstatus($status);         
echo "Child $status completed\n";   
  } ?>
Adesso, qualcuno mi spiega perchè non funziona??L'output che leggo sul file forktest mi mostra che ciascun figlio esegue lo scan dell'intero array anzichè della parte che volevo assegnargli.
Dove sbaglio?
Grazie a tutti!!