Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]blokowanie wielokrotnego wykonywania skryptu
Forum PHP.pl > Forum > PHP
sazian
Witam,
mam pewien skrypt który wykonuje się dosyć długo - nawet kilkanaście minut. Dlatego chciałem dodać zabezpieczenie przed wielokrotnym uruchamianiem skryptu żeby nie zabić serwera.
Napisałem coś w tym stylu(pisane z palca, więc mogą być literówki)
  1. $blokada=mysql_fetch_object(mysql_query('SELECT blokada FROM parametry '))->blokada;
  2. if($blokada+1800<time())
  3. {
  4. mysql_query('UPDATE parametry SET `blokada`='.time());
  5. sleep(20);
  6. echo '[OK]';
  7. mysql_query('UPDATE parametry SET `blokada`=0 ');
  8. }
  9. else
  10. {
  11. echo '[blokada]';
  12. }



generalnie kod działa jeśli go uruchomię przez konsole, czyli php plik.php. Problem pojawia się przy uruchamianiu przez przeglądarkę. Wtedy wygląda to tak
1)uruchamiam pierwszy skrypt
2)uruchamiam drugi skrypt ale nie dostaję komunikatu [blokada] tylko strona cały czas się wczytuje
3)kończy się wykonywanie pierwszego skryptu
4)wykonuje się skrypt drugi

czy ktoś może wie dlaczego skrypt zachowuje się tak dziwnie przy żądaniach przeglądarkowych ?
Damonsson
Odpalanie tego z przeglądarki to bardzo zły pomysł. Stwórz sobie jakiś observer w cronie co minutę, który będzie czekał na znak np. z przeglądarki i wykona wtedy skrypt. Zabezpieczenie ustawiłbym bazując na getmypid, będziesz miał to w czasie rzeczywistym zamiast Twojego szacowania $blokada+1800<time()
sazian
Dzięki za podrzucenie pomysłu, ale abstrahując od od samej metody blokowania problem jest w tym że skrypt jest wykonywany cronem ale muszę mieć również możliwość uruchomienia go przez przeglądarkę.
Skrypt generuje pewne pliki, czasami są to duże pliki i wtedy trwa to długo ale czasami jest to dużo małych plików. W drugim przypadku pracownicy muszą mieć możliwość generowania ręcznego dlatego że cronem za długo by to trwało.
KsaR
  1. // u mnie to dziala >
  2. ini_set('max_execution_time',86400); # dzień
  3. set_time_limit(0); # -- bez limitu
  4. // gdyby jednak nie dzialalo, jak np. POST wyslany czy cos, to lepiej w echo cos za tym zwrocic. Nawet pusty znak. (Mi w takim wypadku przegladarka anulowala gdy nic nie zwrocilo z minute po wyslaniu POST-a).
  5.  
  6. // baza na plikach biggrin.gif
  7. if (@file_get_contents('./blokada.txt')+1800<time())
  8. {
  9. file_put_contents('./blokada.txt',time());
  10. sleep(20);
  11. echo '[OK]';
  12. file_put_contents('./blokada.txt',0);
  13. }
  14. else
  15. {
  16. echo '[blokada]';
  17. }
sazian
Cytat(KsaR @ 22.09.2015, 14:00:43 ) *
// u mnie to dziala >

nie myślałeś o robieniu kariery jako administrator smile.gif
swoją drogą ciekawa przypadłość że sql'em nie działaa z plikami tak wink.gif
KsaR
Cytat(sazian @ 22.09.2015, 18:54:05 ) *
nie myślałeś o robieniu kariery jako administrator smile.gif
swoją drogą ciekawa przypadłość że sql'em nie działaa z plikami tak wink.gif

Haha tongue.gif
--
Ano ciekawe biggrin.gif, bo te pierwsze 2 linijki (2-3) zmieniaja max. czas wykonania skryptu.

A ta baze na plikach tak z nudow dziabłem, bo dziwnie tak wszystko w mysql ladowac - zwlaszcza gdy bedzie zawsze 1 tabela z 1 rekordem(a co dopiero z 1 kolumna) tongue.gif
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.