2011-01-01 15 views
20

Da quando ho installato APC per PHP con PECL ricevo a volte questi errori: Cannot redeclare class xxxPHP con APC: gli errori fatali: Non può ridichiarare classe

xxx cambia di volta in volta. Potrei disabilitare APC ma APC migliora le prestazioni alla grande! C'è un bug noto o potrei fare qualcos'altro per prevenire questi errori? Sto usando Ubuntu 8.04 LTS con PHP 5.2.4.


Edit/Update (dai commenti):

Io uso la Zend Framework caricatore automatico e questi errori non si sono verificati prima ho attivato APC. Qualche istante fa ottengo ad esempio quell'errore: Fatal error: require(): Cannot redeclare class zend_db_adapter_abstract in /paths/app/lib/Zend/Db/Select.php on line 27

+1

Leggi il messaggio di errore generale. Non includere il file specificato due volte. Usa 'include_once'. In caso contrario, avvolgere tutte le definizioni in 'if (! Class_defined (" xxx ")) {' – mario

+0

Oltre a utilizzare include_once, provare e riprogettare l'applicazione per utilizzare l'autoloading della classe, in modo che PHP includa solo i file Quando necessario. Attenersi anche alle cose di buon senso, come una classe per file, ecc. – Rob

+1

cosa intendi per xxx? xxx è effettivamente la classe che vuoi caricare? –

risposta

1

Beh, è ​​un problema noto con apc che mescola include_once directivse che sono chiamati relativamente da posizioni diverse.

Quindi, se si esegue include_once myclass.php e quindi in una sottodirectory, l'apc include_once ../myclass.php potrebbe confondere ciò e pensarne i diversi file e caricarlo due volte.

Tuttavia, questo problema è stato risolto nelle versioni successive.

Se è possibile eseguire il drill down del codice sulla classe caricata due volte, è possibile verificare se la classe è già stata caricata con class_defined o alcuni elementi richiamabili.

È inoltre possibile utilizzare la direttiva apc.filter per impedire che determinati file vengano memorizzati nella cache.

+0

Vedere il mio commento sopra. – Poru

+0

bene il problema rimane lo stesso. aggiorna la tua versione di apc e/o zend framework oppure devi patchare il tuo framework di zend, ci sono soluzioni disponibili sul tracker di problemi di zend o su maby puoi catturare l'eccezione nella tua applicazione. –

2

Hmmm, sembra essere un common issue:

Quello che ho appena notato dal messaggio di errore specifico è che hai scritto zend_db_adapter_abstract in tutto- minuscolo. Un problema con gli schemi di denominazione e gli autoloader dell'horrid framework è che mantengono i file in un caso misto e si aspettano che sia così. Se il tuo codice ha tentato di istanziarlo in questo modo, il caricatore automatico potrebbe non averlo trovato. L'APC potrebbe essere più particolare qui, poiché sostituisce internamente include_once, forse con effetti collaterali.

Una soluzione potrebbe essere quella di adattare il caricatore automatico Zend e mantenere manualmente un elenco di classi caricate e nomi di file (assoluto e in minuscolo) su proofcheck invece di include_once.

Altrimenti, prova xdebuging eccessivo. Senza accesso alla configurazione, tutto ciò che possiamo fare è indovinare qui.

12

Ho avuto lo stesso problema con un sacco di librerie PHP non appena ho attivato APC. Dopo aver tirato un sacco di capelli, ho trovato che l'impostazione apc.include_once_override = 0 risolveva le cose. Sto ancora monitorando ma non ho avuto il problema di ri-verificarsi (prima che ero in grado di indurre l'errore cancellando la cache di apc).

12

La combinazione delle seguenti configurazioni fisse per me:

apc.include_once_override = 0 
apc.canonicalize = 0 
apc.stat = 0 

Senza tutto 3, sarei sempre l'errore, ma con tutti e tre mi sembra di avere più l'errore :) !

+0

Questi tre non funzionano per me sfortunatamente (APC 3.1.13 e PHP 5.4.24 CentOS 6.5). Con WordPress è la classe Walker_Page che afferma essere redecata, anche se il file non viene richiamato più di una volta. Scaverò più a fondo e vedrò cosa riesco a trovare – Jason

+0

Scusa Jason, questo ha funzionato con alcune versioni precedenti di APC e PHP. So per certo che la versione di PHP con cui stavo lavorando non era più recente di 5.3. * – Peter

3

Questo errore si verifica quando si utilizza Amazon AWS SDK per PHP2 in uno script php in esecuzione in cron. Una soluzione era di disabilitare apc tramite -d apc.enabled=0 come illustrato di seguito:

/usr/bin/php -d apc.enabled=0 /path/to/myshelljob.php 

Per more info.

Problemi correlati