Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][GD] Wyswietlenie Obrazka a problem z cache'owaniem
konradmm
post
Post #1





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 18.12.2007

Ostrzeżenie: (10%)
X----


Witam.
Pisze skrypt w .php ktory ma za zadanie stworzyc obrazek, a zarazem go zcache'owac tak by kazde kolejne uruchomienie skryptu nie wykonywalo ponownie operacji.

Wiec moze pokaze co aktualnie mam, i co sie dzieje nie tak.

  1. <?php
  2.  
  3. ini_set('display_errors',0);
  4.  
  5. date_default_timezone_set('Europe/Warsaw');
  6. header("content-type: image/png");
  7.  
  8. $cache = 'test.png';
  9. $cache_sek = '30';
  10.  
  11. $filemtime = @filemtime($cache);
  12. if (!$filemtime or (time() - $filemtime >= $cache_sek)){
  13.  
  14. //Tutaj posiadam kod ktory tworzy obrazek i go wyswietla (wycinam nieistotne szczegoly)
  15.  
  16. $image = imagecreatefrompng('./bg.png');
  17.  
  18. imagettftext($image, 180, 0, 1000, 200, $bialy, $belly, $ile);
  19. imagettftext($image, 58, 0, 1000, 80, $bialy, $impact2, "OSÓB");
  20. imagettftext($image, 58, 0, 1000, 150, $bialy, $impact2, "ONLINE");
  21.  
  22. //Wszystkie kolory/czcionki dzialaja
  23.  
  24. imagepng($image);
  25. imagepng($image,$cache);
  26. if($image)
  27. imagedestroy($image);
  28.  
  29. //Co w momencie gdy plik $cache zostal modyfikowany mniej niz $cache_sek temu
  30. }else{
  31. $im = imagecreatefrompng($cache_file);
  32. imagepng($im);
  33. imagedestroy($im);
  34. }


Problem polega na tym, że uzywam tego skryptu w grze, gdzie u KAZDEJ osoby co 60 sekund jest wykonywany ten skrypt.
Teoretycznie sa uruchamiane w tej samej milisekundzie, jednakze czasem sa male opoznienia, fakt.
Jednakze, przy 11 osobach online, skrypt jest uruchamiany 11 razy, jednak komendy w IFie sa wykonywane 3-5razy
Tak, jest postęp, niestety jak to zabezpieczyć by czesc skryptu uruchomila sie dokladnie RAZ, podczas gdy u innych zostanie jedynie wyswietlony zapisany wczesniej obrazek?

Z gory dziekuje za pomoc.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
prz3kus
post
Post #2





Grupa: Zarejestrowani
Postów: 260
Pomógł: 30
Dołączył: 22.01.2007

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


to może zamiast time:
http://php.net/manual/en/function.microtime.php
Go to the top of the page
+Quote Post
konradmm
post
Post #3





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 18.12.2007

Ostrzeżenie: (10%)
X----


Cytat(prz3kus @ 23.04.2015, 15:34:15 ) *


No tak, tylko jak filemtime'm moge zwrocic czas modyfikacji w mikrosekundach?
Ew. inny sposob na cachowanie obrazka ?

Ten post edytował konradmm 23.04.2015, 16:55:51
Go to the top of the page
+Quote Post
IProSoft
post
Post #4





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

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


Uzyj file_exists i filemtime, to wystarczy aby wykonać to czego potrzebujesz.
Filemtime porównujesz z time().
Go to the top of the page
+Quote Post
konradmm
post
Post #5





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 18.12.2007

Ostrzeżenie: (10%)
X----


Cytat(IProSoft @ 23.04.2015, 19:59:21 ) *
Uzyj file_exists i filemtime, to wystarczy aby wykonać to czego potrzebujesz.
Filemtime porównujesz z time().


Z tego co napisalem, porownuje filemtime z time()
file_exists nie ma w tym przypadku znaczenia bo ten plik istnieje ZAWSZE.

Problem nastepuje bo ten sam skrypt jest wykonywany DOKLADNIE w tym samym momencie, wiec zakladajac ze kazdy uzytkownik jest taki sam, skrypt wykona sie w tej samej milisekundzie...

Wiec tu pytanie jest do was, jak moge w inny sposob dac link do obrazka KTORY jest skryptem w GD, tak by skrypt sie wykonal DOKLADNIE raz?

P.s. niestety nie wchodzi w gre pisania oddzielnego skryptu php ktory bylby wykonywany cronem raz na minute. Musze sobie poradzic w 1 pliku.

