Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%)
|
Mam następujący problem. Mam skrypt, który pobiera z bazy rekordy (około 50) i wyświetla je wiersz pod wierszem. Po lewej stronie jest link - po jego naciśnięciu strona się przeładowuje i jest formularz edycji. Jak damy zapisz, dane się aktualizują w bazie i jesteśmy przekierowywani na stronę główną (pobierane jest znowu 50 rekordów i wyświetlane wiersz pod wierszem). Muszę zrobić bez przeładowywania (żeby nie pobierać za każdym razem 50 rekordów). Do głowy wpadło mi takie rozwiązanie:
Pobierać z bazy do tablicy dane tylko jeden raz (przy pierwszym ładowaniu strony). A przy edycji wybranego wiersza, update do bazy i edytowanych danych w tablicy a następnie powrót na stronę główną i wyświetlanie danych już z tablicy (bez ponownego pobierania z bazy). Problem w tym, że nie wiem jak najlepiej taką tablicę przechowywać, żeby jej nie stracić przy przejściu na inną stronę? Umieścić w sesji danego użytkownika? Inny problem to jeszcze będę musiał sprawdzić czy inny użytkownik czegoś nie edytował a jeśli tak to pobranie tych nowych (zmienionych) danych z bazy.. Czy to dobry pomysł? Ten post edytował J4r0d 27.07.2006, 12:46:17 |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
1. Możesz trzymać dane zserializowane np w sesji (nikoniecznie jest to jednak bezpieczne)
2. Jełśi chodzi o ewentualne zmiany w bazie, to utwórz sobie na dysku plik o unikalnej nazwie. Pamietaj go w sesji użytkownika. Za każdym razem, gdy ktoś coś zmieni w bazie - niech jednocześnie zmienia nazwe pliku. Ty z kolei sprawdzaj, czy nazwa pliku w sesji uzytkownika jest taka sama jak tego na dysku. Jeśli nie, to pobieraj dane. Może być? Pozdrawiam |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 1 165 Pomógł: 9 Dołączył: 9.04.2002 Skąd: Toruń Ostrzeżenie: (0%)
|
Moim zdaniem zapytanie na 50 rekordach jeśli serwer jest dobry, baza jest zindeksowana to wogóle nie jest odczuwalne. Za dużo zachodu z kombinowaniem Cysiaczek :-)
Pozdrawiam, Łukasz |
|
|
|
Post
#4
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Ja ostatnio jakis monotematyczne jestem, ale do tego dobrze nadaje sie cache (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Zapisujesz tablice do cache'u raz a potem pobierasz juz tylko z cache a nie z bazy. Przy jakiejkolwiek modyfikacji tabeli czyscisz cache, wymuszajac w ten sposob odswierzenie danych. proszę poprawić tytuł o znacznik zgodnie z zasadami forum Przedszkole: Temat: Tematyka i zasady panujace na forum Przedszkole |
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%)
|
1. Możesz trzymać dane zserializowane np w sesji (nikoniecznie jest to jednak bezpieczne) Mógłbyś podpowiedzieć jak wykonać taką serializację? Weźmy pod uwagę że jeden wiersz może zawierać do 500 znaków tekstowych. Czy to nie obciążą? 2. Jełśi chodzi o ewentualne zmiany w bazie, to utwórz sobie na dysku plik o unikalnej nazwie. Pamietaj go w sesji użytkownika. Za każdym razem, gdy ktoś coś zmieni w bazie - niech jednocześnie zmienia nazwe pliku. Ty z kolei sprawdzaj, czy nazwa pliku w sesji uzytkownika jest taka sama jak tego na dysku. Jeśli nie, to pobieraj dane. Czy nie lepiej dodać do bazy pole update które będzie przyjmowało wartość true dla wiersza edytowanego i false dla wiersza, którego nie zmieniano? Pozatym edycja będzie odbywać się przez kilku użytkowników.. I chciałbym, żeby pobierane były z bazy tylko rekordy zmienione a reszta (tych nie edytowanych) wczytywana z pamięci. Czy to ma sens? Czy algorytm nie będzie na tyle skomplikowany, że bardziej będzie się opłacało wczytywać wszystko za każdym razem? Za każdym razem, gdy ktoś coś zmieni w bazie - niech jednocześnie zmienia nazwe pliku. Ty z kolei sprawdzaj, czy nazwa pliku w sesji uzytkownika jest taka sama jak tego na dysku. Jeśli nie, to pobieraj dane. Nie sprawdzisz czy nazwa pliku jest taka sama. Co najwyżej czy plik istnieje. Ja ostatnio jakis monotematyczne jestem, ale do tego dobrze nadaje sie cache (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Zapisujesz tablice do cache'u raz a potem pobierasz juz tylko z cache a nie z bazy. Przy jakiejkolwiek modyfikacji tabeli czyscisz cache, wymuszajac w ten sposob odswierzenie danych. proszę poprawić tytuł o znacznik zgodnie z zasadami forum Przedszkole: Temat: Tematyka i zasady panujace na forum Przedszkole Czy trudno jest wykonać cachowanie danych? (zależy mi na nieobiektowości, ponieważ projekt jest pisany strukturalnie i nie chcę mieszać. Pozatym też nie do końca mi o to chodzi. Chciałbym pobierać z bazy tylko te rekordy, które się zmieniły. A resztę z "cachea".. |
|
|
|
Post
#6
|
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
1. W manualu sa funkcje serialize() i unserialize() - poczytaj - zastanów się jak najlepiej zorganizowac te dane i je zserializuj. Oczywiście @nospor pisał o użyciu jakiejś klasy cashe. To jest najlepsze rozwiaznie.
2 i 3. Nie ważne ilu użytkowników updatuje dane. Chodzi o to tylko, aby zasygmalizować, że taki update wogóle miał miejsce. Tak masz rację - sprawdzasz, czy plik istnieje (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) |
|
|
|
Post
#7
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Cytat Czy trudno jest wykonać cachowanie danych? (zależy mi na nieobiektowości, ponieważ projekt jest pisany strukturalnie i nie chcę mieszać. nie. w najprostrzym razie zapisujesz tablice do pliku i juz masz cache (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Mozesz uzywac gotowych klas, ktore includujesz do swego skryptu i tez nie ma problemu. Cytat Pozatym też nie do końca mi o to chodzi. Chciałbym pobierać z bazy tylko te rekordy, które się zmieniły. A resztę z "cachea".. Kombinujesz teraz. jak czesto bedziesz modyfikowal dane? Wplynie to az tak na wydajnosc? A tak masz latwosc obslugi bez kombinowania.Ale jesli sie uprzesz to mozesz zmodyfikowac rekord, pobrac dane z cache, wstawic zmiany (zmiany znasz bo przeciez modyfikowales) i wstawic spowrotem do cache |
|
|
|
Post
#8
|
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%)
|
Ale jesli sie uprzesz to mozesz zmodyfikowac rekord, pobrac dane z cache, wstawic zmiany (zmiany znasz bo przeciez modyfikowales) i wstawic spowrotem do cache W sumie masz rację. Ale czy to nie bedzię dłużej trwało niż pobranie 50 rekordów naraz, obróbka w pętli i wyświetlenie? Teraz przy przeładowywaniu stronu można doliczyć się 3 sekund :/ |
|
|
|
Post
#9
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Cytat W sumie masz rację. Ale czy to nie bedzię dłużej trwało niż pobranie 50
Nie, mysle ze to nie bedzie dlugo trwalo (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Cytat Teraz przy przeładowywaniu stronu można doliczyć się 3 sekund :/ Nie sadze by pobranie 50 rekordow trwalo 3 sek. Problem moze masz na laczu, inne dane moze ci opoźniają, a moze masz zapytanie nieefektywne
|
|
|
|
Post
#10
|
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%)
|
Nie sadze by pobranie 50 rekordow trwalo 3 sek. Problem moze masz na laczu, inne dane moze ci opoźniają, a moze masz zapytanie nieefektywne Sprawdzałem na localhost. Całość będzie chodzić po lanie. Wklejam poniżej kod. Wiem, że początek mogę zoptymalizować (konkretnie pobranie date i sprawdzanie. Mogę zastąpić sprawdznie tablic POST i GET jedną). Całość prezentuje się tak: Skrypt |
|
|
|
Post
#11
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
"podoba" mi sie ten kawalek. jest bardzo "optymalny"
robisz zapytania w petli dla innego zapytania, na dodatek wszystkie te zapytania operują na tej samej tabeli. Nie mozna tego uproscic? Bo taka konstrukcja nie sluzy zbytnio czasowi |
|
|
|
Post
#12
|
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%)
|
"podoba" mi sie ten kawalek. jest bardzo "optymalny"
robisz zapytania w petli dla innego zapytania, na dodatek wszystkie te zapytania operują na tej samej tabeli. Nie mozna tego uproscic? Bo taka konstrukcja nie sluzy zbytnio czasowi Właśnie nie mogę. Powodem jest "genialność" aplikacji pisanych przez comarch.. Nie mogę wyciągnąć godziny przylotu bez pętli.. |
|
|
|
Post
#13
|
|
|
Grupa: Zarejestrowani Postów: 472 Pomógł: 7 Dołączył: 7.12.2005 Skąd: Gliwice Ostrzeżenie: (0%)
|
A zwyczajnie JSem?
W Twoim przypadku będzie -2 chyba. Tylko, że wtedy zmieniona wartość wyświetlona zostanie ze starą wartością (wyświetloną, bo z bazie będzie już update). Ten post edytował cadavre 27.07.2006, 23:46:00 |
|
|
|
Post
#14
|
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%)
|
A zwyczajnie JSem? W Twoim przypadku będzie -2 chyba. Tylko, że wtedy zmieniona wartość wyświetlona zostanie ze starą wartością (wyświetloną, bo z bazie będzie już update). Ale co to da? Bo nie łapie o co Ci chodzi.. I jeszcze pytanie z innej beczki. Skoro sprawdzanie czy ktoś coś edytował w bazie ma się sprowadzać do sprawdzenia czy istnieje plik, to czy trzeba się jakoś zabezpieczyć? Chodzi mi o sytuacje, że dwóch pracowników edytuje ten sam rekord (albo inny) i jednocześnie przesyłają nowe dane do zapisu. Skrypt aktualizuje dane w bazie, kasuje plik z cachem i następuje powrót na stronę główną. Na stronie głównej sprawdzane jest czy plik istnieje (ponieważ już nie istnieje) następuje odczyt z bazy nowych danych i zapis do chache. Możemy zablokować na czas zapisu plik ale gdzieś czytałem, że tego typu operacje nie są bezpieczne. Jak się zabezpieczyć przed sytuacją, gdy dwóch użytkownik w tym samym czasie zapisuje chache do pliku, albo gdy jeden edytował rekord i usuwa cache a drugi właśnie chce zapisać chace..? Mam nadzieje, że nie zamotałem.. Ten post edytował J4r0d 28.07.2006, 07:23:58 |
|
|
|
Post
#15
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Cytat Chodzi mi o sytuacje, że dwóch pracowników edytuje ten sam rekord (albo inny) i jednocześnie przesyłają nowe dane do zapisu. Skrypt aktualizuje dane w bazie, kasuje plik z cachem i następuje powrót na stronę główną. Na stronie głównej sprawdzane jest czy plik istnieje (ponieważ już nie istnieje) następuje odczyt z bazy nowych danych i zapis do chache. Możemy zablokować na czas zapisu plik ale gdzieś czytałem, że tego typu operacje nie są bezpieczne. Jak się zabezpieczyć przed sytuacją, gdy dwóch użytkownik w tym samym czasie zapisuje chache do pliku, albo gdy jeden edytował rekord i usuwa cache a drugi właśnie chce zapisać chace..? Opisana przez Ciebie sytuacja jest troche "nieteges"* (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Edytujesz rekord, czyscisz cache. Na stronie glownej ktos go odswierza i cache juz jest. W tym samym czasie ktos edytuje rekord, czysci dopiero co odswierzony cache (i bardzo dobrze) i na stronie glownej ktos go znowu odswierzy. Wszystko ok. A jesli chodzi ci o trafienie zapisu do pliku w tym samym czasie... hmmm, a w totka trafiles kiedys szostke? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ps: przenosze na php --------------------- nieteges* - to znaczy, ze jest nieteges |
|
|
|
Post
#16
|
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%)
|
Opisana przez Ciebie sytuacja jest troche "nieteges"* (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Edytujesz rekord, czyscisz cache. Na stronie glownej ktos go odswierza i cache juz jest. W tym samym czasie ktos edytuje rekord, czysci dopiero co odswierzony cache (i bardzo dobrze) i na stronie glownej ktos go znowu odswierzy. Wszystko ok. Taka sytuacja jest bardzo możliwa. Przykład: Na stronie masz np. 10 rekordów. Ty edytujesz pierwszy a ja drugi. Dajesz zapisz, skrypt kasuje plik z chacem i tworzy na nowo, zapisujeąc nowego cachea. Dosłownie w tej samej chwili robię to ja. Po sprawdzeniu czy plik istnieje, po moim updajcie próbuje kasować plik, który Ty już skasowałeś. Wystąpi błąd. Czyli mamy cache bez aktualizacji jednego wiersza. Inna przykład. Bez kasowania pliku z cachem. W tym samym momencie próbujemy zapisać cache do pliku. Tylko jedna osoba może to w danym momencie zrobić.. A jesli chodzi ci o trafienie zapisu do pliku w tym samym czasie... hmmm, a w totka trafiles kiedys szostke? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Zdziwiłbyś się (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) |
|
|
|
Post
#17
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Cytat Ty edytujesz pierwszy a ja drugi. Dajesz zapisz, skrypt kasuje plik z chacem i tworzy na nowo, zapisujeąc nowego cachea. Dosłownie w tej samej chwili robię to ja. Po sprawdzeniu czy plik istnieje, po moim updajcie próbuje kasować plik, który Ty już skasowałeś. Wystąpi błąd. Czyli mamy cache bez aktualizacji jednego wiersza. Jaki blad? Wywali noticem tudziez Warningiem ze nie ma pliku. Co to ma do blednego dzialania aplikacji? Chciales skasowac plik, ktorego nie ma, w rezultacie pliku nadal nie bedzie. i oto chodzi. Gdzie tu blad?Cytat W tym samym momencie próbujemy zapisać cache do pliku. Tylko jedna osoba może to w danym momencie zrobić.. System plikow jakos se z tym poradzi. Pozatym naprawde zycze szcześcia zeby sie wstrzelic w taką sytuacje (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
|
|
|
|
Post
#18
|
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%)
|
Czy przy zapisie do pliku należy blokować do niego dostęp?
|
|
|
|
![]() ![]() |
|
Aktualny czas: 20.12.2025 - 21:45 |