Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Cachowanie danych.
Gruchol
post
Post #1





Grupa: Zarejestrowani
Postów: 242
Pomógł: 0
Dołączył: 28.11.2014

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


Witam,
Po dłuższym czasie postanowiłem wrócić do przygody z php. Jako swój pierwszy projekt postanowiłem zakodować stronę pewnej gry.
Aktualnie robię ranking, jednak przeszukiwanie całej bazy w której są dane kilkudziesięciu tysięcy użytkowników za bardzo obciąży serwer.
Potrzebuje wyświetlić i cachować takie dane jak czas gry, poziom gracza jakieś tam osiągnięcia itd. Chciałbym aby te dane aktualizowały się np. co 10 minut.
Na internecie znalazłem klasę nospora, jednak nie wiem jeszcze jak za bardzo się jej używa.
Prosiłbym Was o jakieś wskazówki i poradniki (mogą być anglojęzyczne) jakiej klasy użyć ew. jak to rozwiązać.
Pozdrawiam.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
daro0
post
Post #2





Grupa: Zarejestrowani
Postów: 88
Pomógł: 12
Dołączył: 17.09.2014
Skąd: Krasnystaw

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


No to masz tu (ale nie sprawdzałem działania kodu), może to zrozumiesz. I nie licz na gotowce, zresztą ograniczyłem tylko do jednego rekordu.

  1. define('DOCROOT', realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR);
  2.  
  3. function DisplayRanking()
  4. {
  5. //najpierw sprawdzanie czy cache jest, jesli nie to pobieranie z bazy i zapis do cache
  6. if (($row = load_cache('ranking', 60)) === NULL)
  7. {
  8. $db = new PDO('mysql:host=localhost;dbname=test', 'root', 'qwerty123');
  9. $stmt = $db->prepare("SELECT player.player.id, player.player.name,
  10. player.player.level, player.player.playtime,
  11. player.player.last_play, player.guild.name AS 'guild_name'
  12. FROM player.player, player.guild, player.guild_member
  13. WHERE player.player.id = player.guild_member.pid
  14. AND player.guild.id = player.guild_member.guild_id
  15. ORDER BY level DESC LIMIT 1");
  16. $stmt->execute();
  17.  
  18. // jesli cokolwiek jest w bazie to zapis
  19. if ($row = $stmt->fetch(PDO::FETCH_OBJ))
  20. {
  21. save_cache('ranking', $row);
  22. }
  23. }
  24.  
  25. //jesli cokolwiek jest to wyswietl w tabeli
  26. if ($row)
  27. {
  28. display($row);
  29. }
  30.  
  31. }
  32.  
  33. function display($row)
  34. {
  35. echo "<table>";
  36.  
  37. if(!empty($row->guild_name))
  38. {
  39. $guild_name = $row->guild_name;
  40. }
  41. else
  42. {
  43. $guild_name = "(Brak)";
  44. }
  45.  
  46. echo "<tr>";
  47. echo "<td>".$row->name."</td>";
  48. echo "<td>".$row->level."</td>";
  49. echo "<td>".$guild_name."</td>";
  50. echo "<td>".$row->playtime."</td>";
  51. echo "<td>".$row->last_play."</td>";
  52. echo "</tr>";
  53.  
  54. echo "</table>";
  55. }
  56.  
  57. function save_cache($name, $data)
  58. {
  59. $file = sha1($name).'.cache';
  60. $dir = DOCROOT . 'cache' . DIRECTORY_SEPARATOR;
  61.  
  62. $data = serialize($data);
  63. return (bool) file_put_contents($dir.$file, $data, LOCK_EX);
  64.  
  65. }
  66.  
  67. function load_cache($name, $lifetime = 60)
  68. {
  69. $file = sha1($name).'.cache';
  70. $dir = DOCROOT . 'cache' . DIRECTORY_SEPARATOR;
  71.  
  72. // cache wazna jesli aktualny czas time() - czas ostatniej modyfikacji pliku
  73. // jest mniejszy od czasu zycia w sekundach
  74. if (is_file($dir.$file))
  75. {
  76. if ((time() - filemtime($dir.$file)) < $lifetime)
  77. {
  78. return unserialize(file_get_contents($dir.$file));
  79. }
  80. else // jesli nie, to usuwanie pliku jesli jest
  81. {
  82. unlink($dir.$file);
  83. }
  84. }
  85.  
  86. return NULL;
  87. }
  88.  
  89. // i wywolanie glownej funkcji
  90. DisplayRanking();
  91.  


Przeanalizuj to sobie jak to wszystko działa.

Ten post edytował daro0 27.07.2016, 05:44:11
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 10.10.2025 - 15:52