Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wykres graczy
Forum PHP.pl > Forum > PHP
mazyl
Witam!

Mam taki mały problem, potrzebuje zrobić wykres graczy Counter Strike na danym serwerze (mniej wiecej taki jak np GameTracker ma na swoich monitorach serwerów)

Czy ma ktoś pomysł jak to zrobić ?

probowałem aby dane z wykresu były zapisywane w bazie mysql, ale serwer był za mocno obciazany ( serwerów gry jest sporo)

Kshyhoo
cross
mazyl
tak wiem smile.gif tylko że tam musi pobierać info z bazy ile graczy było w danej godzinie.

troche ciezko by np gdy ma pobierać co 30 min, w 1 momecie bylo wykonanych 48 zapytań * 380 serwerów wink.gif

Może jeszcze tak:

posiadam taki kod:



  1. <?php
  2. require('var/ustawienia.php');
  3. require('funkcje/podstawowe.php');
  4. //Pobieranie danych o serwerze
  5. $ip = $_GET['server'];
  6. $serw = mysql_fetch_array(mysql_query("select * from serwery where ip='$ip'"));
  7. // header("Content-type: image/png");
  8.  
  9.  
  10.  
  11. $im = imagecreate (400, 200);
  12.  
  13.  
  14. $black = imagecolorallocate($im, 0, 0, 0);
  15. $w = ImageColorAllocate ($im, 255, 255, 255);
  16. $red = ImageColorAllocate ($im, 255, 0, 0);
  17. $blue = ImageColorAllocate ($im, 0, 0, 255);
  18. $green = ImageColorAllocate ($im, 0, 255, 0);
  19.  
  20. imagefilledrectangle ($im, 0, 0, 400, 200, $black);
  21.  
  22. $buf = "Proste wykresy funkcji";
  23. imagestring ($im, 5, 1, 1, $buf, $w);
  24.  
  25.  
  26. $szerokosc = 200;
  27.  
  28. $oldy = 100;
  29.  
  30. for ($i = 0; $i < 100; $i++) {
  31.  
  32. imageline($im, $i*$szerokosc, $serw["gracze"], ($i+1)*$szerokosc, $serw["gracze"], $red);
  33. $y = 100;
  34. $oldy = $y;
  35. }
  36. //$szerokosc - rozpietosc wykresu, $szerokosc*100 - szerokość pola wykresu
  37. //$tablica musi zawierać 100 elementów (albo trzeba dać warunek sprawdzający isset)
  38.  
  39. imagepng($im);
  40. ?>


nisetety zwraca mi krzeczki.
dowiedziałem sie ze aby zadziałał, trzeba pobrac więcej informacji z bazy danych.
czy jest jakiś inny sposób?
Lejto
sprawdź kodowanie skryptu
mazyl
sprawdzałem, zmieniałem, nic nie pomaga sad.gif
Uriziel01
Oczywiście użyłeś przed wyświetleniem na ekran:
  1. header('Content-Type: image/png');


Aby przeglądarka wiedziała co ma pokazać.
mazyl
tak uzyłem. z tym ze wyskakiwał błąd:

  1. Warning: Cannot modify header information - headers already sent by (output started at /home/mazyl1/domains/cs-server.pl/public_html/wykres.php:3) in /home/mazyl1/domains/cs-server.pl/public_html/wykres.php on line 10


------------Edit-----------

Udało sie. glupi bład spacji smile.gif

