Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> PHP a współbieżność, czyli bardzo ciężkie problemy
Majewicz
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 8.10.2011

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


Witam, napisałem sobie pewien system i panel administracyjny w języku PHP w oparciu o sesję oraz bazę danych MySQL. Wszystko działa bardzo dobrze ale są 2 problemy związane z współbieżnością, z którymi nie mogę sobie poradzić.

1. Problem pierwszy.
Panelem administracyjnym zarządza dwóch (lub więcej) administratorów. Problem jest taki, że gdy osoba powiedzmy z miasta X się loguje loginem "abc" to inna osoba z innego miasta, powiedzmy Y, też może się zalogować w tym samym czasie na te same konto. Jak to zablokować? Mam parę pomysłów ale niestety żaden z nich nie będzie dobrze do końca działał. Jeden z pomysłów to odpowiednia wartość ustawiana w bazie danych, czyli gdy admin A loguje się do panelu to ustawiana jest mu pewna wartość 1 w bazie (czyli jest zalogowany). Gdy ktoś inny będzie się próbował zalogować na to konto to sprawdzana jest ta wartość (0 to niezalogowany, 1 to zalogowany). W momencie gdy admin A klika na "Wyloguj" to wartość w bazie przyjmuje wartość 0. To myślę by działało dobrze gdyby nie jeden fakt. W momencie gdy admin wyłączy przeglądarkę i się nie wyloguje (albo np. wywali mu korki i komputer się wyłączy) to zmienna w bazie nie powróci do wartości 0 mimo iż faktycznie ten admin nie przebywa już w PA. Skutek tego będzie taki, że nie będzie się mógł zalogować. Jak sobie poradzić z tym problemem? Szukam i szukam i nic nie wychodzi.

2. Problem drugi
Blisko spokrewniony. W panelu admina jest moduł zarządzania stylami CSS. W przypadku gdy w panelu jest zalogowany admin A i B i obaj będą chcieli edytować ten sam styl to wiadomo jak to się skończy. Gdy zmiany wprowadzi admin A a następnie potem admin B to zmiany wprowadzone przez admina A zostaną nadpisane i w ogóle ich nie będzie. Chciałbym to jakoś zrobić, żeby na czas prowadzenia pracy nad danym plikiem była zablokowana jego edycja. Też przez bazę? I znowu ten sam problem z wyłączeniem przeglądarki bądź komputerem bez wylogowania. Jak sobie poradzić z takim czymś, jakie są na to metody?

Z góry dziękuję za pomoc.

Ten post edytował Majewicz 8.10.2011, 22:19:46
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Po pierwsze to nie ma nic wspólnego z współbieżnością.

Ad. 1: Możesz sprawdzać czas ostatniej aktywności by określić czy sesja już wygasła czy nie. Poszukaj dowolnego wątku na temat "osób online".
Ad. 2: http://forum.php.pl/index.php?showtopic=185206&hl=
Go to the top of the page
+Quote Post
Majewicz
post
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 8.10.2011

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


Cytat(Crozin @ 8.10.2011, 23:27:46 ) *
Ad. 1: Możesz sprawdzać czas ostatniej aktywności by określić czy sesja już wygasła czy nie. Poszukaj dowolnego wątku na temat "osób online".
A co w przypadku gdy sesja trwa np 3 godziny a ja zamknę przeglądarkę? Np. czas ostatniej aktywności to godzina 21:15. O godzinie 21:17 nagle powiedzmy zabrakło chwilowo prądu. Następnie o godzinie 21:25 chcę się zalogować i nie mogę bo sesja trwa 3 godziny a więc muszę czekać 3 godziny na zalogowanie czyli do 0:15. Jak sobie z tym poradzić?

Cytat(Crozin @ 8.10.2011, 23:27:46 ) *

Poczytałem ale mam pytanie:
Cytat(Crozin @ 4.10.2011, 12:47:02 ) *
Nie powinieneś robić tego w ten sposób. Dodaj sobie w bazie danych kolumnę z czasem ostatniej aktualizacji. Następnie w formularzu edycji wrzuć do ukrytego pola czy tam jako zmienną sesynją tą datę - tak by była ona przesłana do skryptu odpowiedzialnego za wykonanie zapytania UPDATE. Na koniec w skrypcie modyfikującym bazę danych dodaj na początku sprawdzenie czy przesłana data jest równa tej w bazie danych. Jeśli tak, oznacza to że rekord nie został zmodyfikowany w czasie od wyświetlenia formularza do jego wsyłania. Jeżeli zaś jest inna pzekieruj użytkownika spowrotem do formularza edycji i informacją o tym, że rekord został przez kogoś zaktualizowany.
I co dalej? Gdy wprowadzę dużo zmian w różnych miejscach kodu CSS i będę chciał zapisać i wywali mi komunikat, że ktoś zrobił aktualizację w czasie mojej edycji to mam teraz szukać gdzie wprowadzałem zmiany i kopiować do zmodyfikowanego kodu? Czy jak?
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: 2.10.2025 - 16:14