Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2002
    Messaggi
    443

    preg_match, Apache non ne vuole sapere

    Ho fatto un upgrade di PHP dalla versione 5.2.3 alla versione 5.3.6 ed ora nell'eseguire una funzione preg_match apache si pianta dando nel log il seguente errore:

    codice:
    [Tue Aug 16 08:41:39 2011] [notice] Parent: child process exited with status 128 -- Restarting.
    [Tue Aug 16 08:41:40 2011] [notice] Apache/2.2.17 (Win32) PHP/5.3.2 configured -- resuming normal operations
    [Tue Aug 16 08:41:40 2011] [notice] Server built: Oct 18 2010 19:45:39
    [Tue Aug 16 08:41:40 2011] [notice] Parent: Created child process 4024
    [Tue Aug 16 08:41:42 2011] [notice] Child 4024: Child process is running
    [Tue Aug 16 08:41:42 2011] [notice] Child 4024: Acquired the start mutex.
    [Tue Aug 16 08:41:42 2011] [notice] Child 4024: Starting 150 worker threads.
    [Tue Aug 16 08:41:42 2011] [notice] Child 4024: Starting thread to listen on port 80.
    Ho effettuato tutta una serie di ricercche

    codice:
    [Tue Aug 16 08:41:39 2011] [notice] Parent: child process exited with status 128 -- Restarting.
    senza trovare una soluzione che risolva il mio problema

    La funzione preg match:

    Codice PHP:
    preg_match('/\s(href|src|action|codebase|archive)\s*=\s*(("((\\\"|[^"])+)")|(\'((\\\\\'|[^\'])+)\')|([^\s]+))?/ims' ,$value$mmatch); 
    se dalla funzione tolgo
    codice:
    [^"]
    Codice PHP:
    preg_match('/\s(href|src|action|codebase|archive)\s*=\s*(("((\\\"|)+)")|(\'((\\\\\'|[^\'])+)\')|([^\s]+))?/ims' ,$value$mmatch); 
    il problema scompare .....

    Che cosa fa di preciso

    codice:
    [^"]
    Si può scrivere in altra maniera ?

    Grazie per un consiglio

  2. #2
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Maro che reg exp .....

    Che dovrebbe fare quella reg exp ???

    Cmq il blocco che togli serve a dire di controllare le sottostringhe che NON possiedono la succesiva espressione .

    Esempio [^èàòùì] controlla che la stringa NON abbia quei caratteri
    Altro esempio voglio controlloare che una stringa non abbia caratteri speciali :
    posso fare il controllo in due modi uno facile e uno complesso
    [a-zA-Z0-9] => tutte le stringhe alfanumeriche
    o altresì
    [^è+ò\.\-\-] => questa va completata con TUTTI i caratteri che NON devono esserci
    La prima soluzione e' molto semplice e dici solo cosa ti aspetti di trovare, nel secondo caso e' il contrario.

    Cmq resta il fatto che un preg_match che fa crashare apache e' problematica, non e' che dipende da qualche conf ? o Da un bachetto della funz ? quaesto non lo so e spero ci sia chi ne sa di piu' di me dal lato amministrazione di aiutarti.


    nel tuo caso specifico [^"] controlla che la stringa non abbia il carattere " , prova a mettere
    [^\"] .

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2002
    Messaggi
    443
    Grazie del tuo consiglio ....

    la situazione non cambia :-(

    ... xò è strano che me lo fa solo sul server di sviluppo Windows Server 2003 e non sul server di produzione Linux .....

    Ho confrontato le 2 php.ini e non ho trovato differenze .....

    Su entrambi i server è installato php 5.3.6


  4. #4
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Credo dipenda da come gestiscono le stringhe forse quella particolare REG-EXP crea problemi a win. Prova a controllare l'encoding del file e se non la gestisce come utf8.

  5. #5
    l'errore che spunta fuori è abbastanza strano, indica che non ci sono più processi in esecuzione (codice errore 128, per l'appunto).
    apache usa un sistema a più processi per gestire le richieste.

    detto questo, cercando a lungo qua e la, ho scoperto che le versioni più recenti hanno un problema con le espressioni regolari particolari e/o eccessivamente complesse per problemi di stack
    https://bugs.php.net/bug.php?id=52608

    Le espressioni regolari vengono compilate in codice nativo direttamente dalla libreria preg e, probabilmente, la tua espressione regolare causa una serie di chiamate ricorsive che riempono lo stack causando un crash del processo ... togliere quel [^"] probabilmente la semplifica quanto basta per far andare il tutto

    Qui c'è una soluzione, oltre a ricompilare php, che interviene su apache incrementando lo stack richiesto
    https://bugs.php.net/bug.php?id=47689

    ma dovresti installarti il visual studio c++ express

    Inoltre applicare questa soluzione potrebbe comunque non risolvere il problema in hosting in quanto potrebbe benissimo saltare fuori pure lì ^^

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2002
    Messaggi
    443
    Grazie 1000 per le Tue approfondite ricerche e dettagliate spiegazioni in merito ....

    ci metto una pietra sopra e opto per la soluzione + semplice, quella di rimuovere [^"] dalla funzione


  7. #7
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    insalla tutto su linux


  8. #8
    Originariamente inviato da Virus_101
    insalla tutto su linux

    purtroppo non è detto che il problema non si ripresenti, anzi, mi è capitato di avere, per l'ultimo software su cui ho lavorato, che il mio codice su linux avesse strani ed assurdi problemi ... in pratica, in alcuni contesti, eseguiva qualche milione di query e, dopo di che, la pagina terminava l'esecuzione ma TUTTE le successive richieste fallivano fin quando non si riavviava apache

  9. #9
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Anche i server hanno i loro bachi e php viene interpretato al volo da altre routines per cui anche quelle hanno i loro limiti e bugs .... A volte ci basterebbe saperlo. Ma per saperlo bisogna informarsi e perdere tempo... Pero' ci frega 1 volta poi basta

    Cmq se quella reg-exp e' troppo pesanta spezzala. Fai prima un controllo poi un altro in modo da alleggerire i controlli sulle singole chiamate.

  10. #10
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Dai log di errore deduco che apache utilizza il mpm worker o winnt, cosa molto sconsigliata per un ambiente php.

    ed e' anche per questo che non ti da errori in produzione: probabilmente di la viene usato il mpm prefork.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.