Ten post edytował konradmm 23.04.2015, 21:39:18
Go to the top of the page
+Quote Post
prz3kus
post
Post #6





Grupa: Zarejestrowani
Postów: 260
Pomógł: 30
Dołączył: 22.01.2007

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


Możesz wrzucać flagę do bazy i użyć trans-akcyjności, choć na 99% dobrze stosując mikrotime() problem by się rozwiązał.
Go to the top of the page
+Quote Post
konradmm
post
Post #7





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 18.12.2007

Ostrzeżenie: (10%)
X----


Cytat(prz3kus @ 24.04.2015, 08:07:15 ) *
Możesz wrzucać flagę do bazy i użyć trans-akcyjności, choć na 99% dobrze stosując mikrotime() problem by się rozwiązał.


mógłbyś bardziej rozwinąć temat?
zaznaczę, że jestem noobkiem jesli chodzi o PHP (IMG:style_emoticons/default/haha.gif)
Go to the top of the page
+Quote Post
Pyton_000
post
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Możesz powiedzieć w jaki sposób "wywołujesz" skrypt xxx razy dokładnie w tej samej sekundzie?
Go to the top of the page
+Quote Post
konradmm
post
Post #9





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 18.12.2007

Ostrzeżenie: (10%)
X----


Cytat(Pyton_000 @ 25.04.2015, 13:17:00 ) *
Możesz powiedzieć w jaki sposób "wywołujesz" skrypt xxx razy dokładnie w tej samej sekundzie?


Gra, w ktorej uzywam obrazka jako banner gildii, posiada auto odswiezanie tego obrazka co minute.
W ten sposob kazdy kto jest ONLINE, wywoluje ten sam skrypt w momencie odswiezenia.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #10





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Tak, ale to nie oznacza że wszyscy odświeżają w tym samym momencie.
Poza tym co się tam takiego zmienia że musi być co minutę?

Jeśli na prawdę chcesz coś z tym zrobić to możesz zrobić kolejkę.
Dzięki czemu pierwszy request zrobi obrazek a kolejne z kolejki odczytają cache.
Go to the top of the page
+Quote Post
konradmm
post
Post #11





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 18.12.2007

Ostrzeżenie: (10%)
X----


Cytat(Pyton_000 @ 26.04.2015, 20:09:16 ) *
Tak, ale to nie oznacza że wszyscy odświeżają w tym samym momencie.
Poza tym co się tam takiego zmienia że musi być co minutę?

Jeśli na prawdę chcesz coś z tym zrobić to możesz zrobić kolejkę.
Dzięki czemu pierwszy request zrobi obrazek a kolejne z kolejki odczytają cache.


wlasciwie to jednak oznacza ;D
Jak robie zapytanie ile jest online osób na TeamSpeaku, to w tej samej sekundzie jest dajmy na to wykonywanych 100-120 requestow, co zarazem oznacza, podlaczenie sie 120 guest query do serwera i zlagowanie ;p

Co do tej kolejki...
To jest cos wbudowanego w PHP'a ?
Czy musze wykorzystac jakas klase przez kogos napisana?

Prosilbym o wiecej info (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
phpion
post
Post #12





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Generuj obrazek w cronie, a użytkownicy niech go tylko wyświetlają. W takiej sytuacji zawsze będziesz miał tylko 1 proces generujący obrazek.
Go to the top of the page
+Quote Post
konradmm
post
Post #13





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 18.12.2007

Ostrzeżenie: (10%)
X----


Cytat(phpion @ 28.04.2015, 15:30:07 ) *
Generuj obrazek w cronie, a użytkownicy niech go tylko wyświetlają. W takiej sytuacji zawsze będziesz miał tylko 1 proces generujący obrazek.


Problem co do tego jest taki, ze w przypadku gdy lacze sie z baza mysql JEDNOKROTNIE dla roznych uzytkownikow, chce by te dane mi cachowal (raz na 24h) dodatkowo.
Twoj pomysl by zadzialal gdybym nie potrzebowal tego cachowania, a jedynie wyswietlac te same dane dla kazdego uzytkownika
Go to the top of the page
+Quote Post
ActivePlayer
post
Post #14





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


Przed rozpoczeciem generowania nowego obrazka, dodaj jakis tymczasowy plik. Na poczatku skryptu sptawdzaj czy on istnieje, i jesli tak, to czekaj z generowaniem az on zniknie (np. 0,5 sec). Po wygenerowaniu obrazka na nowo, kasuj ten plik zeby zdjac blokade.
Go to the top of the page
+Quote Post

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: 23.08.2025 - 12:31