• 24-10-2021, 00:54:20
    #1
    Merhaba,
    Küçük bir sorunum var önerilerinizi alıp yol göstermenizi rica edecektim.
    Multi Curl ile bir URL'ye bağlanıp veri çekiyorum, yaptığım multi curl fonksiyonunda şimdiye kadar sorun yaşamadım,
    ama bu sefer veri çektiğim sunucuda mı sorun var yoksa benim fonksiyonda mı değişiklik yapmak gerekiyor bilemiyorum

    Aynı sunucuda 2000 3000 url'ye istek atıp içeriğini çekiyorum (içerik Json formatında),
    sorun şu ki bazen içerik olduğu halde sonuç boş dönüyor, içerik her url'de kesin olsa boş dönenleri tekrar gönderirim ancak bazı url'lerde normalde de içerik yok.
    Boş sonuç dönderen url'ye bir tıklıyorum veri var. 2000 tane url'de var bazıları doğru dönüyor bazıları yanlış (boş) tabi doğru ve yanlış sonuç dönderen url ler her çalıştırmam da değişiyor.
    Sunucuda biraz sıkıntılı sanırım, url'lere tıklıyorsun verinin gelmesi 3-4 sn sürüyor. Bununla alakası olabilir mi bilmiyorum.

    Bu arada amatörüm, multi curl konusunda güzel Türkçe döküman bulamadığım için biraz ezbere bir multı curl fonksiyonu yazdım.
    Yardımcı olur yol gösterirseniz çok mutlu olurum.

    function multiCurl($arr)
    {
    $curl = array();
    $again = array();
    static $results = array();
    
    // Coklu Curl Tanitisici
    $mCurl = curl_multi_init();
    
    // ************* Tekli Curl Taniticilari *************
    
    foreach ($arr as $key => $url)
    {
    $curl[$key] = curl_init();
    curl_setopt_array($curl[$key], array(
    CURLOPT_URL => $url,
    CURLOPT_CONNECTTIMEOUT => 0,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_FOLLOWLOCATION => TRUE,
    CURLOPT_HEADER => FALSE,
    CURLOPT_REFERER => 'https://www.google.com.tr.',
    CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'],
    ));
    
    curl_multi_add_handle($mCurl, $curl[$key]);
    }
    
    // ************ Multi Curl Islemleri ************
    
    $active = null;
    
    do {
    $status = curl_multi_exec($mCurl, $active);
    if ($active) {
    curl_multi_select($mCurl);
    }
    }
    while ($active && $status == CURLM_OK);
    
    // ****** Tekli Curl Kapat ve Sonuclari Al *******
    
    foreach ($curl as $key => $c)
    {
    $httpCode = curl_getinfo($curl[$key], CURLINFO_HTTP_CODE);
    
    // Baglanti Hatası veya Curl Hatasi varsa Again Aktar
    if ($httpCode != 200 || curl_errno($curl[$key]))
    {
    $again[$key] = $keyProducts[$key];
    }
    else
    {
    // Sonuclari Diziye Aktar
    $results[$key] = curl_multi_getcontent($curl[$key]);
    }
    
    curl_multi_remove_handle($mCurl, $curl[$key]);
    
    curl_close($curl[$key]);
    }
    
    curl_multi_close($mCurl);
    
    if (count($again) != 0) multiCurl($again);
    
    return $results;
    }
  • 24-10-2021, 01:00:41
    #2
    Merhaba, sorunuza cevap olur mu bilmem ama;
    Boş JSON response'ları en azından "{}" içermiyor mu?
  • 24-10-2021, 01:14:13
    #3
    KodFabrik adlı üyeden alıntı: mesajı görüntüle
    Merhaba, sorunuza cevap olur mu bilmem ama;
    Boş JSON response'ları en azından "{}" içermiyor mu?
    Hocam boşlar "[ ]" şeklinde dönüyor, bunu nasıl lehime çevirebilirim sizce, aklıma bir şey gelmedi.

    Edit: Aklıma bir kaç şey geldi bakim aklımdaki gibi olacak mı? Mantıklı bir yaklaşım gibi hocam.
    Şöyle bir kontrol yapısı oluşturabilirim doğrumudur, içerik "[ ]" ise doğrudur ve devam et, içerik tamamen boş ise tekrar gönder.
    Buda güzel bir yaklaşım ama bu işi curl fonksiyonu içinde çözmemiz gerekmez mi yani merak ettiğim sonuç neden boş dönüyor, ben genelde 2000 3000 url içeriği çekiyorum, böyle olunca acaba önceki yaptığım scriptlerde de hatalı sonuçlar elde ettim mi acaba diye aklımda soru işareti kalıyor. O Yüzden direk curl ile sorunu çözmek istiyorum.
  • 24-10-2021, 01:57:36
    #4
    KodFabrik adlı üyeden alıntı: mesajı görüntüle
    Merhaba, sorunuza cevap olur mu bilmem ama;
    Boş JSON response'ları en azından "{}" içermiyor mu?
    Hocam aşağıdaki şekilde basit bir şey yaptım deneme için sonuçlar yine alakasız. Anlamadım mantıken çalışması gerekmez mi?
    Şöyle bir şey oluyor olabilir mi sunucuda mime application/json olduğu için, bağlantı kuruluyor içerik direk "[]" şeklinde geliyor içi sonra dolduruluyor olabilir mi?
    çünkü "boş - sorun yok" yazana bakıyorum gayet var json data dolu dolu. Ama url girince tarayıcıdan içerik biraz geç yükleniyor sorun sanırım buradan kaynaklanıyor, curl daha içeriği alamadan geçiyor olabilir mi?
    Çünkü http code = 200, herhangi bir curl hatası yok 0, ama içerik boş dönüyor anlamıyorum, dediğim gibi içerik geç yüklendiğinden kaynaklanıyor olabilir mi sonuç, curl u bu noktada biraz bekletemezmiyiz içeriği alana kadar.


    if (trim($data) == '[]')
       {
            echo 'bos - sorun yok' ;
        }
        else if (strlen(trim($data)) == 0)
        {
            echo 'hatalı';
        }
        else
        {
            echo  'OK';
        }