teraz jest dobrze, ale nie rysuje wykresu sad.gif
Uriziel01
Lepiej powiedz lub pokaż co chcesz uzyskać bo nie wiem do czego zmierzasz, np. tak :

  1. <?PHP
  2. header('Content-Type: image/png');
  3. $gracze = array();
  4. for ($i =0;$i<50;$i++)
  5. {
  6. $value = rand(2,95);
  7. $gracze[] = $value;
  8. }
  9. $im = imagecreate (400, 200);
  10.  
  11.  
  12. $black = imagecolorallocate($im, 0, 0, 0);
  13. $w = ImageColorAllocate ($im, 255, 255, 255);
  14. $red = ImageColorAllocate ($im, 255, 0, 0);
  15. $blue = ImageColorAllocate ($im, 0, 0, 255);
  16. $green = ImageColorAllocate ($im, 0, 255, 0);
  17. $wysokosc = 200;
  18. $szerokosc = 400;
  19. imagefilledrectangle ($im, 0, 0, $szerokosc, $wysokosc, $black);
  20.  
  21. $buf = "Proste wykresy funkcji";
  22. imagestring ($im, 5, 1, 1, $buf, $w);
  23.  
  24. $szerokosc_pola = $szerokosc / count($gracze);
  25.  
  26. foreach($gracze AS $i => $serwer)
  27. {
  28. $colour = ImageColorAllocate ($im, 255 - (($i*$szerokosc_pola) * 100 / $szerokosc), (($i*$szerokosc_pola) * 100 / $szerokosc), 0);
  29. imagerectangle($im, $i*$szerokosc_pola, $wysokosc - $serwer, ($i+1)*$szerokosc_pola, $wysokosc, $colour);
  30. }
  31.  
  32. imagepng($im);
  33. ?>
mazyl
dokładnie, z tym aby to był wykres liniowy, aby maksymalna wysokość lini nie była maksymalna dana wartościa tylko maksymalna ilością graczy na serwerze (np serwer 32 sloty, gra 16 to linia przebiega w polowie, nie na samej górze)

uzyskać chce mniej wiecej coś takiego:


tutaj ten wykres na końcu lub:

chodzi mi o coś podobnego do tych wykresów na końcu
Uriziel01
No wiesz ja tego do końca za Ciebie nie zrobię gdyż to ne jest tego typu forum, tutaj się pomaga nie odwala za kogoś robotę, ale to będzie coś w tym stylu (mogą być błędy, pisałem z palca):
  1. <?PHP
  2. header('Content-Type: image/png');
  3. $max_slots = 32;
  4. $wysokosc = 200;
  5. $szerokosc = 400;
  6. $gracze = array();
  7. for ($i =0;$i<20;$i++)
  8. {
  9. $rand = rand(5,$max_slots);
  10. $value = ($rand / $max_slots) * $wysokosc - 5;
  11. $gracze[] = $value;
  12. }
  13. $im = imagecreate (400, 200);
  14.  
  15. $black = imagecolorallocate($im, 0, 0, 0);
  16. $w = ImageColorAllocate ($im, 255, 255, 255);
  17. $red = ImageColorAllocate ($im, 255, 0, 0);
  18. $blue = ImageColorAllocate ($im, 0, 0, 255);
  19. $green = ImageColorAllocate ($im, 0, 255, 0);
  20. imagefilledrectangle ($im, 0, 0, $szerokosc, $wysokosc, $black);
  21. $szerokosc_pola = $szerokosc / count($gracze);
  22.  
  23. foreach($gracze AS $i => $serwer)
  24. {
  25. if (isset($gracze[$i+1]))
  26. {
  27. $colour = ImageColorAllocate ($im, 255 - (($i*$szerokosc_pola) * 100 / $szerokosc), (($i*$szerokosc_pola) * 100 / $szerokosc), 0);
  28. imageline($im, ($i*$szerokosc_pola) + 5, $wysokosc - $serwer, ($i+1)*$szerokosc_pola + 5, $wysokosc - $gracze[$i + 1], $colour);
  29. }
  30. }
  31. imageline($im, 5, 10, 5,$wysokosc - 5, $w);
  32. imageline($im, 5, $wysokosc - 5, $szerokosc - 5,$wysokosc - 5, $w);
  33. imagestring ($im, 5, 10, 1, $max_slots, $w);
  34. imagestring ($im, 5, 10, $wysokosc / 2 - 20, round($max_slots/2), $w);
  35. imagestring ($im, 5, 10, $wysokosc - 20, 0, $w);
  36. imagepng($im);
  37. ?>

