Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wykonanie skryptu partiami
-Albinos-
post
Post #1





Goście







Witam, chciałbym usłyszeć wasze rady i podpowiedzi w sprawie wykonania skryptu partiami.
Mam sobie skrypt w którym jest pętla, która najpierw łączy się z bazą mysql, pobiera nazwę użytkownika na podstawie nicku łaczy się ze stroną np www.strona.pl/nick, pobiera wymagane dane przez curl, generuje z nich obrazek i kod html oraz aktualizuje te dane w tej samej bazie dla danego użytkownika.
Dla jednego użytkownika trwa to poniżej 5 sekund. Daję też przerwę 5 sekund między osobami(sleep(5) na koncu pętli) żeby serwer tam za bardzo się nie grzał (IMG:style_emoticons/default/wink.gif) .Ale mając w bazie powiedzmy 100 trwa to (łatwo policzyć) (5+5)*100=10000sekund, no a to wszystko chcę uruchamiać przez cron a zazwyczaj hostingi oferują timeout 300sekund.

I teraz sedno. Jak mogę zrobić żeby skrypt dzielił całość na części? Żeby to działało np tak.
Uruchamia się skrypt. Loguje się do bazy, na strone przez curl i rusza pętla.
Pętla pobiera pierwszego użtkownika, pobiera dane generuje co tam ma generować oraz odpoczywa 5 sekund.
I tak do użytkownika o id 10.
Teraz się przerywa skrypt i uruchamia ponownie ale zaczyna już od użytkownika o id 11
i tak po 10 do końca.
Na końcu musi ustawić się jakoś na początku ale już żeby się nie uruchamiało.
Docelowo chcę robić taką aktualizację 2-3 razy dziennie czyli co 12-8godzin.
Pozdrawiam
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
freemp3
post
Post #2





Grupa: Zarejestrowani
Postów: 467
Pomógł: 77
Dołączył: 6.09.2008
Skąd: Miechów / Kraków

Ostrzeżenie: (0%)
-----


Funkcja header nie zadziała Ci w cron. Odpalenie skryptu przy jego pomocy jest równoznaczne z wpisaniem polecenia z palca w konsoli. To że wyślesz nagłowki nic nie da bo konsola ich nie odbierze i nie obsłuży (IMG:style_emoticons/default/wink.gif)
Możesz zrobić to w inny sposób. Skoro chcesz to aktualizować dwa razy na dobę powiedzmy między północą i 12 oraz drugi raz między 12 a północą.
Kolumnę updated ustawiasz jako typ DATETIME i zapisujesz w niej kiedy był zrobiony ostatni update użytkownika. Aby wiedzieć czy skrypt jest wykonywany pierwszy raz dla użytkownika czy drugi należy sprawdzić aktualną godzinę przy pomocy funkcji date:
Kod
$hour = date('H')

Jeśli godzina jest między między 0 a 11 (włącznie) to mamy pierwsze, jeśli między 12 a 23 (włącznie) to drugie. Ustalenie tego jest konieczne do określenia warunku w zapytaniu do bazy, którym będziemy wyciągać użytkowników:
Kod
$date = date('Y-m-d');
if($hour >= 0 && $hour <= 11)
  $date .= '00:00:00';
else
  $date .= '12:00:00';
$sql = 'SELECT * FROM users WHERE updated < ' . $date . 'ORDER BY updated'; // sortujemy według tych, którzy najdłużej nie byli aktualizowani

Przy aktualizacji użytkownika w bazie danych w kolumnie updated podajemy wartość 'NOW()'. W tedy będziemy mieli zapisaną dokładną datę i godzinę, w której użytkownik został zaktualizowany

Co do samego uruchamiania skryptu to tak jak sugerowali poprzednicy uruchamiasz cron-a co określony odstęp czasu. Aby skrypty nie kolidowały tworzysz plik tymczasowy np: .updating.lock, a żeby było jeszcze bezpieczniej w nim umieszczasz aktualny czas:
Kod
file_put_contents('.updating.lock', time())

Po każdym przejściu pętli także należy zaktualizować czas znajdujący się w pliku. Dlaczego umieszczać czas w pliku? Odpowiedź jest prosta. Jeśli skrypt z jakiegoś powodu się wysypie to plik zostanie na stałe, a kolejne uruchamiane skrypty będą "myślały", że pierwszy cały czas działa, dlatego podczas uruchamiania skryptu oprócz sprawdzania czy plik istnieje można sprawdzić jaki był ostatni czas zapisu. Jeśli był wiekszy niż np 10 minut, to znaczy, że wcześniejszy skrypt się wysypał i obecny może kontynuować aktualizację.
Kod
if(file_exists('.updating.lock'))
{
  $time = (int)file_get_contents('.updating.lock');
  if(($time + (60 * 10)) > time()) // poprzedni skrypt działa więc wychodzimy
    exit();
}


Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.10.2025 - 18:11