pcntl_fork() PHP

Hmm malce se spogledujem z njim, pa nisem čisto ziher kako se stvar obnaša... Najbolje bi bilo sicer probati vendar dajmo raje malce teorije, preden grem programirat in na koncu dojamem da to sploh ni to...

Skratka, želim izvesti več funkcij, ki so že spisane in sicer vse hkrati... ala multithreading. Na simpl bi sicer šlo z CURL-om, vendar ker imam že spisane funkcije in jih ne bi rad večji del še enkrat spisal, bi raje uporabil pcntl_fork() se pravi da bi spawnal nekaj childov, ki bodo executali vsak svojo funkcijo, ter nastavili spremenljivke, ki jih potem v glavnem programu nadalje prikažem. Gre se predvsem zato, da bi se funkcije izvršile hitreje in ne bi bilo potrebno čakati predolgo časa da neka funkcija konča svoje delo.

$spremenljivke = array();

$pids = array();
for($i = 0; $i < 3; $i++) {
  $pids[$i] = pcntl_fork();
  if(!$pids[$i]) {
    // child proces
    $spremenljivke[$i] = klicem_funkcijo();
    exit();
  }
}
for($i = 0; $i < 3; $i++) {
  pcntl_waitpid($pids[$i], $status, WUNTRACED);
}

print_r($spremenljivke);

Bodo ob taki kodi vsi childi executani hkrati ali ne ?

Hvala za odgovor...

2 odgovora

PHP ne podpira multithreading programiranja. Najbols kar lahko nardis je simulacija le-tega z uporabo pcntl-ja. Ampak to kreira povsem nove procese, ki imajo edino zvezo s parentom, da ko umrejo, sistem pošlje SIGCHLD parentu in le-ta lahko prebere exit status umrlega childa. Boš moral pa sam spedenati IPC za vračanje rezultatov itd.

Še mal informacij tukej:
http://phplens.com/phpeverywhere/?q=node/view/254

Ena stvarca, ki sem jo jaz naredil z uporabo pcntlja (standalone application server in php) je pa tukaj, če rabiš primere uporabe in IPCja:
http://github.com/bostjan/PHP-application-server

Na koncu sem se odločil za cURL... ker ta podpira multithreading. Tako da sem hardcodov zadevo, čeprov sm mogu večino kode spremenit in je blo precej težje kot bi bilo z pcntl_forkom...

Poleg vsega potrebuje php tudi podporo in recompile, če nima pcntl modula že vključenega, kar pa ne pride v poštev...

Lepa hvala za odgovor vseeno.