mazyl
sam też nie chce by to ktoś w całości za mnie zrobił wink.gif wole sie czegoś nauczyć smile.gif



mógłbyś mi jeszcze podpowiedzieć jak mam zrobić aby pobierało 24 rekordy z bazy danych, i tworzyło z nich wykres?

  1. <?php
  2. require('var/ustawienia.php');
  3. require('funkcje/podstawowe.php');
  4. //Pobieranie danych o serwerze
  5. $ip = $_GET['server'];
  6. $serw = mysql_fetch_array(mysql_query("select * from serwery where ip='$ip'"));
  7. header('Content-Type: image/png');
  8.  
  9. $max_slots = $serw['maxgracze'];
  10.  
  11. $wysokosc = 200;
  12.  
  13. $szerokosc = 400;
  14.  
  15. $gracze = array();
  16.  
  17. for ($i =0;$i<20;$i++)
  18.  
  19. {
  20. $rand = mysql_query("select * from wykres where serwer=".$serw['id']."");
  21.  
  22.  
  23.  
  24. $value = ($rand / $max_slots) * $wysokosc - 5;
  25.  
  26. $gracze[] = $value;
  27.  
  28.  
  29. }
  30.  
  31. $im = imagecreate (400, 200);
  32.  
  33.  
  34.  
  35. $black = imagecolorallocate($im, 0, 0, 0);
  36.  
  37. $w = ImageColorAllocate ($im, 255, 255, 255);
  38.  
  39. $red = ImageColorAllocate ($im, 255, 0, 0);
  40.  
  41. $blue = ImageColorAllocate ($im, 0, 0, 255);
  42.  
  43. $green = ImageColorAllocate ($im, 0, 255, 0);
  44.  
  45. imagefilledrectangle ($im, 0, 0, $szerokosc, $wysokosc, $black);
  46.  
  47. $szerokosc_pola = $szerokosc / count($gracze);
  48.  
  49.  
  50.  
  51. foreach($gracze AS $i => $serwer)
  52.  
  53. {
  54.  
  55. if (isset($gracze[$i+1]))
  56.  
  57. {
  58.  
  59. $colour = ImageColorAllocate ($im, 255 - (($i*$szerokosc_pola) * 100 / $szerokosc), (($i*$szerokosc_pola) * 100 / $szerokosc), 0);
  60.  
  61. imageline($im, ($i*$szerokosc_pola) + 5, $wysokosc - $serwer, ($i+1)*$szerokosc_pola + 5, $wysokosc - $gracze[$i + 1], $colour);
  62.  
  63. }
  64.  
  65. }
  66.  
  67. imageline($im, 5, 10, 5,$wysokosc - 5, $w);
  68.  
  69. imageline($im, 5, $wysokosc - 5, $szerokosc - 5,$wysokosc - 5, $w);
  70.  
  71. imagestring ($im, 5, 10, 1, $max_slots, $w);
  72.  
  73. imagestring ($im, 5, 10, $wysokosc / 2 - 20, round($max_slots/2), $w);
  74.  
  75. imagestring ($im, 5, 10, $wysokosc - 20, 0, $w);
  76.  
  77. imagepng($im);
  78.  
  79. ?>

Uriziel01
No chyba wiesz że mysql_query nie zwróci ci żadnych wyników tylko uchwyt do bazy tak więc w pętli for wykonuj tylko mysql_fetch_array a nie znów select'a. Ponadtwo na końcu zapytania dopisz 'LIMIT 24' aby zwróciło tylko 24 rekordy.
mazyl
wybacz ze tak tutaj męczyłem wink.gif dzięki za pomoc smile.gif


------edit-----------

Znów mam problem, czytałem na wujku googlu lecz nie znalazłem informacji.

