• 23-06-2022, 11:00:36
    #1
    Öncelikle merhabalar. Yazılım alanında kendimi geliştirmeye çalışıyorum. Bu nedenle soracağım sorular eğer yanlış ise lütfen kusura bakamyın.
    Ben bir siteden belirli veriler alabilen basit bir curl yazdım. Yaptığım Curl çalışıyor fakat tek url'den tek sayfa verisi çektiriyor. Benim istediğim şey;

    ornekurl.com/ornek
    ornekurl.com/ornek2
    ornekurl.com/ornek3

    Şeklinde, aynı web sitesi içerisinden farklı url yapılarına sahip sayfaların içerisinden eş zamanlı veri çekmek. Çektireceğim içerik içerisinde tablo ve div yapıları aynı bu nedenle ekstra bir komut belirlemeyeceğim.
    ---NOT2---
    https://www.php.net/manual/tr/functi...multi-init.php bu linke baktım fakat çok anlayamadım.
    Basit bir işlem önerirseniz sevinirim.
    ---KODUM---
    $sayfaurl = 'https://www.ornekLink.com/a-1'; // Sayfa URL $html = file_get_html($sayfaurl); // Url'e gönderiyorum
  • 23-06-2022, 11:20:35
    #2
    Kendi kullandığım aşağıda ki örnek işinizi görebilir sanırım hocam


    // Coklu cUrl Fonksiyon
    function __mcUrl($urls = []){
        if( is_array($urls) && count($urls) > 0 ){
    
            $mcurl    = curl_multi_init();
            $curl_opt = array(
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_MAXREDIRS      => 1,
                CURLOPT_FOLLOWLOCATION => 0,
                CURLOPT_SSL_VERIFYPEER => false,
                CURLOPT_CONNECTTIMEOUT => 20,
                CURLOPT_TIMEOUT        => 20,
                CURLOPT_ENCODING       => '',
                CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST  => 'GET',
                CURLOPT_HTTPHEADER     => ['accept-language: en', 'cache-control: no-cache'],
            );
    
            foreach ($urls as $key => $url) {
                $curl[$key] = curl_init();
                curl_setopt_array($curl[$key], $curl_opt);
                curl_setopt($curl[$key], CURLOPT_URL, $url);
    
                curl_multi_add_handle($mcurl, $curl[$key]);
            }
    
            $mcurl_run = null;
            do{
                curl_multi_exec($mcurl, $mcurl_run);
            }while ( $mcurl_run > 0 );
    
            $items = [];
    
            foreach ($urls as $key => $url) {
                $url_error = curl_error($curl[$key]);
                $url_data  = curl_multi_getcontent($curl[$key]);
    
                $items[$key] = (object)array(
                    'status' => $url_data && empty($url_error) ? true : false,
                    'key'    => $key,
                    'url'    => $url,
                    'error'  => $url_error,
                    'data'   => $url_error ? '' : $url_data,
                    );
    
                curl_multi_remove_handle($mcurl, $curl[$key]);
            }
    
            curl_multi_close($mcurl);
    
            return (object)$items;
        }
        return false;
    } 
    
    
    
    // Kullanım
    $urls      = ['https://google.com', 'https://twitter.com'];
    $urls_data = __mcUrl($urls);
    
    
    
    // Return data
    /*
    stdClass Object
    (
        [0] => stdClass Object
            (
                [status] => 1
                [key] => 0
                [url] => https://google.com
                [error] => 
                [data] => '.....'sitedata.....'
    
            )
    
        [1] => stdClass Object
            (
                [status] => 1
                [key] => 1
                [url] => https://twitter.com
                [error] => 
                [data] => '.....'sitedata.....'
            )
    )
    */
  • 23-06-2022, 11:20:45
    #3
    Hocam curlu fonksiyona sokup 3 kere çağırmayı deneyemez misiniz? yoksa istediğiniz 3 sitenin aynı anda işleme sokulması ise async await araştırmanızı öneririm
  • 23-06-2022, 12:07:01
    #4
    Fonksiyon("url");
    İcurl = preg_match

    Foreach

    İcurl

    ...
  • 23-06-2022, 13:31:49
    #5
    Misafir adlı üyeden alıntı: mesajı görüntüle
    Fonksiyon("url");
    İcurl = preg_match

    Foreach

    İcurl

    ...
    Hocam öncelikle zaman ayırdığınız için çok teşekkürler.
    Mantık yürütmeye çalıştım ama yeni olduğum için kafamda çok oturtamadım. Rica etsem çalışan bir örnek yapabilir misiniz?
    O örnek üzerinden ben kendim geliştirmeye çalışırım.
  • 23-06-2022, 13:32:49
    #6
    mikropiks adlı üyeden alıntı: mesajı görüntüle
    Kendi kullandığım aşağıda ki örnek işinizi görebilir sanırım hocam


    // Coklu cUrl Fonksiyon
    function __mcUrl($urls = []){
        if( is_array($urls) && count($urls) > 0 ){
    
            $mcurl    = curl_multi_init();
            $curl_opt = array(
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_MAXREDIRS      => 1,
                CURLOPT_FOLLOWLOCATION => 0,
                CURLOPT_SSL_VERIFYPEER => false,
                CURLOPT_CONNECTTIMEOUT => 20,
                CURLOPT_TIMEOUT        => 20,
                CURLOPT_ENCODING       => '',
                CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST  => 'GET',
                CURLOPT_HTTPHEADER     => ['accept-language: en', 'cache-control: no-cache'],
            );
    
            foreach ($urls as $key => $url) {
                $curl[$key] = curl_init();
                curl_setopt_array($curl[$key], $curl_opt);
                curl_setopt($curl[$key], CURLOPT_URL, $url);
    
                curl_multi_add_handle($mcurl, $curl[$key]);
            }
    
            $mcurl_run = null;
            do{
                curl_multi_exec($mcurl, $mcurl_run);
            }while ( $mcurl_run > 0 );
    
            $items = [];
    
            foreach ($urls as $key => $url) {
                $url_error = curl_error($curl[$key]);
                $url_data  = curl_multi_getcontent($curl[$key]);
    
                $items[$key] = (object)array(
                    'status' => $url_data && empty($url_error) ? true : false,
                    'key'    => $key,
                    'url'    => $url,
                    'error'  => $url_error,
                    'data'   => $url_error ? '' : $url_data,
                    );
    
                curl_multi_remove_handle($mcurl, $curl[$key]);
            }
    
            curl_multi_close($mcurl);
    
            return (object)$items;
        }
        return false;
    } 
    
    
    
    // Kullanım
    $urls      = ['https://google.com', 'https://twitter.com'];
    $urls_data = __mcUrl($urls);
    
    
    
    // Return data
    /*
    stdClass Object
    (
        [0] => stdClass Object
            (
                [status] => 1
                [key] => 0
                [url] => https://google.com
                [error] => 
                [data] => '.....'sitedata.....'
    
            )
    
        [1] => stdClass Object
            (
                [status] => 1
                [key] => 1
                [url] => https://twitter.com
                [error] => 
                [data] => '.....'sitedata.....'
            )
    )
    */
    Hocam cevap için teşekkür ederim. Ama bu çok gelişmiş bir şeye benziyor. Çok anlayamadım
  • 23-06-2022, 13:49:07
    #7
    iltu33 adlı üyeden alıntı: mesajı görüntüle
    Hocam cevap için teşekkür ederim. Ama bu çok gelişmiş bir şeye benziyor. Çok anlayamadım
    arkadaş en basit mantığını paylaşmış sizinle, asenkron için bundan daha basiti yok varsa da ben bilmiyorum.
    php fibers async http, react-php async http, swoole php async diye aratırsanız diğer yöntemleri görerek karar verebilirsiniz.
  • 23-06-2022, 15:58:20
    #8
    iltu33 adlı üyeden alıntı: mesajı görüntüle
    Hocam öncelikle zaman ayırdığınız için çok teşekkürler.
    Mantık yürütmeye çalıştım ama yeni olduğum için kafamda çok oturtamadım. Rica etsem çalışan bir örnek yapabilir misiniz?
    O örnek üzerinden ben kendim geliştirmeye çalışırım.
    for'lu bir örnek sana hocam

    function Curlz($gurl)
    {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_URL, $gurl);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.8.1) Gecko/20061010 Firefox/2.0");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
    }
    
    $cek=Curlz("https://wordpress.org/news/feed/");
            $hup = explode('<item>',$cek);
            for ($i=1;$i<count($hup);$i++) {
    preg_match('#<link>(.*?)</link>#si',$hup[$i], $url);
    
    $iurl = Curlz ($url[1]);
    
    preg_match('#<title>(.*?)</title> #si',$iurl, $yurl);
    echo $yurl[1];
    }
  • 24-06-2022, 01:20:18
    #9
    verdiğiniz örnek senkron çalışır yani sırayla çalışır, arkadaş asenkron istiyor. verdiğiniz örnekten yola çıkarsak feed link de bulunan tüm urllere aynı anda eş zamanlı bağlantı açmak istiyor,
    sizin verdiğinizde bağlantı ve işlem bittikten sonra sıradakine geçer.

    Misafir adlı üyeden alıntı: mesajı görüntüle
    for'lu bir örnek sana hocam

    function Curlz($gurl)
    {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_URL, $gurl);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.8.1) Gecko/20061010 Firefox/2.0");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
    }
    
    $cek=Curlz("https://wordpress.org/news/feed/");
            $hup = explode('<item>',$cek);
            for ($i=1;$i<count($hup);$i++) {
    preg_match('#<link>(.*?)</link>#si',$hup[$i], $url);
    
    $iurl = Curlz ($url[1]);
    
    preg_match('#<title>(.*?)</title> #si',$iurl, $yurl);
    echo $yurl[1];
    }