2011-12-17 17 views
8

Durante la migrazione di uno script PHP da PHP 5.2 a PHP 5.3, sono incappato nel seguente problema: Lo scopo generale dello script è il data mining. Ho una procedura interna che aggiunge dati al server MySQL. Dal momento che è davvero ripetitivo, l'ho riscritto (qualche tempo fa) per usare MySQLi, in particolare le istruzioni preparate, poiché ci sono un totale di 3 possibili query da eseguire. Comunque, ora, sul server PHP 5.3, lo script si blocca sulla riga seguente:PHP Errori di segmento strani su mysqli_stmt_bind_result

mysqli_stmt_bind_result($prepCheck, $id1); 

Dove $prepCheck è stato creato con $prepCheck = mysqli_prepare($con, $checkQuery) or die("Error");. La query viene eseguita correttamente sul server MySQL ($ checkQuery, ovvero) e anche il codice PHP funzionava sul server precedente.

L'esecuzione dello script con strace non ha rivelato nulla, poiché l'ultima cosa in esso è la chiamata di sistema per echo "Execute";, che è 29936 19:44:18 write(1, "Execute\n", 8) = 8.

L'oggetto di connessione non è FALSE e anche se lo fosse, dovrebbe non riuscire con un altro errore, giusto?

Qui viene la parte più strana: Questa procedura non manca quando si esegue lo script, limitando il numero di pagine visitate e lo script viene completata correttamente. Tuttavia, quando imposto un limite superiore, fallisce, sempre alla prima chiamata a questa procedura, e precisamente su questa linea.

Se qualcuno ha qualche suggerimento su cosa potrebbe causare questo, sarebbe molto apprezzato.

Posso incollare il codice se qualcuno ha bisogno di vedere un'immagine più grande, ma la procedura è molto lunga e noiosa fino alla morte (potrebbe essere per questo che lo script non funziona :).

Ecco come inizia lo script: error_reporting(E_ALL); ini_set('display_errors', '1');. Nessun errore riportato oltre al 'magico' Segmentation fault. Non sto usando APC.

Non sono sicuro se è rilevante, ma sto usando CLI per eseguire lo script, non un'interfaccia web.

La versione di PHP è 5.3.8, la versione di MySQL è 5.1.56. Il limite di memoria è impostato su 64 MB.

MODIFICA: la procedura non riuscita + parte dell'altro codice viene caricata qui: http://codepad.org/KkZTxttQ. L'intero file è enorme e brutto, e credo irrilevante, quindi non lo sto postando per ora. La linea che è mancato è 113.

+0

Hai semplicemente provato a reinstallare il php-cli? C'è qualcosa di sospetto nel registro degli errori? (Hai anche un log degli errori per il cli)? Avete un PC? –

+0

Per le tue domande, nell'ordine: proverò a reinstallare php-cli, non l'ho ancora provato; La registrazione è impostata al livello massimo, eppure solo "Errore di segmentazione" appare prima del crash, aggiungerò questo alla dichiarazione della domanda e no, non ho APC. Grazie per il tuo tempo :) –

+0

@ K.Steff 'la procedura è molto lunga e noiosa fino alla morte (potrebbe essere per questo che lo script non funziona :).' - ROFL :) comunque sarebbe probabilmente un'idea per mostrarci il codice , specialmente perché questo è un problema così strano. Assicurati di includere il codice per il meccanismo di limitazione che può "risolvere" il problema abbassandolo, ho il sospetto che la chiave sia lì da qualche parte. Se non riesci a postare tutto ragionevolmente qui, prova [codepad] (http://codepad.org/). E, a lungo termine (IMHO), la causa più comune di SIGSEGV è un ricircolo infinito di loop o di funzione infinita. – DaveRandom

risposta

1

Una risposta alla mia domanda, dal momento che ho risolto il problema, e non ci sono altre risposte ...

merito va a @ jap1968 per puntare a me per la funzione mysqli_stmt_error (che ho assunto non avrei bisogno, dal momento che ho error_reporting(E_ALL)).

Il problema era che MySQL aveva una configurazione di default molto strano: in particolare

connect_timeout = 10 
wait_timeout = 30 

Ciò ha causato il server MySQL per chiudere la connessione dopo soli 30 secondi (di default è più di una mezz'ora, secondo il sito di MySQL). Questo a sua volta ha causato il fallimento della funzione mysqli_stmt_bind_result con un errore di segmentazione.

+1

Hai segnalato l'errore di segmentazione nel bugtracker PHP? – hakre

+0

Onestamente non l'ho fatto rendersi conto che si trattava di un bug in PHP. Ora che penso, probabilmente dovrebbe reagire in un modo diverso. Quindi no, non l'ho fatto ma cercherò, e se mancante, lo segnalerò. –

+0

Sarebbe davvero gentile da parte tua u. Inoltre si potrebbe voler scoprire se questo continua a fare segfault con una versione corrente. Ho appena risposto alla tua domanda oggi altrimenti l'ho già commentato. Fammi sapere se hai bisogno di aiuto. – hakre

Problemi correlati