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..
PHP ile botu daha hızlı çalıştırma
5
●758
- 10-09-2013, 18:37:19Kimlik doğrulama veya yönetimden onay bekliyor.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ğilbiomooj adlı üyeden alıntı: mesajı görüntüle
- 10-09-2013, 19:16:15sitenin 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..adursun adlı üyeden alıntı: mesajı görüntüle
--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:24bot 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:17Bu ş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.biomooj adlı üyeden alıntı: mesajı görüntüle