Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][GD] Wyswietlenie Obrazka a problem z cache'owaniem
Forum PHP.pl > Forum > PHP
konradmm
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.
prz3kus
to może zamiast time:
http://php.net/manual/en/function.microtime.php
konradmm
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 ?
IProSoft
Uzyj file_exists i filemtime, to wystarczy aby wykonać to czego potrzebujesz.
Filemtime porównujesz z time().
konradmm
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.
prz3kus
Możesz wrzucać flagę do bazy i użyć trans-akcyjności, choć na 99% dobrze stosując mikrotime() problem by się rozwiązał.
konradmm
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 haha.gif
Pyton_000
Możesz powiedzieć w jaki sposób "wywołujesz" skrypt xxx razy dokładnie w tej samej sekundzie?
konradmm
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.
Pyton_000
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.
konradmm
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 smile.gif
phpion
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.
konradmm
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
ActivePlayer
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.
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.