Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kolejka - rozważania.
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
seaquest
Zbudowałem mechanizm kolejki ale mam kilka pytań.

Co do dodawania zadań:
Zapisuje zadania w tablicy. Moje pytanie: Czy bardziej opłaca się dodawać zadania na początku tablicy i potem usuwać wykonane zadania funkcją array_shift :? Czy też może lepiej dodawać zadania na końcu tablicy i wykonywać zadania czytając tablicę od końca :?:

Kolejkę wykorzystuję wtedy, gdy jakiś moduł wymaga, aby użytkownik był zalogowany. Wtedy dodaję do kolejki zadanie, a następnie odsyłam na stronę logowania. Po zalogowaniu user zostaje automatycznie przeniesiony na właściwą stronę.

Ale moje drugie pytanie brzmi: Czy można wykorzystać kolejkę jeszcze do innych modułów, zadań :?:

I trzecie: Co, jeśli w kolejce są zadania, a użytkownik przegląda inne strony :?: (bo np. zrezygnował z oglądania strony zastrzeżonej dla użytkowników) Co zrobić z takimi zadaniami :?: Skasować je, przedstawić użytkownikowi, przymusowo go tam odesłać :wink: :?:

Czwarte: Gdzie przechowywać kolejkę :?: Bo ja wymyśliłem, że przechowuję ją w tablicy, a następnie zapisuję reprezentację zmiennej (funkcja serialize i unserialize) w bazie danych. Czy to jest optymalne rozwiązanie :?: Czy raczej powinienem zastosować inny zapis danych z kolejki :?:

Na koniec. Nie jestem przekonany do tego, żeby temat leżał na php Pro, ale może się tu nadaje. Przeczytałem chyba wszystko co było na temat kolejki na forum, ale nadal mam pewne wątpliwości. Wybaczcie, że tak dużo czytania :wink:
radziel
Dorzuce tutaj link do dość ciekawej klasy, do obsługi stosów / kolejek - http://phpclasses.byting.at/browse.html/pa...ckage/1277.html (by Seth snitch.gif)

Swoją drogą, mam ten sam problem winksmiley.jpg
scanner
Czy bardzeij opłaca się dawać zadania na początku?
Są dwa tyty kolejki:
1. First In First Out (stos)
2. First In Last Out
(przynajmniej o takich mnie w szkołach uczyli)
Musisz się zdecydować na jeden z nich. Ja lubię FILO.

Każdy moduł/zadanie może mieć kolejkę podzadań - i tak w kółko, aż do elementarnej operacji.
Kolejkę możesz użyć np. do zapisu templatesów, które należy wyświetlić, lub do ustalenia kolejności wyświetlania jakiś formularzy.

Jeśli użytkownik wyjdzie ze strefy strzeżonej, wciąż masz jego status jako "logged". Więc może wrócić.
Kolejkę przechowujesz w sesji, np.:
[php:1:3ce031af9c]<?php
$_SESSION['Queue'] = array ('task_name', 'task_params')
?>[/php:1:3ce031af9c]
seaquest
ja znam jeszcze LIFO(ale to to samo co FILO) i osobiście taki model zastosowałem.

FIFO moim zdaniem nie ma sensu bo:

- user wchodzi na module (zastrzezony dla zarejestrowanych) -> do kolejki dodaje sie (module)
- user jest na stronie logowania, ale musi sie zarejestrowac -> do kolejki dodaje sie login

user sie rejestruje, a FIFO mu zwraca module, a dopiero potem login (znowu - marnowanie czasu i procesora)

FILO == LIFO tak wiec nie ma roznicy

I teraz nie jestem pewien co do skryptu Seth'a. Widze, że w tytule jest FIFO, ale tak jak pokazalem, to chyba nikt by nie chcial.
lolo
@scanner: pomyliles troche oba pojecia.

Otoz stos to struktura danych ze strategia LIFO (albo FILO). Logiczne, przeciez odkladamy elementy na gore stosu i mozemy zawsze wziasc z niego tylko ten, ktory jest na gorze, czyli ten, ktory dolaczylismy jako OSTATNI.

Natomiast kolejka ma strategie FIFO.

W razie watpliwosci odsylam do Cormena, rozdzial 11.

