mgsmus Ancak bu kadar guzel anlatila bilirdi elinize saglik. O zaman soyle soyleleyim size gecen sefer anlattigim siteden veri cekme mesela. Benden 1000 sayfadan veri cekmem isteniyor. pagination var. O zaman Her page icin job yaratmam ve onu kuyrukla arka planda calistirmam gerek oyle degilmi? kullanicidida arkadan giden isdden haberi olmaz. Ve Crona bagli her 1 saatda bir request aticak , o zaman fazla bilgi icin job olusturucam oylemi? SAdece tek anlamadigm job un bir tanesi 1 sayfadan veri cekicekse diger joblari mesele 100 tane job lazim kuyrukta ayni isi gorucek dinamik olarak create yapmak mumkunmu? kendisi mesele 10000 veriyi 100 job olarak queue da isletsin.
Cron job local
$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.
- Düzenlendi
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?
- En İyi YanıtCodeWriteson tarafından
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")
...
mgsmus Cok Tesekkurler.
- Düzenlendi
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?
CodeWriteson Redis bir program, doğal olarak nerede kullanacaksanız oraya kurmanız lazım.
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
- 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
- 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.