Laravel Schedule

C++ JAVA
Post Reply
User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3385
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 128

Laravel Schedule

Post by dakata__92 » Fri Apr 16, 2021 9:08 am

Колеги, пуснах си една крон задачка, всяка минутка да върти и експортва огромен лог ако има заявка за това. Проблема, е че се припокриват виканията на функцията и съответно сложих кеш, но това не е решение.

Code: Select all

$schedule->command('export:csv')->everyMinute()->runInBackground()

Code: Select all

public function run()
    {
        $data = [];
        $export = new Export;
        $items = $export::where('status', '=', 0)->get();
        foreach ($items as $key => $item) {
            $key = 'cron_'.$item->id.'_'.md5($item->json);
            if (cache()->has($key)) {
                Debug::set('Task ('.$key.') has already started!');
                continue;
            }
            cache()->put($key, $item->id, 3600);
            try {
                switch ($item->type) {
                    case 1:
                        $data['log_1'][] = $this->logOne($export, $item);
                        break;
                    case 2:
                        $data['log_2'][] = $this->logTwo($export, $item);
                        break;
                }
            } catch (\Throwable $e) {
                continue;
            }
        }
        Debug::set($data);
    }
Мисля да сложа withoutOverlapping() но при това положение вероятно ще е необходимо в run да сложа while(true) {}:

Code: Select all

public function run()
    {
		while(true) {
			$data = [];
			$export = new Export;
			$items = $export::where('status', '=', 0)->get();
			foreach ($items as $key => $item) {
				$key = 'cron_'.$item->id.'_'.md5($item->json);
				if (cache()->has($key)) {
					Debug::set('Task ('.$key.') has already started!');
					continue;
				}
				cache()->put($key, $item->id, 3600);
				try {
					switch ($item->type) {
						case 1:
							$data['log_1'][] = $this->logOne($export, $item);
							break;
						case 2:
							$data['log_2'][] = $this->logTwo($export, $item);
							break;
					}
				} catch (\Throwable $e) {
					continue;
				}
			}
			Debug::set($data);
		}
    }
Какво бихте ми предложили за да не се преизвикват вече стартирали заявки със статус 0 и още не обновили статуса на 1? Старите кронове ги въртях с bash команди и нямах проблем с преизвикване, защото правех безкраен цикъл и на практика слушах нонстоп една инстанция на крона и ако процеса е спрял вдигам нова.

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 950
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 67

Re: Laravel Schedule

Post by Revelation » Fri Apr 16, 2021 10:26 am

В такъв случай ти трябва опашка, а не крон.

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3385
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 128

Re: Laravel Schedule

Post by dakata__92 » Fri Apr 16, 2021 1:04 pm

Revelation wrote:
Fri Apr 16, 2021 10:26 am
В такъв случай ти трябва опашка, а не крон.
Коя функционалност предлагаш да погледна?

Fakeheal
Гуру
Гуру
Posts: 2719
Joined: Sat Apr 17, 2010 6:37 am
Answers: 351
Location: /r/eyebleach
Contact:

Re: Laravel Schedule

Post by Fakeheal » Fri Apr 16, 2021 1:07 pm

dakata__92 wrote:
Fri Apr 16, 2021 1:04 pm
Revelation wrote:
Fri Apr 16, 2021 10:26 am
В такъв случай ти трябва опашка, а не крон.
Коя функционалност предлагаш да погледна?

https://laravel.com/docs/8.x/queues

Идеята е, вместо всяка минута да проверяваш дали някой е пожелал експортването на този лог (предполагам е в крон, защото инак не му стига време/памет и в cli има по-малко рестрикции), когато някой поиска големия експорт, да го пушнеш в опашка (queue).

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 950
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 67

Re: Laravel Schedule

Post by Revelation » Fri Apr 16, 2021 2:03 pm

И понеже не искаш да се overlap-ват: https://laravel.com/docs/8.x/queues#pre ... b-overlaps

П.П. Иначе трябва да се занимаваш да слагаш флагове или да изчислиш колко време е бил най-дългия експорт и да нагодиш крона по него. Но ако това не може да се изчисли понеже времената могат да зависят от много фактори, пак ще получиш overlap.

За това най-добре е да слагаш на опашката.

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3385
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 128

Re: Laravel Schedule

Post by dakata__92 » Mon Apr 19, 2021 12:37 pm

С междинен статус в базата с данни стана работата. Отделно ползвам нещата така:
$schedule->command('export')->everyMinute()->withoutOverlapping()->runInBackground();

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 950
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 67

Re: Laravel Schedule

Post by Revelation » Mon Apr 19, 2021 3:28 pm

:handgestures-thumbupright: :handgestures-thumbupright:

Veiveismart
Нов
Нов
Posts: 1
Joined: Tue Apr 27, 2021 7:43 am

Re: Laravel Schedule

Post by Veiveismart » Tue Apr 27, 2021 7:46 am

Тази схема изглежда много интересна
We have some products like WOW Classic GOLD,RS GOLD,MUT 21 COINS,if you want to buy, You can access
mywowgold mmoexp rsgoldfast

Post Reply