Utworzyłem wykres, geenruje go i zapisuje do pliku.

probem poega na tym, że plik ma być generowany co 30 min, chciałbym wykorzystać do tego Cron.

niestety, gdy sam otwieram plik wszystko generuje ładnie, lecz gdy robi to cron, nie dziala.
czy jest jakieś inne rozwiązanie?
Uriziel01
Cron odpala skrypt jako kto ? Root ? Jakie masz chmody na foldery gdzie trzymasz generowane pliki ? Zrób sobie zapis do pliku zrzutu błędów ze skryptu aby wiedzeć gdzie dokładnie tkwi błąd ? Cron na pewno się odpala ? Może pokaż lepiej ten wpis z crontab'a. smile.gif

EDIT:
Samo zadanie lepiej też pokaż.
mazyl
chmody 777,

cron 100% odpala, do dodatkowo jest zapis do mysql wykonywany i tam wszystko jest w porzadku.

co do zapisu to pewnie tutaj jest zwalone smile.gif

dokadniej mówiąc w 1 plik (który wywołuje za pomoca crona) tworze pętle.

jak polaczyc 2 plik w którym jest tworzony obrazek ?

plik który jest wykonywany:
  1. <?php
  2. include_once('config.php');
  3. $tab = array($typbazy, $nazwabazy, $haslobazy, $uzytkownikbazy, 'SELECT * FROM `serwery`');
  4. $connect = mysql_connect($tab[0], $tab[1], $tab[2]) or die(mysql_error());
  5. $database = mysql_select_db($tab[3]) or die(mysql_error());
  6. $zapytanie = mysql_query($tab[4]);
  7. while($serw = mysql_fetch_array($zapytanie))
  8. {
  9. header('Content-Type: image/png');
  10. $max_slots = $serw['maxgracze'];
  11. $wysokosc = 20;
  12. $szerokosc = 70;
  13. $gracze = array();
  14. for ($i =0;$i<1;$i++)
  15. {
  16. $rand2 = mysql_query("select * from wykres where serwer=".$serw['id']." order by id asc limit 48");
  17. while($rand = mysql_fetch_array($rand2)) {
  18. $value = ($rand['gracze'] / $max_slots) * $wysokosc;
  19. $gracze[] = $value;
  20. }
  21. }
  22. $im = imagecreate (70, 22);
  23. $black = imagecolorallocate($im, 0, 0, 0);
  24.  
  25. $w = ImageColorAllocate ($im, 255, 255, 255);
  26.  
  27. $red = ImageColorAllocate ($im, 0, 255, 0);
  28.  
  29. $blue = ImageColorAllocate ($im, 0, 0, 255);
  30.  
  31. $green = ImageColorAllocate ($im, 0, 255, 0);
  32.  
  33. imagefilledrectangle ($im, 0, 0, $szerokosc, $wysokosc, $black);
  34. $szerokosc_pola = $szerokosc / count($gracze);
  35. foreach($gracze AS $i => $serwer)
  36. {
  37. if (isset($gracze[$i+1]))
  38. {
  39. $colour = ImageColorAllocate ($im, 255 - (($i*$szerokosc_pola) * 100 / $szerokosc), 255 - (($i*$szerokosc_pola) * 100 / $szerokosc), 255);
  40. imageline($im, ($i*$szerokosc_pola) + 1, $wysokosc - $serwer, ($i+1)*$szerokosc_pola + 1, $wysokosc - $gracze[$i + 1], $green);
  41. }
  42. }
  43. imagePNG($im,"wykresy/".$serw['ip'].".png");// output to buffer
  44. }
  45. ?>


a to otrzymuje:

  1. Warning: imagepng(): Unable to open x for writing: No such file or directory in x/wyk.php on line 43
  2.  
  3. Warning: Cannot modify header information - headers already sent by (output started at x/wyk.php on line 9


pomoze ktos ?

wie ktoś jakby to trzeba było zapisać ?
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.