Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Wykres graczy
mazyl
post
Post #1





Grupa: Zarejestrowani
Postów: 139
Pomógł: 2
Dołączył: 2.12.2011

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


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)

Go to the top of the page
+Quote Post
Kshyhoo
post
Post #2





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




cross


--------------------
Go to the top of the page
+Quote Post
mazyl
post
Post #3





Grupa: Zarejestrowani
Postów: 139
Pomógł: 2
Dołączył: 2.12.2011

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


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?
Go to the top of the page
+Quote Post
Lejto
post
Post #4





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


sprawdź kodowanie skryptu


--------------------
Go to the top of the page
+Quote Post
mazyl
post
Post #5





Grupa: Zarejestrowani
Postów: 139
Pomógł: 2
Dołączył: 2.12.2011

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


sprawdzałem, zmieniałem, nic nie pomaga sad.gif
Go to the top of the page
+Quote Post
Uriziel01
post
Post #6





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

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


Oczywiście użyłeś przed wyświetleniem na ekran:
  1. header('Content-Type: image/png');


Aby przeglądarka wiedziała co ma pokazać.
Go to the top of the page
+Quote Post
mazyl
post
Post #7





Grupa: Zarejestrowani
Postów: 139
Pomógł: 2
Dołączył: 2.12.2011

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


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


Ten post edytował mazyl 10.02.2012, 11:26:17
Go to the top of the page
+Quote Post
Uriziel01
post
Post #8





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

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


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. ?>


Ten post edytował Uriziel01 10.02.2012, 12:12:47
Go to the top of the page
+Quote Post
mazyl
post
Post #9





Grupa: Zarejestrowani
Postów: 139
Pomógł: 2
Dołączył: 2.12.2011

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


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
Go to the top of the page
+Quote Post
Uriziel01
post
Post #10





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

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


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. ?>



Ten post edytował Uriziel01 10.02.2012, 12:44:58
Go to the top of the page
+Quote Post
mazyl
post
Post #11





Grupa: Zarejestrowani
Postów: 139
Pomógł: 2
Dołączył: 2.12.2011

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


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. ?>

Go to the top of the page
+Quote Post
Uriziel01
post
Post #12





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

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


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.

Ten post edytował Uriziel01 10.02.2012, 13:57:03
Go to the top of the page
+Quote Post
mazyl
post
Post #13





Grupa: Zarejestrowani
Postów: 139
Pomógł: 2
Dołączył: 2.12.2011

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


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?

Ten post edytował mazyl 11.02.2012, 15:26:11
Go to the top of the page
+Quote Post
Uriziel01
post
Post #14





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

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


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ż.

Ten post edytował Uriziel01 11.02.2012, 15:32:56
Go to the top of the page
+Quote Post
mazyl
post
Post #15





Grupa: Zarejestrowani
Postów: 139
Pomógł: 2
Dołączył: 2.12.2011

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


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ć ?

Ten post edytował mazyl 11.02.2012, 23:31:48
Go to the top of the page
+Quote Post

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: 21.08.2025 - 06:03