Newsgroup: it.comp.www.php
Titolo: memoria occupata da una variabile

Ciao a tutti. Ho una funzione ricorsiva che mi consuma troppa memoria e 
blocca lo script.
All'interno uso diverse variabili che prontamente libero con unset. 
Probabilmente qualcosa non va... esiste un modo per vedere quanta 
memoria occupa ogni singola variabile?
Grazie a tutti!

 Grazie a tutti!


E' un pezzo di una sorta di crawler...
function get_links ($page) {
     $this->get_links_iterations+=1;
     $this->already_analized_links[]=$page;
     if ($this->debug==true) {
       $this->log.=$this->get_links_iterations.') Cerco su '.$page.'<br>';
     }
     $ch = curl_init();
     curl_setopt($ch, CURLOPT_URL,$page);
     curl_setopt($ch, CURLOPT_TIMEOUT, 30);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
     $result=curl_exec ($ch);
     curl_close ($ch);
     preg_match_all( '/<a href="(http:\/\/www.[^0-9].+?)"/', $result, 
$output);
     preg_match_all( '/<a href="([^0-9].+?)"/', $result, $output2);
     $items=array_merge($output[1],$output2[1]);
     unset($result);
     unset($output);
     unset($output2);
     foreach ($items as $item) {
       $page_link_begin=substr($item,0,4);
       if (!in_array($page_link_begin,array('http','www.'))) {
         $item=$this->links_path.$item;
       }
       if ($this->debug==true) {
         $this->log.=' Esamino: '.$item.'<br>';
       }
       //Verifico se il link ï¿œ esterno o interno
       if (((substr($item,0,$this->site_name_length)==$this->site) or 
(substr($item,0,1)=='/')) and ($page!=$item)) {
         if ($this->debug==true) { $this->log.='  - Seguo - interno e 
non autoreferenziale <br>';}
         if ($this->find_marker($item,$this->save_links_marker)!=false) {
           if (in_array($item,$this->found_links)==false) {
             if ($this->debug==true) { $this->log.='  - salvato<br>';}
             $this->found_links[]=$item;
           }
         } else {
           if ($this->debug==true) { $this->log.='  - non salvato<br>';}
         }
         if ($this->get_links_iterations<$this->max_get_links_iterations) {
           if (in_array($item,$this->already_analized_links)==false) {
             if 
($this->find_marker($item,$this->follow_links_marker)!=false) {
               if ($this->debug==true) { $this->log.='  - seguito<br>';}
               $this->get_links($item);
             } else {
               if ($this->debug==true) { $this->log.='  - non seguito - 
interno <br>';}
             }
           }
         }
       } else {
         if ($this->debug==true) { $this->log.='  - non seguito - 
esterno<br>';}
       }
       unset($item);
     }
     unset($items);
     unset($page);
   }

function get_page ($page) {
     $this->get_links_iterations+=1;
     $this->already_analized_links[]=$page;
     if ($this->debug==true) {
       $this->log.=$this->get_links_iterations.') Cerco su '.$page.'<br>';
     }
     $ch = curl_init();
     curl_setopt($ch, CURLOPT_URL,$page);
     curl_setopt($ch, CURLOPT_TIMEOUT, 30);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
     $result=curl_exec ($ch);
     curl_close ($ch);
     preg_match_all( '/<a href="(http:\/\/www.[^0-9].+?)"/', $result, 
$output);
     preg_match_all( '/<a href="([^0-9].+?)"/', $result, $output2);
     $items=array_merge($output[1],$output2[1]);
     unset($result);
     unset($output);
     unset($output2);
     return $items;
}
function get_links($page){
     $items = $this->get_page($page);
     $items = array_unique($items);  // dimezziamo i link
     foreach ($items as $item) {
       $page_link_begin=substr($item,0,4);
       if (!in_array($page_link_begin,array('http','www.'))) {
         $item=$this->links_path.$item;
         // poi qui chiama una funzione con il nome di se stesso
         // https ?
         // 
192.168.1.1/pippo.html
 ?
         // ftp:
         // ecc....
       }
       if ($this->debug==true) {
         $this->log.=' Esamino: '.$item.'<br>';
       }
       //Verifico se il link è esterno o interno
      // il link www.nomedominio e' di 128 caratteri
      //  (e un sito puo avere url massimo di 2kb)
      // togli (alla fine) tutti i debug
       if (((substr($item,0,$this->site_name_length)==$this->site) or 
(substr($item,0,1)=='/')) and ($page!=$item)) {
         if ($this->debug==true) { $this->log.='  - Seguo - interno e 
non autoreferenziale <br>';}
         if ($this->find_marker($item,$this->save_links_marker)!=false) 
{     // questa contiene un ciclo? e se fai 1 ciclo per link ne
// fai n1 * n
           if (in_array($item,$this->found_links)==false) {
             if ($this->debug==true) { $this->log.='  - salvato<br>';}
             $this->found_links[]=$item;
           }
// se li salvi un un db ascia fare al db se esiste o lo associa alla 
pagina o lo scarta x via del duplicato
         } else {
           if ($this->debug==true) { $this->log.='  - non salvato<br>';}
         }
         if 
($this->get_links_iterations<$this->max_get_links_iterations) {     // 
in una pagina puoi avere anhe 50000 link
           if (in_array($item,$this->already_analized_links)==false) {
             if 
($this->find_marker($item,$this->follow_links_marker)!=false) {
               if ($this->debug==true) { $this->log.='  - seguito<br>';}
               $this->get_links($item);
             } else {
               if ($this->debug==true) { $this->log.='  - non seguito - 
interno <br>';}
             }
           }
         }
       } else {
         if ($this->debug==true) { $this->log.='  - non seguito - 
esterno<br>';}
       }
      // unset($item);
     }
     unset($item);
     unset($items);
     unset($page);
   }


grazie!

 E' un pezzo di una sorta di crawler...
uno spider ricorsivo?
Non lo vedo molto bene, anzi...
Ti linko queste ottime librerie per creare spider (non ricorsivi) con 
CURL, così puoi anche separare la logica dalla presentazione
http://www.schrenk.com/nostarch/webbots/DSP_download.php
certo, col libro che le spiega sottomano sarebbe meglio :)