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.
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? –
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 :) –
@ 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