Autor | Zpráva | ||
---|---|---|---|
Jakub Žáček Profil * |
#1 · Zasláno: 4. 4. 2009, 17:32:16
Dobrý den,
mám script kde se potřebuji vyhnout kolizím při více požadavcích, dalo by se nějak tomuto scriptu "vnutit" při zpracovávání předchozího požadavku počkání třeba 2s? Dalo by se to určitě při spuštění scriptu uložit do db a po dokončení opět uvolnit, ale jde mi o to jak to pozdržet po delší dobu. Nechtěl bych to dělat cykly vracejícími se samy na sebe, připadá mi to příliš náročné pro CPU. Vrátit externí aplikaci hlášku že to má zkusit později je v mém případě také neelegantní. Děkuji za případné rady. |
||
TomášK Profil |
#2 · Zasláno: 4. 4. 2009, 18:21:52
Existuje systémový příkaz sleep, možná jde i nějak nacpat do php. Ale dělat to tímhle způsobem mi přijde jako děsná prasárna :) Kde se potřebuješ vyhnout kolizím? Nepomohly by ti transakce v databázi?
|
||
Jan Tvrdík Profil |
#3 · Zasláno: 4. 4. 2009, 18:44:54 · Upravil/a: Jan Tvrdík
|
||
ninja Profil |
#4 · Zasláno: 4. 4. 2009, 23:11:55
Kolik predpokladate uzivatelu skriptu? Protoze jestli vice jak 3 najednou, vetsinu doby bou cekat.
Misto sleep bych radeji volol stale se obnovujici stranku, pripadne lepe to delat opakovanym pokus pres ajax a uzivateli o tom dat informacu, ze se pozadavek zpracovava, respektive je zarazen do fronty... |
||
Jakub Žáček Profil * |
#5 · Zasláno: 4. 4. 2009, 23:18:16
Děkuji, toto mi asi vyhovuje, ale ještě bych se chtěl ujistit jestli to bude dělat přesně to co chci. Podlě mě by to mělo dělat následující:
ke scriptu se přihlásí uživatel, já zjistím že je db prázdná, proto dám zpracovat cyklus který potřebuji, ale při přihlášení druhého usera zjistím že se script právě využívá, proto dám hned na začátku scriptu sleep na dostatečnou dobu. Po provedení scriptu pro prvního uživatele zjistím že je ve frontě už další uživatel a proto dám unsleep, což by mělo povolit přístup druhého uživatele k dalšímu zpracování. Mohlo by to takto fungovat? :)) Děkuji. |
||
Alphard Profil |
#6 · Zasláno: 4. 4. 2009, 23:23:17
nemohlo, funkci unsleep() neznám :-) je to usleep() a na rozdíl od sleep() bere parametr v mikrosekundách
každá z těchto funkcí pozastaví výkon scriptu na pevný, předem daný časový úsek |
||
Jakub Žáček Profil * |
#7 · Zasláno: 4. 4. 2009, 23:27:42
Dobře, takže to mohu použít bez problému tak jak potřebuji, jen musím dobře odhadnout dobu zpracování scriptu pro prvního usera aby to nebylo moc málo ani moc dlouho, ale jinak dosáhnu požadovaného efektu? :)
|
||
Alphard Profil |
#8 · Zasláno: 4. 4. 2009, 23:30:30
a ještě kontrola, jestli mezi tím nepřišel někdo třetí
ale bylo by lepší, kdybyste napsal, co vlastně chcete, databáze obsahují např. zamykání tabulek apod., třeba by to šlo řešit lépe |
||
ninja Profil |
#9 · Zasláno: 4. 4. 2009, 23:56:37
Jakub Žáček: dulezite je jak dlouho musi skript cekat, tedy jak dlouho zhruba predpokladate jeho vykonavani (praci s DB). Jestli je to v radu milisekund nebo nekolika malo sekund, je sleep pouzitelny. Pri delsi casove narocnosti ale server vrati timeout a uzivatel bude mit pocit, ze stranka nefunguje. Pak je lepsi zobrazit stranku "pockejte prosim" a nastavit meta refresh na nejakou relevantni hodnotu. Nebo nejlepe ten ajax.
|
||
Jakub Žáček Profil * |
#10 · Zasláno: 5. 4. 2009, 00:18:47
ninja: ta doba zpracování je předpokládám pro mé účely v ms...
Alphard: Pokud bych pracoval s údaji z DB, asi by to šlo řešit elegantněji, ale já zpracovávám souborová data na hostingu. Převádím, mažu, přejmenovávám soubory a podobně, a na to podle mě lepší řešení není. |
||
Alphard Profil |
#11 · Zasláno: 5. 4. 2009, 00:39:54
|
||
Jakub Žáček Profil * |
#12 · Zasláno: 5. 4. 2009, 01:14:15
Děkuji za link, ten jsem si prostudoval a snazší mi připadá mé primitivnější řešení, i když ne tak čisté. :)
|
||
Jan Tvrdík Profil |
#13 · Zasláno: 5. 4. 2009, 09:37:21
Alphard:
Článek je zastaralý, aktuální verze je v dokumentaci Nette – Nette\IO\SafeStream. |
||
Časová prodleva: 15 let
|
0