Zadejte hledaný výraz...
Jakub Glos
Webtrh.cz
Vývoj webových stránek na WordPressu a proklientský přístup pro freelancery
Třídenní infromacemi nabitý prezenční + online kurz v Praze od Webtrhu pouze za 2 871 Kč
Více informací

Jak zajistit, aby v daný okamžik pracoval daný skript pouze jednou?

petrx
verified
rating uzivatele
(8 hodnocení)
19. 12. 2012 14:11:59
Potřebuji zajistit, aby se mi nepopraly jednotlivé instance malého skriptu při přístupu k databázi.
Na rozdíl od svého vývojáře neprogramuji v PHP, ale našel jsem si v dokumentaci funkci flock():
http://php.net/manual/en/function.flock.php
Chtěl bych se zeptat, zda by mělo smysl napsat v PHP napsali následující, resp. jestli jsem na něco nezapomněl:
$fp = fopen("/tmp/lock.txt", "r+");
while (!(flock($fp, LOCK_EX))):
sleep (1);
endwhile;
(následuje zbytek skriptu)
(soubor asi nezavírat, během činnosti skriptu musí zůstat otevřený a po skončení skriptu se AFAIK zavře sám)
19. 12. 2012 14:11:59
https://webtrh.cz/diskuse/jak-zajistit-aby-v-dany-okamzik-pracoval-dany-skript-pouze-jednou/#reply843997
http://webtrh.cz/193929-zajistit-php-nedalo-spustit-sebe
nakonec jsem to vyresil databazi -
na zacatku updatnu tabulku a reknu ji ze script bezi a zaroven ulozim aktualni time().
a predtim kontroluju jestli script bez podle databaze i a jestli nebezi vetsi cas nez x (u mě 10 minut). pokud bezi vic tak ho stejne spustim a nezajima me jestli bezi nebo nebezi podle databaze protoze je pravdepodobny ze pri minulem spusteni spadl nekde pred koncem (prumerne mi script bezi cca 3 minuty, obcas az 6) a neupdatnul databazi
19. 12. 2012 14:20:10
https://webtrh.cz/diskuse/jak-zajistit-aby-v-dany-okamzik-pracoval-dany-skript-pouze-jednou/#reply843996
Jan Stejskal
verified
rating uzivatele
(7 hodnocení)
19. 12. 2012 15:03:10
Napsal Re4DeR;884361
na zacatku updatnu tabulku a reknu ji ze script bezi a zaroven ulozim aktualni time().
Toto řešení nezabrání spuštění další instance skriptu, čas mezi spuštěním první instance a insertem umožňuje spuštění dalších instancí. Je třeba myslet na atomicitu operací.
19. 12. 2012 15:03:10
https://webtrh.cz/diskuse/jak-zajistit-aby-v-dany-okamzik-pracoval-dany-skript-pouze-jednou/#reply843995
ne to nezabrani, ale umi zabranit aby script neco provedl
19. 12. 2012 15:29:40
https://webtrh.cz/diskuse/jak-zajistit-aby-v-dany-okamzik-pracoval-dany-skript-pouze-jednou/#reply843994
Co přesně děláte v databázi? Možná by bylo lepší řešit zamykání až tam.
19. 12. 2012 15:40:42
https://webtrh.cz/diskuse/jak-zajistit-aby-v-dany-okamzik-pracoval-dany-skript-pouze-jednou/#reply843993
node
verified
rating uzivatele
(5 hodnocení)
19. 12. 2012 15:54:06
static ?
19. 12. 2012 15:54:06
https://webtrh.cz/diskuse/jak-zajistit-aby-v-dany-okamzik-pracoval-dany-skript-pouze-jednou/#reply843992
petrx
verified
rating uzivatele
(8 hodnocení)
20. 12. 2012 10:51:08
Napsal Martin Schlemmer;884400
Co přesně děláte v databázi? Možná by bylo lepší řešit zamykání až tam.
Nemá cenu dělat to v databázi, když to lze udělat přes zamknutí souboru. Zamykání souborů v Linuxu je úspěšně implementováno 20 let, na windowsím serveru také, na *BSD ještě déle
20. 12. 2012 10:51:08
https://webtrh.cz/diskuse/jak-zajistit-aby-v-dany-okamzik-pracoval-dany-skript-pouze-jednou/#reply843991
Přesto jste neodpověděl, co v databázi děláte.
V prvním příspěvku píšete, že potřebujete lock,
aby se nepopraly jednotlivé instance malého skriptu při přístupu k databázi
20. 12. 2012 11:29:34
https://webtrh.cz/diskuse/jak-zajistit-aby-v-dany-okamzik-pracoval-dany-skript-pouze-jednou/#reply843990
Jiří Adámek
verified
rating uzivatele
(20 hodnocení)
20. 12. 2012 11:44:42
Ta fce s lock souboru je samozrejme vyhodnejsi. Reseni by Re4DeR ma tu nevyhodu, ze v pripade neocekavaneho konce skriptu, at uz z jakehokoliv duvodu, zustane tabulka zamcena a nova instance skriptu se jiz nepusti. Vseobecne reseni pres db nepovazuju za nejvhodnejsi, pokud to ma resit pouze jednoinstancni spusteni skriptu.
20. 12. 2012 11:44:42
https://webtrh.cz/diskuse/jak-zajistit-aby-v-dany-okamzik-pracoval-dany-skript-pouze-jednou/#reply843989
vlnk
verified
rating uzivatele
(4 hodnocení)
20. 12. 2012 13:19:55
Pokud se nemá srazit něco v databázi, řeší se to v databázi a není efektivní starat se v php, natož zamykat soubory.
20. 12. 2012 13:19:55
https://webtrh.cz/diskuse/jak-zajistit-aby-v-dany-okamzik-pracoval-dany-skript-pouze-jednou/#reply843988
proto je tam ta kontrola podle time() a spusteni natvrdo
20. 12. 2012 13:21:56
https://webtrh.cz/diskuse/jak-zajistit-aby-v-dany-okamzik-pracoval-dany-skript-pouze-jednou/#reply843987
vlnk
verified
rating uzivatele
(4 hodnocení)
20. 12. 2012 13:30:27
Řízení zdrojů v db je nesrovnatelně efektivnější. Z php je to jako řídit lunochod.
20. 12. 2012 13:30:27
https://webtrh.cz/diskuse/jak-zajistit-aby-v-dany-okamzik-pracoval-dany-skript-pouze-jednou/#reply843986
neni resitelne v databazi poradne podle me
20. 12. 2012 13:40:18
https://webtrh.cz/diskuse/jak-zajistit-aby-v-dany-okamzik-pracoval-dany-skript-pouze-jednou/#reply843985
Kovboj
verified
rating uzivatele
(13 hodnocení)
20. 12. 2012 14:15:39
Napsal vlnk;884728
Řízení zdrojů v db je nesrovnatelně efektivnější. Z php je to jako řídit lunochod.
OT: Co je špatného na tom řídit něco jako špičkovou techniku v neskutečně nepříznivém a v podstatě neznámém prostředí? Nebo podle tebe byl lunochod snad něco jiného? ;-)
Osobně jsem kdysi musel řešit něco podobného a použil jsem v podstatě stejnou techniku jako Re4DeR. Fungovalo to bez problémů. Ale pro posouzení situace je důležité vědět jestli se bavíme o situaci kdy může výjimečně nastat situace kdy se o ten update pokusí 2-3 skripty najednou nebo jestli může nastat situace že se jich o to pokusí najednou 3000. Možná by jenom stačilo aby zajistit aby se ten skript prostě nemohl spustit sám vícekrát najednou na základě nějaké operace od návštěvníka webu ale spouštět ho jen z rozumně definovaného cronu.
20. 12. 2012 14:15:39
https://webtrh.cz/diskuse/jak-zajistit-aby-v-dany-okamzik-pracoval-dany-skript-pouze-jednou/#reply843984
vlnk
verified
rating uzivatele
(4 hodnocení)
20. 12. 2012 15:27:41
Vysvětlím:
Lunochod je špičková technologie, stejně jako databáze. Než k němu ale signál doběhne, ztratí se víc než sekunda.
Zamykací operace musí být jednokroková, cílem je rychle provést žádané a odemknout. Dohadovat se o tom přes php čato s jiným strojem jen zbytečně blokuje.
20. 12. 2012 15:27:41
https://webtrh.cz/diskuse/jak-zajistit-aby-v-dany-okamzik-pracoval-dany-skript-pouze-jednou/#reply843983
Pro odpověď se přihlašte.
Přihlásit