2010-09-08 11 views
15

Tengo un bucle foreach que se bifurca dentro de él. Después de que el proceso se bifurca, accede a la base de datos. Me aparece un error:pcntl_fork y la conexión MySQL se ha ido

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

Lo que pasa es que estoy conectarse a la base de datos después de He bifurcada.

Mi pregunta: ¿Por qué estaría sucediendo esto?

Si esto sucede, ¿estoy realmente accediendo a la base de datos antes de bifurcación? ¿El niño heredará conexiones de DB?

(nota: Puedo publicar el código, pero es bastante grande, ya que todo está en clases, lo que podría ser lo que está causando mi confusión cuando estoy accediendo al DB. Otra cosa que debes saber es que estoy usando ZF .)

+0

No he jugado con Zend Framework pero me pregunto si mantiene algún tipo de agrupación interna de conexiones de bases de datos. ¿O tal vez está haciendo conexiones persistentes? Aparte de eso, los niños no deberían heredar conexiones de db o cualquier otra cosa, ya que son procesos de php diferentes. – Fanis

+0

Ack, me corrigen. Mi respuesta anterior se basó en la intuición, pero no en la experiencia personal, ya que aún no se ha requerido. Leyendo más en él veo que los niños bifurcados heredan la conexión db de sus padres, y es un problema conocido: http://www.php.net/manual/en/function.pcntl-fork.php#70721 – Fanis

+0

@Fanis - Can ¿conviertes tu último comentario en una respuesta para poder hacer clic en el gran cheque verde? Gracias por extraer esta información. No voy a bifurcar, en cambio voy a ejecutar un nuevo proceso que tendrá su propia conexión de DB. Luego se bifurcará, para no vincular el proceso de llamada, y luego hacer su trabajo en el niño, registrando es pid a un registro que otro cron-started-process vendrá y comprobará si se ha completado. Hmmmm ... ¡Podría funcionar esta vez! ¡Gracias! –

Respuesta

13

(comentario -> respuesta a solicitud del cartel)

lectura más en él veo a los niños bifurcadas heredan conexión db de sus padres, y es un problema conocido: http://php.net/manual/en/function.pcntl-fork.php#70721

+0

Solo pensé en aclarar: El motivo por el que recibí el error, aunque el hijo heredó la conexión de db es que estoy creando un conjunto de procesos nuevos que necesitan una conexión de db. –

2

excepto que es no es un problema . Es la forma en que se diseñó pcntl_fork. Cualquier extensión (como lo indica claramente la documentación) que mantiene sus propias descripciones de archivos tendrá descriptores dañados porque todos los elementos secundarios y los padres comparten los mismos descriptores de archivo.

0

Puede evitar la conexión de cierre cuando bifurcada de salida del proceso, si matas proceso en forma de horquilla con SIGKILL.

<?php 
$dbh = new PDO('pgsql:host=localhost', $username, $password); 
$pid = pcntl_fork(); 
if($pid == 0){ 
     register_shutdown_function(function(){ 
       posix_kill(getmypid(), SIGKILL); 
     }); 
     exit; 
} 
sleep(1); 
$statement = $dbh->query('select 1'); 
var_dump($statement); 

La razón de este comportamiento, que cuando el proceso de PHP es la salida, que PHP envía al servidor de base de comando "Terminar la conexión". Pero el sistema cerrará el socket solo cuando todos los enlaces al socket estén cerrados. El uso de SIGKILL nos ayuda a evitar el envío del comando "Terminar conexión" al servidor de la base de datos.

Cuestiones relacionadas