CakePHP Web Paletli bellek sızıntısı

1 Cevap php

Ben sadece, bir niş tabanlı arama motoru koymak için, bir uygulama geliştiriyorum. Uygulama kapsamında bir web sitesi tarar ve sonra işlevinde açıklandığı gibi "ürünler" tablosunda sitesinden doğru veri depolamak için collectData () işlevini kullanan bir işlev gezinme () içerir var. Ziyaret edilen sayfalar bir veritabanında saklanır

Zaman Aşımı ve Bellek: paletli iki şey hariç anlatıldığı gibi, oldukça iyi çalışıyor. Ben zaman aşımı hatayı düzeltmek için idare ettik ama hafıza kalır. Ben sadece memory_limit aslında sorunu gidermekle değil artan biliyorum.

Fonksiyonu "EXAMPLE.COM / products / sürün" ziyaret ederek çalıştırılır.

Bir bellek sızıntısı bir PHP Web tarayıcısı ile kaçınılmaz mı? YA ben yanlış / yapmıyorum yapıyorum şey var.

Şimdiden teşekkürler. (AŞAĞIDAKİ KOD)

function crawl() {

        $this->_crawl('http://www.example.com/','http://www.example.com');  
    }

    /***
    *
    * This function finds all link in $start and collects 
    * data from them as well as recursively crawling them
    *
    * @ param $start, the webpage where the crawler starts
    *
    * @ param $domain, the domain in which to stay
    *
    ***/

    function _crawl($start, $domain) {
        $dom = new DOMDocument();
        @$dom->loadHTMLFile($start);

        $xpath = new DOMXPath($dom);
        $hrefs = $xpath->evaluate("/html/body//a");//get all <a> elements

        for ($i = 0; $i < $hrefs->length; $i++) {

            $href = $hrefs->item($i);
            $url = $href->getAttribute('href'); // get href value
            if(!(strpos($url, 'http') !== false)) {  //check for relative links
                $url = $domain . '/' . $url;
            }

            if($this->Page->find('count', array('conditions' => array('Page.url' => $url))) < 1 && (strpos($url, $domain) !== false)) { // if this link has not already been crawled ( exists in database)

                $this->Page->create();
                $this->Page->set('url',$url);
                $this->Page->set('indexed',date('Y-m-d H:i:s'));
                $this->Page->save(); // add this url to database

                $this->_collectData($url); //collect this links data
                $this->_crawl($url, $domain); //crawl this link
            }
        }
    }

1 Cevap

Sen sayfadaki bağlantıları olduğu gibi, senin sorunun nerede olduğunu söyleyebilirim yukarı iki kat olarak birçok veritabanı sorgularını oluşturma ediyoruz. Sadece çiftleri filtre ve bir saveAll() ile yeni kayıtlar eklemek için büyük bir toplu sorgu yapmak, bir diziye bağlantılar birikir deneyin.


Aslında, tekrar bakarak, özyinelemeli ancak herhangi bir derinlik sınırı olmadan veya durum iptal, yanı sıra tüm bağlantıları tararken ediyoruz. Diğer bir deyişle, komut sürece potansiyel olarak sonsuz olduğu, takip bağlantılar olduğu gibi devam edecektir. Sen sadece bir defada bir sayfa işleyebilir ve bir kuyruk / işçi desen kullanarak, örneğin başka bir örneği de bağlantıları, tarama gerekir.