Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][Cron] "Porcjowanie" zadań dla crona?
Forum PHP.pl > Forum > Przedszkole
krzywy36
Chcę aktualizować jedno pole w bazie (w każdym rekordzie) co noc. Problem w tym, że rekordów jest trochę a "aktualizacja" jednego trwa powiedzmy jedną sekundę. Żeby nie wywaliło timeoutu przydało by się jakoś porcjować te rekordy dla jednego requestu, ale nie mam pomysłu jak to zrobić. Teoretycznie mógłbym dodać zadanie w cronie powiedzmy co 2 min, ale jeśli baza zaktualizuje się w pół godziny to przez resztę dnia będzie to na marne wywoływane. Jest jakiś bardziej optymalny sposób?
kayman
pole w bazie np. "cron_timestamp" i tu aktualizujesz tylko rekordy gdzie to pole wskazuje ze było obrabiane więcej niż 24 godziny temu e:/ w jakiejś tam porcji

btw. zależy co to ma robić / jak jest skomplikowana operacja tego update i czy nie da się tego inaczej rozwiazać
Helid
1. Do zapytania dodajesz np. limit 0,10
2. W jakimś miejscu zapisujesz sobie ilość wykonanych do tej pory (plik, baza mysql)
3. Zmieniasz końcówkę zapytania zgodnie z ilością wykonanych do tej pory (odczyt wczesniej zapisanej wartosci)
CuteOne
Jeżeli operacje miły by być wyłącznie na bazie danych to polecam procedury. Na necie znajdziesz sporo materiałów na ten temat.

Jednak gdy operacji nie da sie wykonać bez udziału PHP to:
1. Odpal crona z parametrem p = 1
2. W bazie danych LIMIT $parametr, 10(lub inny zakres)
3. Po zakończeniu iteracji
header('location: skeypt.php?p=$iteracja+1)
krzywy36
@kayman i @Helid, nie zrozumieliście o co chodzi. Głównym problemem nie jest samo "porcjowanie" bo to wiem jak zrobić, głównym problemem jest timeout. @CuteOne, co daje parametr p=1? php raczej jest potrzebne po używam też curla. Co do trzeciego punktu, header('Location:... resetuje timeout? Bo myślałem o takim rozwiązaniu ale właśnie nie wiem czy resetuje czy nie wink.gif

Edit: ale jestem głupi, już czaję ^^ tylko dalej nie wiem jak z tym headerem
CuteOne
W sumie to sam nie wiem czy header zadziała haha.gif

  1.  
  2. $p = isset($_GET['p']) ? $_GET['p'] : 1;
  3.  
  4. if($p > 3) die();
  5.  
  6. file_put_contents('file.txt', $p);// pamiętaj o poprawnej ścieżce lub zastosuj baze danych
  7.  
  8. header('Location: plik.php?p='.$p++);
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.