Domanda

Ambiente: Apache / 2.2.11 (Win32) mod_apreq2-20051231 / 2.6.2-dev mod_perl / 2.0.4-dev Perl / v5.10.0

Situazione molto simile a ciò che è descritto nella questa lista di discussione messaggio , tranne che per essere in win32.

ho questo in httpd.conf:

PerlModule Apache2::Reload
PerlInitHandler Apache2::Reload
PerlSetVar ReloadAll Off
PerlSetVar ReloadModules "MyPackage::*"

... così come sole manipolazioni mod-perl script.

Ho uno script che utilizza un modulo MyPackage, e sta funzionando.

rompo il modulo, e ricaricare lo script. L'errore è un utile, raccontando la linea dove ho rotto il modulo.

(Se ricarico di nuovo a questo punto, e mi dice solo "subroutine non definita & ModPerl :: :: ROOT ModPerl :: Registry ..." perché non era in grado di caricare il file per la prima volta. Ma in entrambi i modo il seguente comportamento succede ancora.)

I Ripristina la pausa, e toccare il file di script troppo così che sarà ricaricare il modulo, e ricaricare. Ora si dice:

Attempt to reload MyPackage/Foo.pm aborted.
Compilation failed in require at E:/dev/test.pl line 4.

E anche se mi tocco la sceneggiatura e il modulo, non posso farlo per ricaricare correttamente, se non per riavviare il server Web.

Rompere solo lo script stesso (in contrapposizione al modulo) funziona bene:. Errori propri e che cambiano di nuovo i risultati in esso lavorano di nuovo su di ricarica

Dopo ognuna di queste cose ho riavviato il server web prima del test:

  1. Ho provato a fare una traccia, ma il linea che continua a errore fuori on è ModPerl / linea RegistryCooker.pm 204, che è solo la linea che eval {} s l'intero script.

  2. Ho provato a cambiare "utilizzare avvertimenti FATAL => 'all' "a solo" uso avvertimenti" nello script e il modulo. Non fare la differenza.

  3. Ho provato a rendere invalido mia abitudine $ SIG {__ funzione DIE__}. non l'ha fatto fare la differenza. (Beh, solo in dove è apparso l'errore, naturalmente, ma gli errori generati erano stesso.)

  4. Per il collegamento discussione, all'inizio, ha scoperto che MaxRequestsPerChild è stato 0 per tutto questo tempo, e ho provato ThreadsPerChild 1, ma nessuna differenza. Ho cercato MaxRequestsPerChild a 1, che risolve i comportamenti strani di questa domanda, ma riavvia il server web dopo ogni singola richiesta:

    Child 7072: Process exiting because it reached MaxRequestsPerChild. Signaling the parent to restart a new child process.
    Parent: Received restart signal -- Restarting the server.
    

    Questa non è una buona soluzione, dal momento che ho un pezzo significativo di codice che ha eseguito la prima volta che una pagina viene colpito.

  5. Anche per la discussione, corro httpd come un servizio, così ho aggiunto -X nella finestra parametri di servizio e ha colpito di inizio, e stava ancora cercando di avviare una completa tre minuti più tardi (di solito inizia entro 3 secondi .) Abbiamo avuto anche un messaggio di timeout. Ucciso processo tramite il task manager e verificato non riuscivo a colpire la pagina da un browser web. Iniziato httpd -X dalla riga di comando. Sempre lo stesso comportamento in cima a questa domanda. Inoltre ho trovato strano che -X non era elencato quando mi sono imbattuto httpd - ?. Forse non è disponibile sul MPM win32?

  6. In quel filo, David Note:

      

    La mia esperienza la risoluzione di questo   tipo di problema ha indicato che la sua   probabile che il pacchetto che era   scaricato eliminato un valore memorizzato nella   spazio pacchetto del modulo ricaricato   (Probabilmente fissato a BEGIN tempo di blocco)   che la successiva richiedono no   ripristino.

    Ma questo non è vero per il mio codice. L'errore 'rompere il copione' mi presento è solo l'aggiunta di una linea supplementare 'il mio $ var' sopra uno che è già lì, in modo che il secondo si lamenterà che è già stato dichiarato.

Non c'è un modo di lavorare su moduli mod_perl2 senza avere il riavvio del server web dopo ogni ricarica (sia automaticamente, tramite MaxRequestsPerChild, o manualmente, come prima)?

È stato utile?

Soluzione

Copia il sub allo script si sta chiamando da e inserire questo codice prima che la copia:

package MyPackage::Foo;
no warnings 'redefine';

Quando hai finito le modifiche, spostare il sub torna al modulo attuale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top