Pozdrawiam
hawk
lolo:
Kolejka może mieć strategię (dyscyplinę obsługi) FIFO/FCFS, LIFO/LCFS i różne inne, im więcej skrótów tym lepiej :wink: .
W razie wątpliwości odsyłam na Politechnikę Gdańską.
Mam nadzieję że nie przeszkodziłem w dyskusji laugh.gif .
lolo
Masz racje, zapomnialem. Przeciez po to sie mowi kolejka FIFO itd. smile.gif Ale chodzilo glownie o to ze FIFO to nie stos.
seaquest
No dobrze panowie, ale postarajmy się jednak odpowiedzieć na pytania.

I jeszcze jedno, czy zastosowanie kolejki typu FIFO ma wogule sens.
A co do przykładów użycia, to prosiłbym jakieś konkrety.
lolo
Ja tez duzo sie tutaj naczytalem o kolejkach FIFO i myslalaem nad tym, zeby je jakos zastosowac, ale od razu doszedlem do wniosku, ze to, co mi jest potrzebne to stos. Wiec jezeli nie widzisz jak na razie zastosowan FIFO (tak jak ja smile.gif), to nie ma sensu sie nad tym glowic.
Jak kiedys sie z czyms takim spotkasz, gdzie to bedzie ci potrzebne to sobie przypomnisz o FIFO.

A teraz jeszcze moje pytanie, jak cos rozwiazales.

Otoz jezeli mamy jakiegos niezalogowanego uzytkownika, ktory sobie klika na jakis dzial, ktory jest tylko dla zalogowanych. To odkladamy na stoswyswietlenie tego dzialu, potem odkladamy sprawdzenie czy user moze tam wejsc. Okazuje sie ze nie moze, wiec odkladamy an stos wyswietlenie logowania. Logowanie sie wyswietla, user sie loguje poprawnie, i wtedy ze stosu bierzemy ostatnia akcje, czyli ten dzial, na ktory kliknal najpierw.
Teraz problem, bo musimy w miedzyczasie stos gdzies przechowac? Czy sledzicie tez niezalogowanych uzytkonwikow, nadajac im SIDy? No bo dla mnie to jest jedyne rozwiazanie, ze tworze dla nich sesje i tam to odkladam (albo w bazie, nie ma znaczenie, sesje i tak potrzebna), bo inaczej to mi sie goscie pomieszaja. Jak to rozwiazujecie?

Dzieki za odp.
seaquest
No ja każdemu użytkownikowi zakładam sesję niezależnie od tego czy jest zarejestrowany, czy nie. Następnie do sesji przypisuję zmienne. Sesję przechowuję w bazie i uzyskuję do niej dostęp za pomocą odpowiedniej klasy.
Seth
Cytat
Otoz jezeli mamy jakiegos niezalogowanego uzytkownika, ktory sobie klika na jakis dzial, ktory jest tylko dla zalogowanych. To odkladamy na stoswyswietlenie tego dzialu, potem odkladamy sprawdzenie czy user moze tam wejsc. Okazuje sie ze nie moze, wiec odkladamy an stos wyswietlenie logowania. Logowanie sie wyswietla, user sie loguje poprawnie, i wtedy ze stosu bierzemy ostatnia akcje, czyli ten dzial, na ktory kliknal najpierw.
Teraz problem, bo musimy w miedzyczasie stos gdzies przechowac? Czy sledzicie tez niezalogowanych uzytkonwikow, nadajac im SIDy? No bo dla mnie to jest jedyne rozwiazanie, ze tworze dla nich sesje i tam to odkladam (albo w bazie, nie ma znaczenie, sesje i tak potrzebna), bo inaczej to mi sie goscie pomieszaja. Jak to rozwiazujecie?

