2011-12-17 9 views
8

Al migrar un script PHP de PHP 5.2 a PHP 5.3, me he tropezado con el siguiente problema: El propósito general del script es la extracción de datos. Tengo un procedimiento interno que agrega datos al servidor MySQL. Dado que es realmente repetitivo, lo he reescrito (hace un tiempo) para usar MySQLi, en particular sentencias preparadas, ya que hay un total de 3 posibles consultas para realizar. De todos modos, ahora, en el servidor PHP 5.3, el guión está fallando en la línea siguiente:PHP extraños Seg-faults en mysqli_stmt_bind_result

mysqli_stmt_bind_result($prepCheck, $id1); 

donde se crea $prepCheck con $prepCheck = mysqli_prepare($con, $checkQuery) or die("Error");. La consulta funciona bien en el servidor MySQL ($ checkQuery, eso es) y el código PHP también funcionaba en el servidor anterior.

Al ejecutar la secuencia de comandos con strace no se reveló nada, ya que lo último en ello es la llamada al sistema para echo "Execute";, que es 29936 19:44:18 write(1, "Execute\n", 8) = 8.

El objeto de conexión no es FALSE, e incluso si lo fuera, debería fallar con otro error, ¿no?

Aquí viene la parte más extraña: Este procedimiento no falla cuando corro el guión, lo que limita el número de páginas visitadas y el guión se completa satisfactoriamente. Sin embargo, cuando establezco un límite superior, falla, siempre en la primera llamada a este procedimiento, y precisamente en esta línea.

Si alguien tiene alguna sugerencia de lo que podría estar causando esto, sería muy apreciado.

Puedo pegar código si alguien necesita ver una imagen más grande, pero el procedimiento es muy largo y aburrido hasta la muerte (puede ser por eso que el guión está fallando :).

Así es como comienza el script: error_reporting(E_ALL); ini_set('display_errors', '1');. No se informaron errores además del 'mágico' Segmentation fault. No estoy usando APC.

No estoy seguro de si es relevante, pero estoy usando CLI para ejecutar el script, no una interfaz web.

La versión de PHP es 5.3.8, la versión de MySQL es 5.1.56. El límite de memoria está configurado en 64 MB.

EDITAR: El procedimiento que falla + parte del otro código se carga aquí: http://codepad.org/KkZTxttQ. El archivo completo es enorme y feo, y creo que es irrelevante, así que no lo estoy publicando por ahora. La línea que está fallando es 113.

+0

¿Simplemente trató de volver a instalar php-cli? ¿Hay algo sospechoso en el registro de errores? (¿Incluso tienes un registro de error para el cli)? ¿Tienes un PC? –

+0

A sus preguntas, en orden: intentaré reinstalar php-cli, aún no lo he probado; El registro se establece en el nivel máximo y, sin embargo, solo aparece "Error de segmentación" antes del bloqueo, lo agregaré a la declaración de la pregunta y no, no tengo APC. Gracias por su tiempo :) –

+0

@ K.Steff 'el procedimiento es muy largo y aburrido hasta la muerte (puede ser por eso que el guión está fallando :).' - ROFL :) sin embargo, probablemente sería una idea mostrarnos el código , especialmente porque este es un problema de sonido tan extraño. Asegúrese de incluir el código para el mecanismo limitante que puede "arreglar" el problema bajándolo, sospecho que la clave está ahí en alguna parte. Si no puede razonablemente publicarlo todo aquí, intente con [codepad] (http://codepad.org/). Y, por un largo camino (en mi humilde opinión) la causa más común de SIGSEGV es un ciclo infinito o recursión de función infinita. – DaveRandom

Respuesta

1

una respuesta a mi propia pregunta, ya he resuelto el problema, y ​​no hay otras respuestas ...

crédito va a @ jap1968 para señalándome a la función mysqli_stmt_error (que asumí que no necesitaría, ya que tengo error_reporting(E_ALL)).

El problema era que MySQL tenía una configuración por defecto muy raro: particularmente

connect_timeout = 10 
wait_timeout = 30 

Esto hizo que el servidor MySQL para cerrar la conexión después de sólo 30 segundos (por defecto es más que una media hora, según el sitio web MySQL) Esto a su vez, provocó que la función mysqli_stmt_bind_result fallara con una falla de segmentación.

+1

¿Ha informado de la falla de segmentación en el bugtracker de PHP? – hakre

+0

Honestamente, no lo hice se da cuenta de que era un error en PHP. Ahora que lo pienso, probablemente debería reaccionar de otra manera. Así que no, no lo hice, pero lo buscaré, y si falta, lo reportaré. –

+0

Eso sería realmente amable de ti tú También es posible que desee averiguar si esto todavía falla segfault con una versión actual. Averigué tu pregunta hoy, de lo contrario, ya lo comenté antes. Avíseme si necesita ayuda. – hakre

Cuestiones relacionadas