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

CodeWriteson

$lastPage = 120; // Bunu önce çekeceksiniz. Çektiniz, 120 geldi.

for($i = 0; $i < $lastPage; $i++) {
    ScrapUrl::dispatch(
        sprintf("https://www.site.com/haberler?page=%d", $i)
    );
}

Bu yani kabaca yapacağınız.

Daha önce de dediğim gibi sayfa no olmayan, arkada yapan, ajax kullanan vs siteler için strateji belirleyip nasıl sayfaladığını kayıtları getirdiğini bulup ona göre işlem yapacaksınız.

Eyvallah. o zaman ben en iyisi scrapper manager i sizin onerdiginiz ScrapperMAnager - command icinde degilde job olusturarak onun icinde cagirayim .dogru anladim umarim. Bundan once ScrapperCommand olsuturmustum

public function handle()
{
$scrapper = new ScrapperManager([
Service1::class => 'url1l',
Service2::class => 'url2r',
]);

    foreach($scrapper->scrap() as $data) {
        // data --> ScrappedData olacaq.
        News::firstOrCreate([
            'site_name' => $data->getSiteName(),
            'title' => $data->getTitle(),
        ], [
            'link' => $data->getLink(),
            'img' => $data->getImage()
        ]);
    }

    $this->info('Successfully scrapped');
}

sondada schedule:work yaparak calistiriyordum . commandi job a degistirecem o zaman oylemi?

    CodeWriteson Command kalacak, datayı çeken kısmı Job yapacaksınız. Komutu işleri kuyruğa atmak için kullanacaksınız. Yani ScrapperCommand her bir link için kuyruğa Job atmakla yükümlü olacak.

      mgsmus Hocam o zaman commandda yaptigim data cekmeyi job a aktaricam. Amma mesela her service de kendi icerisinda buyuk veriler return yapiyor. Ve en onda scrapper manager ile verilen toplaniyor bir yerde. O kisim icin job falan gerekli degilmi mesela her service icin. Sonucta veriler servislerden gelip toplaniyor ayni veri zaten toplaniyor ve en sonda isleniyor. Sadece command kisimdaki veri islemeyi job yaparsak yetecekmi?

      mgsmus Hocam birde son olarak queue_connection sync mi olacak yoksa database mi? bu durumlarda hangiisi onerilir?

        sineld Ben en iyisi sizi boşa uğraştırmayayım direkt istediğiniz cevabı vereyim: Her bir URL'deki veriyi çekip kaydeden işi kuyruğa atacaksınız, arkada çekip kaydedecek.

        ScrapUrl::dispatch("http://site.com/?page=1")
        ScrapUrl::dispatch("http://site.com/?page=2")
        ScrapUrl::dispatch("http://site2.com/?page=1")
        ...

          CodeWriteson Ben Redis kullanıyorum, memnunum. Sync demek kuyruk yok, direkt ateşle demek 🙂 Redis imkanı varken database tavsiye etmiyorum.

            mgsmus Redis olurken local de ve sunucuda ayri ayri kurulummu yapmam gerecek?

              mgsmus Hocam oncelikle cok tesekkurler soyledikleriniz cok yardimci oldu. Calisirken biraz arastirma falan yaptim ve boyle bir seyle karsilastim.

              Queue::push(new InvoiceEmail($order));

              Bus::dispatch(new InvoiceEmail($order));

              mesela bunlar ne is yapiyor? yani anladim queue ya job ekliyor. Amma anlamadim kullanilma yerlerini. Mesela benim istedigim ornekte gereklimi kullanmak? Degilse ne zaman gerekli

                • mgsmus

                  Seviye 1384
                • Düzenlendi

                CodeWriteson Bunlar eskiden Job mantığı yokken kullanılıyordu, size gerekli değil, arka planda aktifler sadece.

                Siz bir Job'ı ShouldQueue arayüzü ile gerçeklediğinizde dispatch(new InvoiceEmail($order)) yaptığınızda otomatik olarak kuyruğa alır, Queue::push yapmanıza gerek kalmaz. Ayrıca dispatch(new InvoiceEmail($order)) ya da InvoiceEmail::dispatch($order) şeklinde Job'ı ateşleyebiliyorsunuz, Bus::dispatch yapmanıza gerek yok.

                Güncel dokümanlarda olanın dışına çıkmamaya çalışın, kafanız karışmasın. Tam 5 yıl önceki bilgiyi bulup getirmişsiniz.

                  mgsmus Eyvallah. Once guncel dokumanlara bakmistim zaten o yuzden bu karsima cikinca tam anlayamadim. Tesekkurler bilgi icin.

                  mgsmus Hocam Ben islem bitdikden sonra Job islemleri kullaniciya bildirim gondermek istiyorum. Job un bitdigini AppServiceProviderde Queue nun ozellikleriylemi yakalicam yoksa baska bir yolu varmi?

                    CodeWriteson AppServiceProvider'da da yaptırabilirsiniz Job içerisinde en son işlem olarak da. Eğer Job'ın kendisiyle ilgili işlemler yapmak istiyorsanız AppServiceProvider'da Queue kullanmak mantıklı ama yapacağınız iş Job ile değil de Job'ın içeride yaptığı iş ile alakalı ise Job içerisinde yapılması daha iyi olur diye düşünüyorum.

                      mgsmus Job un icerisinde job bitdikden sonra mesaj cikarma ozelligi bulamadim. Yani job un bitme eventi gibi.Islem sonuna bir parametre yazdigimda o degeri alamiyorum. Livewire a cevirip realtime mi yapsam yoksa nasil bilemedim

                        CodeWriteson Bir tablo oluşturup içerisinde job ile bilgileri ve diğer istediğiniz alanları ekleyin. Job içerisinde, Job sonunda (yani handle yöntemi kapanmadan) istediklerinizi bu tabloya yazdırın. Job işini bitirince çıktıyı tabloya yazmış olacak

                        Öteki türlü Queue::after içinde $event->job->payload()['data']['command'] unserialize edip içinden kendi eklediğiniz bir public özelliğe ulaşmanız ve işlemleri Queue::after içinde yapmanız gerekecek ki ben yazarken bile bunun yanlış bir yol olduğunu anlıyorum.

                          mgsmus Anladim tesekkurler sadece takildigim nokta sadece istedigim job bitdikden sonra kullaniciya bilgilendirme alerti cikarip "Islem basariyla bitdi " demek. Bunun icin tablo olusturmaya gerek varmi onu anlayamadim

                            • mgsmus

                              Seviye 1384
                            • Düzenlendi

                            CodeWriteson Anlayamamanız normal çünkü ne istediğinizi yazmıyorsunuz ki, bir şeyler anlatıp duruyorsunuz. Biz sizin Job bittikten sonra bilgilendirme alerti çıkartmayı istediğinizi nereden bilelim. En başında deseydiniz, Job içinde bitti diye event fırlatın, broadcasting ile eventı yakalayın derdim. Bu iş kurgu gerektiren bir iş, üstelik sadece Job sahibi kullanıcıya bildirim gitmeli vs. Yolunuz açık olsun.

                              mgsmus Hocam aslinda. yukarida --- "mgsmus Hocam Ben islem bitdikden sonra Job islemleri kullaniciya bildirim gondermek istiyorum. Job un bitdigini AppServiceProviderde Queue nun ozellikleriylemi yakalicam yoksa baska bir yolu varmi? " gibi yazmistim . Dogru anlatamadiysam kusura bakmayin benim hatam. Tesekkurler