2012-06-03 19 views

risposta

26

PCNTL non può creare thread. È solo "forca" l'attuale processo PHP. Cosa significa? Quando chiami pcntl_fork(), il processo corrente viene diviso in due processi. L'intero spazio dei nomi del processo padre viene copiato nel figlio ed entrambi i processi continuano con l'esecuzione in parallelo con una sola differenza: pcntl_fork() restituisce il PID secondario in parent e 0 in child.

Alcuni indizi:

  • è disabilitato per impostazione predefinita. Se riesci ad abilitarlo, fallo solo per CLI. Mai e poi mai usarlo con il web server! Si comporterà in modo non deterministico. Può anche abbattere l'intera macchina. Per favore, lasciatelo disabilitato e continuate a leggere.
  • La comunicazione tra i processi è possibile ma orribile (tramite l'oggetto serializzato nella memoria condivisa).
  • I descrittori di file (e le connessioni del database ) sono condivisi, questo causa problemi molto spesso. È necessario ricollegare il DB dopo aver forato o si otterranno errori come MySQL server has gone away da tutti i processi biforcati quando prima si chiude la connessione.
  • Il processo del genitore deve attendere che i bambini finiscano o lascerà i processi zombie che consumano risorse di sistema.

Ecco esempio from documentation:

<?php 

$pid = pcntl_fork(); 
if ($pid == -1) { 
    die('could not fork'); 
} else if ($pid) { 
    // we are the parent 
    pcntl_wait($status); //Protect against Zombie children 
} else { 
    // we are the child 
} 

Ma ricordate, PHP è solo linguaggio di scripting. Non è progettato per il calcolo parallelo. Si potrebbe fare un lavoro migliore con CRON, code di messaggi o programmi contemporaneamente in linguaggio di livello inferiore, a seconda delle esigenze.

Il programma PHP biforcuto è molto difficile da leggere, comprendere e eseguire il debug. Mantenere quel programma sarà un incubo.

Non fare errori ed evitare di biforcarsi. Non ne hai bisogno. Quello di cui hai veramente bisogno è un task manager asincrono. Buone notizie, non v'è RabbitMQ e nice tutorial ;-) Potete anche provare promettendo biblioteca RabbitMQ chiamato Bunny

PS: Usando le code di messaggi invece di biforcazione ti dà un altro vantaggio. È possibile elaborare la coda con più server e ridimensionarla orizzontalmente man mano che il traffico aumenta.

+0

Grazie la risposta mi ha aiutato :) –