• 10-09-2013, 17:15:04
    #1
    bir botumuz var mesela; 1.000 adet urlye bağlanıp buradaki verileri alıyor ve veritabanına kaydediyor.

    php satır satır yorumladığı için her urlye sırayla bağlanıyor ilgili işlemleri yapıyor ve diğer urlye geçiyor. bunun yerine aynı anda diyelim ki 10 urlye bağlansın ve işlemleri yapsın. bu şekilde 60dk da bitecek bir işlem yaklaşık 6dk ya düşer. bunu php ile yapmanın bir yolu var mı acaba?

    yani tarayıcıda birden fazla sekmeyi aynı anda açmak gibi..
  • 10-09-2013, 18:37:19
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    biomooj adlı üyeden alıntı: mesajı görüntüle
    bir botumuz var mesela; 1.000 adet urlye bağlanıp buradaki verileri alıyor ve veritabanına kaydediyor.

    php satır satır yorumladığı için her urlye sırayla bağlanıyor ilgili işlemleri yapıyor ve diğer urlye geçiyor. bunun yerine aynı anda diyelim ki 10 urlye bağlansın ve işlemleri yapsın. bu şekilde 60dk da bitecek bir işlem yaklaşık 6dk ya düşer. bunu php ile yapmanın bir yolu var mı acaba?

    yani tarayıcıda birden fazla sekmeyi aynı anda açmak gibi..
    Botun içerik çekmesinin uzun sürmesinin sebebi php nin satır satır işlemesi değil hedef sitenin açılma süresidir. Fazla döngü yoksa php üzerine düşen işi milisaniyeler içinde yapar zaten dolayısıyla bahsettiğiniz gibi süreyi onda birine düşürmek mümkün değil
  • 10-09-2013, 19:16:15
    #3
    adursun adlı üyeden alıntı: mesajı görüntüle
    Botun içerik çekmesinin uzun sürmesinin sebebi php nin satır satır işlemesi değil hedef sitenin açılma süresidir. Fazla döngü yoksa php üzerine düşen işi milisaniyeler içinde yapar zaten dolayısıyla bahsettiğiniz gibi süreyi onda birine düşürmek mümkün değil
    sitenin açılma süresi önemli değil, önemli olan paralel olarak bağlanması. foreach ile diziyi döngüye aldığımızda dizinin ilk elemanındaki sitede işlemler bitene kadar ikinci elemana geçmiyor. fakat aynı anda dizideki 10 siteyi işleme alırsa zamandan kazanmış olacağız. diğer türlü düşünün ki elinizde 100,000 adet bağlanılacak url var, 1 url için geçen zaman 7sn olsun. 7/24 bot çalışırsa tam 8 günde işlemler biter, tabi bu da mümkün olmuyor çünkü kaynak sitedeki bir sorunda bot duruyor zaten (sunucunun restart edilmesi gibi..) , bu durumlarda manuel kontrol edip botu kaldığı yerden devam ettirmen gerekiyor . bu da işlemin çok çok uzaması anlamına geliyor.. biraz yabancı kaynaklara göz attım, dediğim işlemin curl_multi_exec ile yapılabildiğini gördüm, henüz üzerinde çalışıyorum..

    --R10.NET; Flood Engellendi -->-> Yeni yazılan mesaj 19:16:15 -->-> Daha önceki mesaj 18:46:06 --

    benzer arayışı olanlar için örnek uygulamayı paylaşıyorum;

    $urls = array
    (
        0 => 'https://www.r10.net',
        1 => 'http://www.imdb.com', 
        2 => 'http://www.yahoo.com',
    );
    
    $mh = curl_multi_init();
    $handles = array();
    
    foreach ($urls as $url)
    {
        $handles[$url] = curl_init($url);
    
        curl_setopt($handles[$url], CURLOPT_TIMEOUT, 0);
        curl_setopt($handles[$url], CURLOPT_AUTOREFERER, true);
        curl_setopt($handles[$url], CURLOPT_FAILONERROR, true);
        curl_setopt($handles[$url], CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($handles[$url], CURLOPT_RETURNTRANSFER, true);
        curl_setopt($handles[$url], CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($handles[$url], CURLOPT_SSL_VERIFYPEER, false);
    
        curl_multi_add_handle($mh, $handles[$url]);
    }
    
    $running = null;
    
    do {
        curl_multi_exec($mh, $running);
        //usleep(200000);
    } while ($running > 0);
    
    foreach ($handles as $key => $value)
    {
        $handles[$key] = false;
    
        if (curl_errno($value) === 0)
        {
            $handles[$key] = curl_multi_getcontent($value);
        }
    
        curl_multi_remove_handle($mh, $value);
        curl_close($value);
    }
    
    curl_multi_close($mh);
    
    echo '<pre>';
    print_r(array_map('htmlentities', $handles));
    echo '</pre>';
  • 10-09-2013, 20:12:24
    #4
    bot kodlarını farklı dosyalara ayırsanız.
    ör :
    r10_bot.php
    imdb_bot.php
    yahoo_bot.php

    bunları farklı sekmelerden açsanız dediğiniz gibi olur.
    Ama bir sorun var, o da veritabanı. çünkü tek bir veritabanı var. aynı anda kaydetmeye kalkarlarsa biraz bekleme olur zannedersem.
  • 10-09-2013, 20:15:17
    #5
    biomooj adlı üyeden alıntı: mesajı görüntüle
    sitenin açılma süresi önemli değil, önemli olan paralel olarak bağlanması. foreach ile diziyi döngüye aldığımızda dizinin ilk elemanındaki sitede işlemler bitene kadar ikinci elemana geçmiyor. fakat aynı anda dizideki 10 siteyi işleme alırsa zamandan kazanmış olacağız. diğer türlü düşünün ki elinizde 100,000 adet bağlanılacak url var, 1 url için geçen zaman 7sn olsun. 7/24 bot çalışırsa tam 8 günde işlemler biter, tabi bu da mümkün olmuyor çünkü kaynak sitedeki bir sorunda bot duruyor zaten (sunucunun restart edilmesi gibi..) , bu durumlarda manuel kontrol edip botu kaldığı yerden devam ettirmen gerekiyor . bu da işlemin çok çok uzaması anlamına geliyor.. biraz yabancı kaynaklara göz attım, dediğim işlemin curl_multi_exec ile yapılabildiğini gördüm, henüz üzerinde çalışıyorum..

    --R10.NET; Flood Engellendi -->-> Yeni yazılan mesaj 19:16:15 -->-> Daha önceki mesaj 18:46:06 --

    benzer arayışı olanlar için örnek uygulamayı paylaşıyorum;

    $urls = array
    (
        0 => 'https://www.r10.net',
        1 => 'http://www.imdb.com', 
        2 => 'http://www.yahoo.com',
    );
    
    $mh = curl_multi_init();
    $handles = array();
    
    foreach ($urls as $url)
    {
        $handles[$url] = curl_init($url);
    
        curl_setopt($handles[$url], CURLOPT_TIMEOUT, 0);
        curl_setopt($handles[$url], CURLOPT_AUTOREFERER, true);
        curl_setopt($handles[$url], CURLOPT_FAILONERROR, true);
        curl_setopt($handles[$url], CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($handles[$url], CURLOPT_RETURNTRANSFER, true);
        curl_setopt($handles[$url], CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($handles[$url], CURLOPT_SSL_VERIFYPEER, false);
    
        curl_multi_add_handle($mh, $handles[$url]);
    }
    
    $running = null;
    
    do {
        curl_multi_exec($mh, $running);
        //usleep(200000);
    } while ($running > 0);
    
    foreach ($handles as $key => $value)
    {
        $handles[$key] = false;
    
        if (curl_errno($value) === 0)
        {
            $handles[$key] = curl_multi_getcontent($value);
        }
    
        curl_multi_remove_handle($mh, $value);
        curl_close($value);
    }
    
    curl_multi_close($mh);
    
    echo '<pre>';
    print_r(array_map('htmlentities', $handles));
    echo '</pre>';
    Bu şekilde kullanarak phpnin işlem süresini kısaltmaktan ziyade her url için bağlantı süresini tek tek beklemektense 10 urlye aynı anda bağlantı yapacağı için işlem 10 kat hızlanır. Güzel yöntem.
  • 10-09-2013, 22:05:31
    #6
    Ben durumu php satır atlarken yavaş çalışıyor şeklinde yanlış anlamıştım. Dediğiniz gibi multi bağlantı ile hız artabilir. Çözümü de yazmışsınız herkesin işine yarar, teşekkürler...