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.
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.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"; } ?>
Dove sbaglio?![]()
Grazie a tutti!!

Rispondi quotando
