Visualizzazione risultati 1 fino 4 di 4

Discussione: Errore fatale Apache: troppa memoria utilizzata

  1. #1
    Guest

    Predefinito Errore fatale Apache: troppa memoria utilizzata

    Salve,
    è da un po' di minuti che mi appare il seguente messaggio di errore:
    Fatal error: Allowed memory size of 67108864 bytes exhausted at /install/apache/php/php-5.2.6_ss/Zend/zend_execute.c:1075 (tried to allocate 35 bytes) in ****on line **
    E' comparso dopo che ho fatto molte prove con uno script php che sto creando, e penso sia dovuto proprio a questo.
    La riga incriminata è
    Codice PHP:
    $readpagine[]=$file;
    .
    Prima andava bene, ma dopo l'ennesima volta che l'ho eseguito, qualcosa è andato male.
    Posto la funzione:
    Codice PHP:
    function raccolta_interventi(){

    $today=getdate();
    $origine=2008;
    $mese_origine=07;

    $anno=$today['year'];
    $link='blog/archivio/';
    do{
    $a=1;
    for(
    $i=12; $i>0; $i--){
    if(
    $i<10) $mese='0'.$i;
    else
    $mese=$i;
    if(
    is_dir(HOMESITE . $link . $anno . '/' . $mese)){
    $cartella=opendir(HOMESITE . $link . $anno . '/' . $mese);
    $file=readdir($cartella);

    while(
    $file){
    if(
    $file=='.'||$file=='..') continue;
    $readpagine[]=$file;
    }
    closedir($cartella);

    foreach(
    $readpagine as $file){
    if(
    is_dir(HOMESITE . $link . $anno . '/' . $mese.'/' . $file)) $pagine[]=$file;
    }
    sort($pagine);

    foreach(
    $pagine as $pag) $lista_interventi[]=HOMESITE . $link . $anno . '/' . $mese . '/' . $pag . '/page.php';

    }
    }
    $anno--;
    }while(
    $anno>=$origine);
    return
    $lista_interventi;
    }
    Questa è la pagina che esegue la funzione:
    http://libflagspaces.altervista.org/blog/


    EDIT:
    Ho notato che avevo fatto una piccola modifica:
    Da
    Codice PHP:
    while($file=readdir($cartella)){
    a
    Codice PHP:
    $file=readdir($cartella);
    while(
    $file){
    Con la prima, ho il problema posto sopra. Con la seconda, no. Come mai?
    Ultima modifica di libflagspaces : 06-06-2009 alle ore 00.02.10

  2. #2
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,266

    Predefinito

    ne sei certo, oppure hai scritto il contrario?

    Con questa versione, $file viene assegnata una volta sola, ed il suo valore non cambia mai. Se c'e' almeno un file della directory, si crea un ciclo infinito che continua ad aggiunge lo stesso nome all'array, fino a riempire la memoria.
    Codice PHP:
    $cartella=opendir(HOMESITE . $link . $anno . '/' . $mese);
    $file=readdir($cartella);

    while(
    $file) {
    if ( (
    $file=='.') || ($file=='..') ) continue;
    $readpagine[]=$file;
    }

    closedir($cartella);
    Con la versione seguente invece, ad ogni iterazione del while viene letto il nome di un nuovo file. Il contenuto di $file varia ogni volta, quando viene aggiunto all'array, finche' non diventa false dopo che tutti i file sono stati enumerati, terminando il ciclo.
    Codice PHP:
    $cartella=opendir(HOMESITE . $link . $anno . '/' . $mese);
    while(
    $file=readdir($cartella)) {
    if ( (
    $file=='.') || ($file=='..') ) continue;
    $readpagine[]=$file;
    }

    closedir($cartella);

    Come sempre, suggerisco a) di indentare il codice, e b) di non usare opendir/readdir, ma piu' semplicemente glob(). L'intero blocco diventerebbe:
    Codice PHP:
    $readpagine = glob(HOMESITE . $link . $anno . '/' . $mese);
    Ultima modifica di dreadnaut : 06-06-2009 alle ore 13.28.27

  3. #3
    Guest

    Predefinito

    Hai ragione era il contrario. Grazie per avermi fatto notare l'errore. Dopo tanto tempo che non programmo in php, la logica se ne è andata a fare una passeggiata. Speriam di ritrovarla presto
    Comunque, mi sembra che glob cerca solo i file, e quindi ho pensato di usare readdir per leggere anche le cartelle. Correggimi se sbaglio.

  4. #4
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,266

    Predefinito

    Il link sopra era alla guida di glob, basta leggere li --o magari provare?

    L'array restituito dalla funzione contiene sia file che directory, ma non i casi speciali "." e "..". C'e' un flag opzionale che puoi usare per listare solo le directory e non altri file.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •