Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 30
  1. #1

    [BUG] PHP 5.3.2/5.3.3 e deferencing del $this dentro una classe

    Hola a todos,

    apro un thread qui nella speranza che qualcun'altro ci sia già incappato

    Sto sbattendo contro un bug di php, alquanto fastidioso e difficilmente riproducibile, che causa errori di esecuzione al quanto assurdi.

    Quanto dico al quanto assurdi, intendo veramente assurdi:
    Codice PHP:
    <?php

    class FakeClass
    {
        private 
    $fakeVariable;
        public function 
    FakeMethod()
        {
          
    $this->fakeVariable true;
        }
    }

    ?>
    voi vi domanderete "ma dov'è l'errore?" ... ecco, la risposta, assurda, alla vostra domanda è che l'errore è sulla riga
    Codice PHP:
          $this->fakeVariable true
    PHP si lamenta del fatto che sto assegnando una variabile ad un elemento che non è un oggetto

    Ora, ritengo che un uomo possa fare tanti errori quando programma, ma che mi venga detto che non posso impostare una variabile della classe lamentandosi del fatto che $this non è un oggetto è qualcosa di abbastanza preoccupante.

    Il problema è che è difficile da far saltare fuori: per ottenere quest'errore devo stressare il webserver per 6/8 ore con pagine che, eseguite, occupano dai 100mb ai 150mb ciascuna lanciando migliaia di query nell'esecuzione della singola pagina

    Sorvoliamo sul perché di tutta questa memoria usata e su tutte le query lanciate, il problema è veramente assurdo!

    Ho provato a guardare un po in giro e, da quanto ho visto, l'errore ogni tanto salta fuori ma con versioni precedenti di php. Ho però un forte dubbio che il problema sia legato alle funzioni di gestione delle date di php 5.3 (date_*) perché ho letto su bugs.php.net che new datetime() ha problemi nell'allocazione della memoria e dato che ne faccio uso potrebbe essere lui la causa ... però sembra che il bug in questione sia stato sistemato un anno e mezzo fa praticamente.

    L'errore viene fuori sia su linux sia su windows e l'unico modo per tamponare e far ripartire apache ogni 5 minuti: ovviamente non è che non viene fuori però il numero di volte che spunta si riduce drasticamente.

    Non posso nemmeno downgradare alla serie 5.2 perché mi servono le funzioni di calcolo delle date perché non posso usare gli unixtimestamp, potenzialmente il sistema potrebbe finire a usare date antecedenti al 1970 :\

    Qualche altro c'ha sbattuto contro?

    EDIT:
    il codice che ho postato non fa saltare fuori l'errore di per se, era solo per far vedere specificatamente la riga di codice sulla quale mi si manifesta l'errore

  2. #2
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    ciao dan,

    io è già da un annetto che lavoro col 5.3.0 (le utimissime non le ho ancora utilizzate a pieno) eancora non sono incappato nel problema, nonostante abbia copiato il tuo codice e provato in locale...
    ma tu accennavi al fatto di mettere sotto stress il server, e questo ovviamente fa presupporre che sia la gestione della memoria di PHP ....
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  3. #3
    si, è molto probabile

    considera che per far venire fuori quel problema il mio codice deve essere eseguito per almeno 6/8 ore e deve essere veramente spremuto parecchio

    il problema, in aggiunta, è che è casuale e quindi non so nemmeno come debuggarlo per fare un report ... nu gran casin

  4. #4
    mmm, però vedi che non è quello il codice che fa venir fuori l'errore ... il codice che ho postato era solo per far vedere su quale riga veniva fuori l'errore

  5. #5
    se il problema viene fuori solo se lo stress del server è al top over the top, mi pare evidente che sia un problema di gestione della memoria. da capire se un problema di mancanza di memoria allocabile o gestione errata della memoria attualmente utilizzata. Nel caso il problema dipendesse dal carico della macchina, potresti mettere un bilanciatore e usare piu istanze di apache su macchine diverse. Oppure dare piu risorse alla macchina.
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  6. #6
    il server non viene occupato al 100%, diciamo che vengono consumati solo 2 processori su 4 al 100% e non viene consumata, complessivamente, più di un gb e mezzo di memoria

    il fatto è, come dicevo prima, che secondo me php ha qualche problema quando si trova a combattere con tutta questa memoria allocata

  7. #7
    Originariamente inviato da daniele_dll
    il server non viene occupato al 100%, diciamo che vengono consumati solo 2 processori su 4 al 100% e non viene consumata, complessivamente, più di un gb e mezzo di memoria

    il fatto è, come dicevo prima, che secondo me php ha qualche problema quando si trova a combattere con tutta questa memoria allocata
    potrebbe, per questo dicevo di abbassare il carico distribuendolo su piu macchine. Certo, per fare il debug, è un pò un casino.
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  8. #8
    si, ma non risolverei il problema

    attualmente il sistema è attivo, ma in fase di test, e gestisce 1/19 dei dati che dovrebbe gestire senza considerare che attualmente lavora solo il back-office mentre il front-office non è ancora operativo

    avrei bisogno di un grattacelo di cluster per risolvere questo problema ... non è un rattoppo conveniente

  9. #9
    Ma qual è l'errore preciso che salta fuori?
    e cosa succede? Stampa un errore a video (o nei log se non hai i display error) o si riavvia apache?

    Nel tuo progetto utilizzi include dentro metodi (o addirittura dentro la classe)
    I file che includi possono essere cambiati da altri script? (nel senso è sicuro sempre tutto fisso, o includi qualcosa che viene creato/modificato in runtime?)
    Utilizzi factory? abstract class e interface? (Io ho avuto un po' di problemi dovuti a bug nel loro utilizzo)
    Forzi in qualche punto il tipo di variabile che un metodo deve avere? (moltissimi bug li ho trovati qui). Per esempio scordati una cosa tipo
    Codice PHP:
    public function FakeMethod(bool $pi


    Tutti i bug sono riproducibili, dovresti provare a riprodurlo. A volte sono bug davvero stupidi.
    Per esempio avevo trovato una volta una regexp che mi faceva crashare apache (sia in win che in linux), ma il problema era mi sa la lunghezza dello script (o della regexp ora non ricordo) che se aveva un numero preciso di byte dava quel disastroso risultato =)

    Te le butto li' eh.. in mancanza di informazioni =)

  10. #10
    l'errore che viene fuori esattamente è

    Attempt to assign property of non-object
    sulla riga che ho indicato nel primo post.

    e cosa succede? Stampa un errore a video (o nei log se non hai i display error) o si riavvia apache?
    da un errore ... quest'errore viene intercettato dal mio gestore degli errori che si prende la briga di stamparmi un messaggio a video e nel contempo salvarmi un file con lo stack trace e via dicendo.

    Nel tuo progetto utilizzi include dentro metodi (o addirittura dentro la classe)
    no, decisamente no ^^

    I file che includi possono essere cambiati da altri script? (nel senso è sicuro sempre tutto fisso, o includi qualcosa che viene creato/modificato in runtime?)
    tutto fisso

    Utilizzi factory? abstract class e interface? (Io ho avuto un po' di problemi dovuti a bug nel loro utilizzo)
    utilizzo sia delle classi astratte sia delle interfacce, ma quando ricevo quest'errore ancora quella parte di codice non è stata caricata

    Forzi in qualche punto il tipo di variabile che un metodo deve avere? (moltissimi bug li ho trovati qui). Per esempio scordati una cosa tipo
    no, onde evitare assurdi problemi mistici (anche se non ci sono riuscito) ho preferito evitare di implementare codice di questo tipo

    Tutti i bug sono riproducibili, dovresti provare a riprodurlo. A volte sono bug davvero stupid
    tutti i bug sono riproducibili ... infatti lo riproduco ... ma dubito che se dico a quelli di bugs.php.net ... "dovete avviare uno script lungo qualche migliaia di righe ed eseguirlo per 6/8 ore per far venire fuori il problema" mi fanno volare fuori da un balcone

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 © 2025 vBulletin Solutions, Inc. All rights reserved.