2014-06-17 16 views
7

Ho un'applicazione server PHP che raccoglie tweet e quindi continua a funzionare. L'applicazione inizia a mancare dopo un paio di giorni. Rifiutarsi di restituire risultati per un'istruzione select mysql. Ho scoperto questo è dovuto alla risorsa php id traboccante (avvertimento PHP):Errore di overflow dell'ID risorsa php

-2147483648 non è una risorsa risultato MySQL valido

Ciò significa che l'applicazione è a corto di possibili id ​​da assegnare a una risorsa variabile (a causa dell'elevata quantità di istruzioni di query che vengono attivate). Ho pensato che la risposta a questa domanda era usare mysql_free_result sotto ogni istruzione select mysql in modo che ogni risorsa alla fine sia liberata. Questo tuttavia non ha risolto il mio problema.

Su alcuni forum ho letto che PHP non è in grado di riutilizzare ID di risorsa rilasciati. Ciò significherebbe l'unica soluzione plausibile è riconnettersi al database mysql?

Alcune informazioni sulla mia versione di PHP:

PHP 5.5.10-1 + deb.sury.org ~ precisa + 1 (CLI) (di costruzione: 27 marzo 2014 16:18:01) Copyright (c) 1997-2014 Il PHP Group Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies con Zend OPcache v7.0.3, Copyright (c) 1999-2014, da Zend Technologies

fa qualcuno ha esperienza con questo problema? Potrebbe essere un'altra soluzione usare l'estensione mysqli invece di quella normale?

Grazie!

+0

Dove hai letto che non sono mai disponibili per il riutilizzo? Qual è la tua versione di PHP? [Quel comportamento non sembra essere documentato] (http://www.php.net/manual/en/language.types.resource.php) –

+5

Sei [usando una connessione persistente db] (http: // www .php.net/manuale/it/features.persistent-connections.php)? (Nota, dovresti usare comunque PDO o MySQLi, poiché il vecchio 'ext/mysql' è deprecato) –

+3

Questo è un bug PHP noto che è stato aperto per anni. Vedi se uno di questi link ti aiuta.Non sono l'autore di entrambi gli articoli e non ho alcuna affiliazione con nessuno dei due siti. http://www.php.net//manual/en/mysqli.persistconns.php http://brandonwamboldt.ca/tag/overflow/ –

risposta

1

L'errore NON significa necessariamente "l'applicazione sta esaurendo i possibili ID da assegnare a una variabile di risorsa". In realtà, potrebbe essere causato dal tuo (se non corretto) utilizzando mysql_free_result() perché in seguito il tentativo di fare qualcosa con le risorse cancellate produrrebbe un errore come vedi. Assicurati di non "memorizzare temporaneamente" nella cache o di conservare gli ID delle risorse nella sessione e di riutilizzarli.

Tuttavia, se si è sicuri che la propria app esaurisca gli ID delle risorse, utilizzando unset() o mysql_free_result() è possibile liberare risorse, quindi gli ID liberati sono nuovamente disponibili e PHP potrebbe riutilizzare nuovamente queste risorse. Nei sistemi a 64 bit, è improbabile che tu possa rimanere senza id di risorsa.

Sarebbe MEGLIO ottimizzare il programma stesso non sprecare le risorse invece di esaurirle e quindi reimpostarle. In nessun modo è possibile esaurire le risorse abbondanti così rapidamente.

Cosa è successo quando hai chiamato mysql_free_result()? BTW, se usi mysqli, dovresti usare mysqli_result :: free invece di mysql_free_result().

+0

Sono sicuro che non sto riutilizzando gli oggetti risorsa liberati. Il problema era già in corso prima di utilizzare qualsiasi istruzione mysql_free_result. In quest'ultimo caso anche l'errore si manifesterebbe immediatamente e non solo dopo tre giorni. Cosa intendi con ottimizzare il programma? Come posso riutilizzare gli stessi oggetti risorsa (non congrui)? "Tuttavia, se sei sicuro che la tua app ha esaurito gli ID delle risorse, usando unset() o mysql_free_result() puoi liberare risorse" Questo è esattamente il mio punto dal momento che non funziona. Sembra che PHP aggiunga ingenuamente uno all'ID risorsa per ogni nuovo oggetto risorsa. – Baptist

+0

Bene, con l'ottimizzazione, intendo che alcuni metodi usano più di un ID di risorsa. Quindi, puoi vedere se puoi invece usare metodi diversi con funzionalità simili. – Selay

Problemi correlati