Laravel curl için yol haritası lazım

Merhabalar,Laravel de curl icin thread mantigi varmidir.Bi ürün karşılaştirma sitesi yapmak isiyorum.Yapilan urun ismine gore ayni anda belirledigim sitelerden verileri getirmesi lazim.

yoksa belirledigim her site icin ayri bir bot mu yapmam lazim.

Merhaba; her site için ayrı bot yazmanız gerekiyor. Bot dolaştırma işlemlerinin eşzamanlı çalışması için de kuyruklama mantığına bakabilirsiniz Laravel tarafında: https://laravel.com/docs/8.x/queues

Ancak bu asenkron bir çalışma gerektirir. Yani; kullanıcı siteye girsin, bir şey aratsın, siz o esnada arkada bütün sitelere gidin, toplayın, getirin, karşılaştırın, kullanıcı için çıktıyı üretin, yanıtı kullanıcıya gönderin şeklindeki bir akış mantıklı olmaz.

Genelde şöyle yapılır; yazdığınız botlar, bir servis üzerinde sürekli olarak çalışarak veri okuyacağınız sistemler üzerinde dolaşır, veriyi oralardan alıp sizin doğrudan erişebileceğiniz bir yerde toplar. Kullanıcınızdan talep geldiğinde siz bu talebe göre doğrudan yanıt döndürürsünüz çünkü veriler zaten elinizde vardır. Tam senkron olmasa da doğru ve hızlı çalışmaya en yakın yaklaşım budur. Ne kadar fazla iş gücünüz varsa kuyruğunuz o kadar sık baştan baştan dolaşılır. Orada da veri kıyaslamadaki yetenekler devreye giriyor. Son kullanıcıya “bu ürüne dair son verileri şu tarih şu saatte aldım he” diye bir uyarı da gösterdiğinizde büyük oranda çözülüyor.

Böyle işler yaptık, danışmanlığını verdik, bot hizmetleri sağladık. Sektörde de böyle dönüyor yani işler. Bu yönden deneyebilirsiniz :slightly_smiling_face:

1 Beğeni

Gayet açıklayıcı olmuş.Mantığı oturdu şimdi teşekkürler

Merhaba Hocam,
Bu olayın biraz daha basitini sorayım size.
source_sites isimli bir tablom var ve ben buraya wordpress woocommerce websitelerimi bağlıyorum tablo yapısı şöyle olsun
id - site_url - api_version - consumer_key - consumer_secret

kaynak : laravel-woocommerce/WooCommerceApi.php at master · Codexshaper/laravel-woocommerce · GitHub

şu durumda benim SourceSite diye bir Modelim var. ben şunu yapmak istiyorum
siteadi.com/admin/sources/1/orders şeklinde girdiğimde hedef websitemdeki siparişleri görmek istiyorum.
Şu durumda modelimin içinde şöyle bir method oluştursam ve controller içinde
$sourcemodel = model::find($id);
$sourceClient = $sourceModel->getWCClient();
şeklinde ulaşıp curl istekleri yapmam Laravel için aykırı bir olay mı?

Model Methodu

public function getWCClient(){
return new Client(
$this->site_url,
$this->consumer_key’,
$this->consumer_secret’,
[
‘version’ => ‘wc/’.$this->api_version,
‘timeout’ => config(‘woocommerce.timeout’),
]
);
}

Ayrıca kaynak gösterdiğim paket service provider kısmında singleton kullanıyor. onlarca farklı paket gördüm hepsi hemen hemen singleton. ve hepsi .env dosyasında belirlenen config değerlerini alıyor. dinamik parametreler verildiğini hiç görmedim

$this->app->singleton(‘WooCommerceApi’, function () {
return new WooCommerceApi();
});

şu yazıyı 20 dk sürdü yazdım :slight_smile: umarım anlatabilmişimdir .

Merhaba Resul, hoşgeldin foruma :slight_smile:

Dediğin şey kesinlikle çalışır, bunun için de gerekli yapıyı kendin kurmanı öneririm. Yani Laravel tarafındaki Model üzerinden oluşturduğun örnekler üzerinden “şimdi bunun kaydını ver” diyorsun ya mesela, sonra o kayıt üzerinden bir Client alıp o Client ile de işlemler yapmak istiyorsun. Müthiş mantık.

Gönderdiğin örnek pakete baktım, zaten Laravel içindeki .env->config ayarları okuyup sonra bir Client başlatıyor, o Client da aslında automattic/woocommerce diye bir paketten aslında WooCommerce’in kendi clientını getiriyor: automattic/woocommerce - Packagist

Haliyle gerekli girdileri verdiğinde bu Clientı döndürecek bir method yazabilirsin içeriye. Hatta ben olsam şöyle yapardım. SourceSite diye bir model var ya elimde, onun üstüne direkt WooCommerce’ten okumak istediğim işlemler için metodlar yazardım.

Örnek;

$site = SourceSite::find(5);
$site->orders();

böyle yaptığımda bana WooCommerce üstünden dönecek siparişleri gösterecek bir yapı kurardım. Bunu nasıl yapabilirim?

public function orders()
{
    return collect($this->getClient()->get('orders'));
}

burada ilgili objenin kendi Client’ını isteyip onun üzerinden get('orders') çalıştırıp gelen yanıtı da collect(...) ile collection’a çevirdim ki kullanırken kolaylık olsun :slight_smile:

Peki bu getClient kısmı nasıl olacak?

public function getClient()
{
    if(is_null($this->wooClient)) {
        $this->wooClient = new \Automattic\WooCommerce\Client(
            $this->site_url, 
            $this->consumer_key, 
            $this->consumer_secret,
            [
                'version' => $this->api_version,
            ]
        );
    }
    return $this->wooClient;
}

Tabii modelin içinde tepeye bir tane şunu eklemek lazım;
protected $wooClient;

Yani mantığı açıklayabilmek için aklımdakileri yazdım ama işine yarayacaktır diye düşünüyorum. Direkt böyle olmasa da benzer bir yapıyla kurabilirsin :slight_smile:

1 Beğeni

Hoşbuldum hocam :slight_smile:
Gerçekten ufkumu açtın. Sadece bu mantık iyi mi kötü mü düşünerek projeyi iptal etmiştim. artık bitirebilirim :slight_smile:

forum çok güzel olmuş yakında laravel sail ile ilgili çok sorum olacak

1 Beğeni