sürünerek kazıma ve diş?

5 Cevap php

Ben daha sonra dinlemek için benim en sevdiğim müzik bloglar MP3'ler tarar ve toplayan bir kişisel web sitesi var ...

Çalışır yolu CRON işi kez DB sonraki blog taradığı her dakika bir. Php kese çalışır olduğunu. Sonuçlar DB konur ve daha sonra ikinci bir. Php script toplanan bağlantıları tarar.

Komut dosyaları sadece sayfanın içine aşağı iki düzeyde tarama yani .. ana sayfa www.url.com ve bu sayfadaki bağlantılar www.url.com/post1 www.url.com/post2

Benim sorun ben bloglar büyük bir koleksiyon almak için başlangıç ​​olarak bu. Onlar sadece bir kez şimdiye kadar 20 ila 30 dakika taranır ve ben komut için yeni bir blog eklerken her dakika işlenir sadece biri olarak bağlantıları tarayarak bir yedek olduğunu vardır.

Nedeniyle PHP nasıl çalıştığını ben sadece komut birden fazla veya komut etmmek nedeniyle bağlantıların sınırlı miktarda işlemek izin veremeyiz görünüyor. Bellek sınırlar. Zaman aşımları vs

Onlar DB birbirinin üzerine olacak gibi Ayrıca ben aynı komut dosyası birden çok örneğini çalıştıramazsınız.

Ben bu süreci hızlandırmak verebilecek en iyi yoldur.

Ben DB etkileyen birden çok komut var ama onlar birbirinin üstüne ama sonuç sıraya kalmaz bunları yazmak bir yolu var mı?

Bir komut kendi hızında bağlantıları süreci böylece PHP parçacığı oluşturmak için bazı yolu var mı?

Herhangi bir fikir?

Teşekkürler.

5 Cevap

Bu kesinlikle sorunun cevabı değil ama python öğrenmeye istekli iseniz ben sizin ihtiyaçlarını doldurmak hangi Scrapy, an open source web crawler/scraper framework bakmak öneririz. Yine, PHP ama Python değil. Ben bunu kendim nasıl kullandığımız her zamankinden vb çok dağıtılabilir .. olduğunu.

Nedeniyle PHP nasıl çalıştığını ben sadece komut birden fazla veya komut etmmek nedeniyle bağlantıların sınırlı miktarda işlemek izin veremeyiz görünüyor. Bellek sınırlar. Zaman aşımları vs

Kod bellek sızdırıyor ise bellek sınırı, yalnızca bir sorundur. Bunun yerine hafıza limitini yükselterek daha düzeltmek gerekir. Komut yürütme zaman sadece cli-komut için devre dışı bırakabilirsiniz bir güvenlik ölçüsüdür.

Onlar DB birbirinin üzerine olacak gibi Ayrıca ben aynı komut dosyası birden çok örneğini çalıştıramazsınız.

Siz örnekleri birbirlerini geçersiz yok böyle bir şekilde uygulamanızı oluşturabilirsiniz. Bunu yapmak için tipik bir yolu site başına bölümlemek olacaktır; Örn. sürünürsün istediğiniz her site için ayrı bir komut dosyasını başlatmak.

KULLANIM CURL ÇOK!

Curl-Tk Eğer paralel sayfaları işlemek izin verir.

http://us3.php.net/curl

Eğer db yerleştirmeleri ve html ayrıştırma yaparak, web üzerinde bekleyen çoğu zaman daha hızlı büyüklük emir.

Eğer kazımak istediğiniz blogların bir listesini oluşturmak, çok kıvırmak için onları gönderin. Bekleyin ve ardından seri tüm aramaların sonuçları işlemek. Daha sonra aşağı sonraki seviyeye üzerinde ikinci bir geçiş yapabilirsiniz

http://www.developertutorials.com/blog/php/parallel-web-scraping-in-php-curl-multi-functions-375/

Paralel tarayıcılar çalıştırmak için sahte kod:

start_a_scan(){
    //Start mysql transaction (needs InnoDB afaik)        
    BEGIN 
        //Get first entry that has timed out and is not being scanned by someone
        //(And acquire an exclusive lock on affected rows)
        $row = SELECT * FROM scan_targets WHERE being_scanned = false AND \
                (scanned_at + 60) < (NOW()+0) ORDER BY scanned_at ASC \
                      LIMIT 1 FOR UPDATE
        //let everyone know we're scanning this one, so they'll keep out
        UPDATE scan_targets SET being_scanned = true WHERE id = $row['id']
    //Commit transaction
    COMMIT
    //scan
    scan_target($row['url'])
    //update entry state to allow it to be scanned in the future again
    UPDATE scan_targets SET being_scanned = false, \
              scanned_at = NOW() WHERE id = $row['id']
}

Muhtemelen de asılı herhangi durdurulan taramalar varsa periyodik olarak kontrol eder ve tekrar taranabilir böylece onların durumunu sıfırlamak bir 'temiz' gerekiyordu.

Ve sonra birkaç tarama işlemleri paralel çalışan olabilir! Yey!

şerefe!

EDIT: Ben ilk FOR UPDATE ile SEÇ yapmak gerektiğini unuttum. Devamı here

CLI komut not max etmmek ile sınırlıdır. Eğer herhangi bir anda bellekte büyük veri setleri yoksa hafıza limitleri normalde bir sorun değildir. Zaman aşımları uygulamanız tarafından incelikle ele alınmalıdır.

Eğer herkes olsa daha fazla tavsiye için komut dosyası göndermek zorunda kalacak - Aynı anda birkaç örneğini çalıştırabilirsiniz böylece should kodunuzu değiştirmek mümkün. Peter dediği gibi, muhtemelen tasarım bakmak gerekir. Bir pastebin kodu sağlayarak bize yardımcı olmak için yardımcı olacaktır :)