Heh mielismy ten sam problem z DeyVem i powiem tak: jest to jedno wielkie blocko z ktorego wyjscie nie jest warte wysilku.
Najlepiej kolejki stosowac do wypelnianych formularzy (na Pro jest o tym temat) w pozostalych zastsowoaniach jest duzo pracy przy takiej kolejce, a i tak moga sie pojawic bledy i pewne trudnosci.
lolo
Hmm... no nie brzmi to optymistycznie. Ale wlasnie tak cholera juz myslalaem, jak rozwazalem sledzenie gosci, co troche glupio mi wygladalo.
Czyli jezeli radzisz, zeby robic takie rzeczy, jak napsialem na gorze np. podajac parametry typu 'redirect' abo cos takiego?
A mozesz pzyblizyc mi na jakie problemy natrafiles albo wskazac na jakis post, w ktorym to dyskutowaliscie? Bo dalej kolejka/stos jest dla mnie bardzo dobrym rozwiazaniem tego problemu.
Ech, Tim Berners-Lee mogl o tym pomyslec.... laugh.gif
seaquest
Seth, no ale jak wykorzystujesz kolejkę FIFO, do której napisałeś skrypt. Bardzo mnie to ciekawi...
Seth
@lolo: Redirect bylby dobrym rozwiazaniem.

Najwieksze problemy jakie byly to takie, ze uzytkownik moze wyskoczyc z przewidzianej kolejki w dowolnym czasie tzn: nie bedzie sie np chcial zalogowac.
Nastepna kwestja to "oszukiwanie" usera. Nasza kolejka dzialala w ten spsob, ze nie bylo redirecta gdy trzeba bylo wyswietlic logowanie - w kolejce umieszczane bylo, ze uztytkownik po zalogowaniu przejdzie do strony, ktora moze zobaczyc po zalogowaniu - tylko odrazu zamiast danej strony byla wyswietlana formatka logowania.
Poza tm unas do kolejki byly wkladane jeszcze moduly i ich wyniki co z kollei jeszce bardziej komplikowalo cala kolejke.

Ale hmmm jak tak sobie teraz mysle to gdyby zrobic taka kolejke lecz bez wrzucania tam jak unas modulow, a tylko same nazwy kolejnych stron, ktore sa potrzebne do wyswietlenia wlasciwej to nie bylo by to az takie straszne jak wczesniej pisalem smile.gif

@seaquest:
Tutaj jest troche o wykorzystaniu kolejek:
http://php.pl/viewtopic.php?t=5722
http://php.pl/viewtopic.php?t=965
lolo
Tez tak sadze. Doszedlem do wniosku, ze najlepiej to samemu sie do tego przekonac, ze to nie jest dobre rozwiazanie, bo a noz jednak mi bedzie odpowiadalo... tongue.gif
squid
Cytat
1. First In First Out (stos)
2. First In Last Out

chcialbym zauwazyc ze tu jest na odwrot (dawno do szkoly chyba chodziles;)) Stost to jest First In Last Out (jak stos ksiazek pierwsza odlozona jest ostatnia zdjeta;)), natomiast tpowa kolejka jest First in First Out.

co do innego zastosowania kolejek to kiedys sobie wymyslilem zeby zrobic awaryjny zbior danch ktory automatycznie przejmowal by ciezar zapisu i odczytu danych od bazy danych w wypadku jej awarii. Oczywiscie awaryjny zbior danych oparty bylby na plikach tekstowych a z nimi sa problemy odnosnie wielodostepowosci zapisuno i wpadlem na pomysl zeby odladac na stos lub kolejke wiecej niz jedno zadanie zapisu do pliku, oczywiscie user ni odczowa tutaj nic poniewaz pozostali zapisuja dane do plikow tymczasowych ktore to wlasnie mam w kolejce. Nie wiem czy jasno sie wyrazam ale chodzi tu o system kolejkowania dostepu do plikow.

___
[scanner] Złączono 2 posty.
Bora
Czy jest sens budowania wielkich stosów do logowani??
Ja uważam że nie bo i tak korzystamy tylko z ostatnich elementów, czyli
Kod
wejscie na zabronioną strone -#(dodanie strony na stos)#-> login -#(jeśli sie zalogował)#-> ostatnia strona z stosu.

Zawsze przekierowywujemy tylko na ostatnią strone gdyż to własnie ona skłoniła do zalogowania się. Czy w związku z tym nie lepiej zastosowac nadpisywanie sie danych i ograniczyć sie n do 3 elementów?questionmark.gif.
Dziwi mnie wiekość stosu zastosowanego przez Seth'a , klasa jest ja zwylke pięknie napisana ale czy aż taki nadmiar danych jest potrzebny??
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.