2010-09-08 1 views
15

Ho un ciclo foreach che si trova all'interno di esso. Dopo il processo si biforca, accede al database. Ottengo un errore:pcntl_fork e la connessione MySQL sono scomparsi

SQLSTATE[HY000]: General error: 2006 MySQL server has gone away 

Il fatto è che sto connessione al database dopo ho biforcuta.

La mia domanda: perché questo dovrebbe accadere?

In questo caso, accedo effettivamente al database prima del biforcimento? Il bambino erediterà le connessioni DB?

(nota: posso postare codice, ma è piuttosto grande in quanto è tutto in classe, che potrebbe essere ciò che sta causando la mia confusione quando sto accedendo al DB. Un'altra cosa che dovresti sapere è che sto usando ZF .)

+0

Non ho giocato con Zend Framework ma mi chiedo se mantiene una sorta di pooling interno di connessioni al database. O forse sta facendo collegamenti persistenti? Oltre a questo, i bambini non dovrebbero ereditare connessioni db o qualsiasi altra cosa in quanto sono diversi processi di php. – Fanis

+0

Ack, sono corretto. La mia risposta sopra era basata sull'intuizione, ma non sull'esperienza personale, poiché non era ancora richiesta. Leggendo di più in esso vedo che i bambini biforcuti ereditano la connessione db dei loro genitori, ed è un problema noto: http://www.php.net/manual/en/function.pcntl-fork.php#70721 – Fanis

+0

@Fanis - Can trasformi il tuo ultimo commento in una risposta in modo da poter fare clic sul grande assegno verde? Grazie per aver estratto queste informazioni. Non forzo, eseguirò invece un nuovo processo che avrà la propria connessione db. In seguito andrà a sborsare, in modo da non legare il processo di chiamata, e poi farlo funzionare nel bambino, registrando il suo pid in un log che un altro processo avviato da cron arriverà e controllerà se è stato completato. Hmmmm ... Potrebbe funzionare solo questa volta! Grazie! –

risposta

13

(commento -> risposta da richiesta del poster)

lettura più in esso vedo i bambini biforcuta ereditano connessione db dei loro genitori, e si tratta di un problema noto: http://php.net/manual/en/function.pcntl-fork.php#70721

+0

Ho solo pensato di chiarire: il motivo per cui ho ricevuto l'errore anche se il figlio ha ereditato la connessione db è che sto creando una serie di nuovi processi che hanno tutti bisogno di una connessione db. –

2

tranne che è non è un problema . È il modo in cui pcntl_fork è stato progettato. Qualsiasi estensione (come afferma chiaramente la documentazione) che mantiene i propri descrittori di file avrà quindi descrittori corrotti perché tutti i bambini e i genitori condividono gli stessi descrittori di file.

0

È possibile evitare il collegamento di chiusura quando biforcuta di uscita del processo, se si uccide processo biforcuta con SIGKILL.

Il motivo di questo comportamento, che quando il processo PHP è in uscita, di PHP invia al comando del database "Termina connessione". Ma il socket verrà chiuso dal sistema solo quando tutti i collegamenti al socket saranno chiusi. Usando SIGKILL aiutaci a evitare di inviare il comando "Termina connessione" al server del database.