Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?

Sayın üstadlarım, bu kodum ile ile ilgili çok soru sordum maruz görün bu son sorum olacak.
aşağıdaki kod ile veritabanından url leri alıp rss feed sayfalarından başlık ve linkleri alarak veritabanına kaydediyorum.
Sorunum , veri tabanından url leri alırken, veritabanında ilişkili oldukları site_id ler var. Bu id leride alıp, kaydederken her url lenin ilgili site_id inide kaydetmem gerekiyor.

$urls = DB::table('urls')->pluck('urls')
        ->toArray();

        $client = new Client();
        $promises = (function () use ($urls, $client) {
            foreach ($urls as $url) {
                yield $client->getAsync($url,[ 'timeout'  =>  300 ],['allow_redirects' => false]);
            }
        })();

    (new EachPromise($promises, [
        'concurrency' => 5,
        'fulfilled' => function (ResponseInterface $response, int $index) {

            $index =  $response->getBody()->getContents();
            $feed = simplexml_load_string($index);

    foreach ($feed->channel->item as $article) {

            DB::table('bot')->insertOrIgnore([
            'baslik' => $article->title,
            'url' => $article->link,
            'created_at' => Carbon::now(),
            'updated_at' => Carbon::now()
        ]);

 }
        }
    ]))->promise()->wait();

    aeneas Bu site_id urls tablosu içinde mi? Bir de her url için site_id benzersiz mi?

      mgsmus evet urls tablosu içinde ama bezersiz değil mesela örnek : wordpress.org/seo/feed , wordpress.org/muzic/feed gibi aynı siteden veri cekıyorsam site_id leri aynı.

        aeneas Guzzle EachPromise kullandığınız için nasıl yaparsınız bilmiyorum.

          mgsmus hocam siz böyle dedikten sonra, benim şu aşamada yapma şansım sıfır. Bu projeye çok zaman ve emek verdim, geri kalan her şeyi bir şekilde hallettim ama projenin en can alıcı kısmı burası. Feedly, Google news tarzı bir site yapmaya çalışıyorum. Üye olan kullanıcı önce sitesini ekliyor. Sonra Google news deki gibi feed kategori sayfalarını ekliyor, bende oradan başlık link ve varsa resimleri alıp yayinliyacam. Ama ilgili site id İ alamazsam saçma bir durum oluyor. Bu şekilde olmuyorsa, bana yol gosterirseniz, gösterdiğiniz yol üzerinden çalışarak yapmaya çalışirim.

            aeneas Zaten size yol gösterdim:
            https://laravel.gen.tr/d/8222-controller-icinde-foreach-problemi/6

            Guzzle cURL üzerine, Http Client da Guzzle üzerine kurulu. Neden Laravel kullanıp Http Client kullanmak istemiyorsunuz anlamıyorum. Laravel 7 altı bir sürüm mü kullanıyorsunuz?

            Paralel işlem yapıyorsunuz, istekler 5'er 5'er aynı anda başlıyor, hangisinin bittiği başladığı belli değil, birbirlerinin bitip bitmemesini beklemiyorlar. Bu durumda istekleri işaretlemeniz lazım. Guzzle ile bu nasıl yapılır bilmiyorum, dokümanlara kodlara vs bakmam lazım. İlk aklıma gelen $feed içinde xml içinde istek atılan url varsa onu çekmek ama her RSS'de aynı yerde mi bilmiyorum.

            Http Client kullanırsanız belki şöyle yapabilirsiniz, ben test etmedim.

            use Illuminate\Http\Client\Pool;
            use Illuminate\Support\Facades\Http;
            
            libxml_use_internal_errors(true);
            
            $urls = DB::table('urls')
                ->get();
            
            $responses = Http::pool(function (Pool $pool) use ($urls) {
                foreach ($urls as $item) {
                    // Her bir request için site_id|url olacak şekilde bir alias oluşturup
                    // yapılan isteğe ekleyeceğiz:
                    $alias = $item->site_id . '|' . $item->urls;
            
                    $requests[] = $pool->as($alias)
                        ->get($item->urls);
                }
            
                return $requests;
            });
            
            foreach ($responses as $alias => $response) {
                if ($response->ok()) {
                    $siteId = explode('|', $alias)[0];
            
                    if ($feed = simplexml_load_string($response->body())) {
                        if ($feed->channel) {
                            foreach ($feed->channel->item as $article) {
                                DB::table('bot')->insertOrIgnore([
                                    'site_id' => $siteId,
                                    'baslik' => $article->title,
                                    'url' => $article->link,
                                    'created_at' => Carbon::now(),
                                    'updated_at' => Carbon::now()
                                ]);
                            }
                        }
                    }
                }
            }

            Test etmedim.

            Hocam kodunuz çalışıyor. Yani finalde başlığı,linki ve ilgili site_id i veritabaına kaydediyor. Ama aynı zamanda hata veriyor. Ne yaptıysam hataları düzeltemedim.

            İlk hata : Call to undefined method GuzzleHttp\Exception\ConnectException::ok()

            Bu nu komple kaldırdıgımda : if ($response->ok()) {

            ikinci hata: Call to undefined method GuzzleHttp\Exception\ConnectException::body()

            if i kaldırıp bu şekilde kullandıgımda:
            $feed = simplexml_load_string($response->body());

            1. hata : Attempt to read property "channel" on bool

            sorunu bir türlü cözemedm.

              aeneas ConnectionException almışsınız, yani adreslerden birine erişememişsiniz. foreach ($responses as $alias => $response) içindeki kısmı try...catch içine alabilirsiniz mesela. Ben sadece yol göstermek için kod yazıyorum, hata kontrolü vs bu tür şeyleri siz halledeceksiniz.