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.