2009-09-23 17 views
11

Tengo problemas para usar la clase mysqli en PHP y no he podido encontrar la respuesta en ningún lado.Problema de reconexión de MySQL de PHP

En mi secuencia de comandos, una clase crea una conexión mysqli que utiliza en todas sus funciones. Después, este script se bifurca. La conexión también es utilizada por los niños, pero me estoy enfrentando al problema de la conexión que se cierra (el servidor MYSQL se ha ido) en el padre cuando los niños mueren.

Antes de cambiar a mysqli (solo estaba usando mysql) simplemente llamé a mysql_ping para asegurarme de que la conexión db estaba allí antes de realizar la consulta en el proceso principal. Mysqli tiene una función de ping similar, pero en realidad no se vuelve a conectar si la conexión se ha ido. Intenté utilizar la configuración global mysqli.reconnect = ON sin suerte (usando php.ini e ini_set).

La función php mysql_connect le permite tomar una conexión ya existente, así que si estaba usando mysql en lugar de mysqli, simplemente podría reutilizar la conexión en el niño inmediatamente después del proceso bifurcado. PERO mysqli no parece tener esa funcionalidad ...

Lo único que pude hacer fue llamar a mysqli-> ping() y si eso devuelve falso, vuelva a conectarlo a la base de datos en el principal. Esto es terriblemente ineficiente, y yo preferiría encontrar la manera de hacerlo correctamente con mysqli (y sin necesidad de reconexiones manuales) que tener que cambiar de nuevo a mysql ..

¿Alguna sugerencia?

Respuesta

13

El doc para mysqli_ping() dice que si se establece la opción mundial mysqli.reconnect a 1 (en su php.ini) entonces mysqli_ping() se volverá a conectar cuando se detecta la conexión se ha ido.

+3

Eso funcionó. No me di cuenta de que no podías usar ini_set para modificar esta variable, y siendo el genio que soy, agregué la línea a php.ini antes, sin saber que ya había un mysli.reconnect = Off línea más abajo del archivo. Pero eliminar ese y simplemente usar mysqli.reconnect funcionó e hizo que mysqli-> ping() funcionara igual que mysql_ping. ¡Gracias por la ayuda! –

0

u puede probar algo un poco diferente .. en lugar de mesa de ping .. tratar de enviar una consulta muy simple de baja intensidad como "seleccionar ahora () "y ver si obtienes mejores resultados.

+0

la razón por la que podría ayudar ... mysql lo ve a usted como un usuario activo en lugar de alguien que solo está sosteniendo una conexión y acaparando los recursos ... creo que hay algunas configuraciones de tiempo de espera en my.ini/my.cnf que afectan ese comportamiento ... si tienes acceso a eso, también puedes verlo. –

0

¿No puedes usar las conexiones persistentes? Además, ¿es realmente necesario para tenedor()?

-2

Creo que necesita establecer mysqli.reconnect en my.cng, que es la configuración de mysql, en lugar de php.ini, no pude lograr cambiar la reconexión a través de ini_set, pero mi administrador del sistema lo hizo en mi. cnf.

Así, poco confusa que otros lo han hecho dentro de php.ini ....

+0

No es cierto. 'my.cnf' se relaciona solo con el servidor MySQL, por lo que normalmente no tiene influencia en un cliente PHP, y' mysqli' solo existe en PHP. [mysqli.reconnect] (http://www.php.net/manual/ es/mysqli.configuration.php # ini.mysqli.reconnect) * es * una configuración de PHP. – Synchro

1
function IsConnected() { 
    if (empty($this->_connectionID) === FALSE && mysqli_ping($this->_connectionID) === TRUE) { 
     return true; // still have connect 
    } 
    $this->_connectionID = false; 
    return false; // lose connection 
} 
Cuestiones relacionadas