Alternative zu jpgraph gesucht

spikaner

Quereinsteiger @ php
Ich benutze momentan jpgraph zum erstellen von mehreren diagrammen, da ich aber das script komplett umkrempeln will und mir die Ladezeiten auch zu hoch sind suche ich nach einer Alternative dazu. Momentan schaut das ganze so aus.
http://91.121.142.37/gawebe/marktpreise/

Scriptausschnitt für ein Diagram
PHP:
<?php
require_once ('jpgraph/jpgraph.php');
require_once ('jpgraph/jpgraph_line.php');
$region[0] = "Jita";
$region[1] = "Yarebap";
$region[2] = "Amarr";
$region[3] = "Hek";
$region[4] = "Rens";
$region[5] = "Dodixie";


for ($i = 0; $i < count ($region); $i++)
{
	$sql = "
	SELECT 
		*
	FROM
		mineraliean
	WHERE
		Ort = '".$region[$i]."'
	ORDER BY
		Time
	DESC
	LIMIT 0,7
	";
	$result = mysql_query($sql) or die(mysql_error());
	$y = 0;
	while($dat=mysql_fetch_array($result))
    	{
		$data[$i][$y] = $dat[$mineral];
		$y++;
	}
}

$datay1 = $data[0];
$datay2 = $data[1];
$datay3 = $data[2];
$datay4 = $data[3];
$datay5 = $data[4];
$datay6 = $data[5];

$totalcount = 7;
for($i = count($datay1); $i < $totalcount; $i++){
    $datay1[] = 0;
	}
for($i = count($datay2); $i < $totalcount; $i++){
    $datay2[] = 0;
	}
for($i = count($datay3); $i < $totalcount; $i++){
    $datay3[] = 0;
	}
for($i = count($datay4); $i < $totalcount; $i++){
    $datay4[] = 0;
	}
for($i = count($datay5); $i < $totalcount; $i++){
    $datay5[] = 0;
	}
for($i = count($datay6); $i < $totalcount; $i++){
    $datay6[] = 0;
	}


// Setup the graph
$graph = new Graph(600,300);
$graph->SetScale("textlin");

$theme_class=new UniversalTheme;

$graph->SetTheme($theme_class);
$graph->img->SetAntiAliasing(false);
$graph->title->Set('Preisverlauf '.$mineral.' 7 Tage');
$graph->SetBox(false);

$graph->img->SetAntiAliasing();

$graph->yaxis->HideZeroLabel();
$graph->yaxis->HideLine(false);
$graph->yaxis->HideTicks(false,false);

$graph->xgrid->Show();
$graph->xgrid->SetLineStyle("solid");
$graph->xaxis->SetTickLabels(array('Heute','gestern','3 Tage','4 Tage','5 Tage','6 Tage','7 Tage'));
$graph->xgrid->SetColor('#E3E3E3');

// Create the first line
$p1 = new LinePlot($datay1);
$graph->Add($p1);
$p1->SetColor("#0000ff");
$p1->SetLegend('Jita');

// Create the second line
$p2 = new LinePlot($datay2);
$graph->Add($p2);
$p2->SetColor("#00ff00");
$p2->SetLegend('Yarebap');

// Create the third line
$p3 = new LinePlot($datay3);
$graph->Add($p3);
$p3->SetColor("#ff0000");
$p3->SetLegend('Amarr');

// Create the 4
$p4 = new LinePlot($datay4);
$graph->Add($p4);
$p4->SetColor("#ff8c00");
$p4->SetLegend('Hek');

// Create the 5
$p5 = new LinePlot($datay5);
$graph->Add($p5);
$p5->SetColor("#9932CC");
$p5->SetLegend('Rens');

// Create the 6
$p6 = new LinePlot($datay6);
$graph->Add($p6);
$p6->SetColor("#7FFFD4");
$p6->SetLegend('Dodixie');

$graph->legend->SetFrameWeight(1);

// Output line
$graph->Stroke();
?>

aufruf erfolgt ganz einfach über

PHP:
<?php echo $mineral;?>

nur will ich jetzt 1. schnellere Ladezeiten erzielen und 2. ohne Iframes Arbeiten

Danke im voraus für Tips
 
Dazu eignet sich SVG perfekt. Das kannste auf sehr viele Arten auf deiner Webseite ausgeben.

Schau mal hier:
http://www.datenverdrahten.de/svgphp/

Ich habe ein Projekt von mir auch umgebaut auf das SVG-Format. Der Ressourchenverbauch ist quasi Null. Ich erstelle meine SVGs mit PHP in Millisekunden. Ich kenne nichts was besser ist.

Im Grunde ist es so als würde man eine TXT-Datei erstellen.

Langsam wird es erst, wenn du die SVG in ein Rasterformat konvertieren möchtest (muss nicht!). Dann zählt die Power des Servers. Aber selbst an meinem Power-Rechner dauert die konvertierung gefühlt lange. Aber man kann SVGs natürlich auch direkt ausgeben.
 
Zuletzt bearbeitet:
Danke für die schnelle Antwort, habe auch schon das Wikie gefunden aber blicke da net so wirklich durch. Im Prinzip will ich ja das selbe erreichen wie momentan nur ebend der Seitenaufbau sollte etwas schneller gehn (habe z.b. bei jpgraph nichts entdeckt um die auflösung des pixs zu senken) evtl. wird es ja dann schon schneller um dann alle Bilder zum "ein/ausblenden" via Div und javascript zu "behandeln".

Mein 1. Ansatz war die pic´s einmal pro Tag via cronjob zu erstellen, aber da bricht der Server wegen "ladedauer(Timeout)" ab.

mfg

P.S. Das ist nur nen Testserver später soll es ebend auf nen Server laufen mit nur einen cronjob wie ebend momentan auch, einmal täglich Db Abfrage speichern.
 
Zuletzt bearbeitet:
So hab nochmal nen bisl herumversucht...
das XML auslesen dauert so gesehn zu lange.. aber "Weiterleitungen" in einen cronjob geht ja nicht oder ?

so sieht es mom aus und dauert ewig + pics erstellen ist dann colapse..

PHP:
<?php
// db login sachen  (cronejobs wollen das)

// letzte id ermitteln
$abfrage = "SELECT * FROM mineraliean ORDER BY id DESC LIMIT 1 ";
$result = mysql_query($abfrage);
$row=mysql_fetch_array($result);
$lastid = $row['id'];
$newid = $lastid + 1;

$type[0] = 34; // Tritanium was ist es
$type[1] = 35; // Pyerite
$type[2] = 36; // Meyallon
$type[3] = 37; // Isogen
$type[4] = 38; // Noxium
$type[5] = 39; // Zydrine
$type[6] = 40; // Megacyte
$type[7] = 11399; // Morphite
$type[8] = 16265;// White Glaze


$region[0] = 30000142; // wo ist es
$regionort[0] = "Jita";
$region[1] = 30004111;
$regionort[1] = "Yarebap";
$region[2] = 30002187;
$regionort[2] = "Amarr";
$region[3] = 30002053;
$regionort[3] = "Hek";
$region[4] = 30002510;
$regionort[4] = "Rens";
$region[5] = 30002659;
$regionort[5] = "Dodixie";

// 30002783 Sankkasen

$time = time();

// hier dann noch 2. for schleife mit region
for ($y = 0; $y < count ($region); $y++)
{
	for ($i = 0; $i < count ($type); $i++)
	{
		$file="http://api.eve-central.com/api/marketstat?typeid=".$type[$i]."&usesystem=".$region[$y];  
		$inhalt=file_get_contents($file);
		if (!empty($inhalt)) {
			$xml = new SimpleXMLElement($inhalt);
			$preis[$i] = $xml->marketstat->type->buy->max;
	echo $preis[$i];
			$preisan[$i] = $xml->marketstat->type->sell->min;

		}
		else
		{
	echo "fehler";
		}
	}

	
	// eintrag in db
	$sql="
	INSERT INTO mineraliean (
	Time,
	Tritanium,
	Pyerite,
	Mexallon,
	Isogen,
	Nocxium,
	Megacyte,
	Zydrine,
	Morphite,
	WhiteGlaze,
	Ort,
	Ortid,
	id
	)
	VALUES (
	'".$time."',
	'".$preis[0]."',
	'".$preis[1]."',
	'".$preis[2]."',
	'".$preis[3]."',
	'".$preis[4]."',
	'".$preis[6]."',
	'".$preis[5]."',
	'".$preis[7]."',
	'".$preis[8]."',
	'".$regionort[$y]."',
	'".$region[$y]."',
	'".$newid."'
	)";

	mysql_query($sql) or die (mysql_error());

$sql="
INSERT INTO mineralieanan (
Time,
Tritanium,
Pyerite,
Mexallon,
Isogen,
Nocxium,
Megacyte,
Zydrine,
Morphite,
WhiteGlaze,
Ort,
Ortid,
id
)
VALUES (
'".$time."',
'".$preisan[0]."',
'".$preisan[1]."',
'".$preisan[2]."',
'".$preisan[3]."',
'".$preisan[4]."',
'".$preisan[6]."',
'".$preisan[5]."',
'".$preisan[7]."',
'".$preisan[8]."',
'".$regionort[$y]."',
'".$region[$y]."',
'".$newid."'
)";
mysql_query($sql) or die (mysql_error());
}

?>
 
Für so Graphen würde ich immer Javascript verwenden. Wirst sehen, dann geht der Seitenaufbau auch deutlich schneller. Aufwendige grafiken mit PHP generieren dauert halt lange ;)
 
Ich weiss nicht ob du SVG richtig begriffen hast, aber was schnelles wirst du nicht finden. Ich erstelle dir ein 10000x10000px "Bild" (gerne auch viel größer) schneller als du gucken kannst. Das sind Millisekunden. Dann brauchste dir auch keine sorgen mehr über Ressourcen machen. Natürlich hat das SVG-Format seine Grenzen (SVG + Rasterformate) aber in deinem Fall ist es perfekt dafür geeignet.

http://www.datenverdrahten.de/svgphp/balkendiagramm.svg?generated=1391124561

Lieber ein paar Tage in SVG einarbeiten und dafür etwas vernüftiges machen.
 
SVG hilft aber auch nichts, wenn das Skript in einen Timeout läuft, weil es x-mal y externe Requests durchführt.

Eine Lösung wäre es, nicht alle Daten auf einmal zu holen, sondern etwa per cron alle paar Minuten einen einzelnen Request auszulösen.

Wenn die generierten Grafiken nur tagesaktuell sein müssen, können auch die gecachet und nur alle paar Stunden oder so neu berechnet werden.

Zu dem Datenbank-Code bitte noch lesen:

- http://php-de.github.io/jumpto/faq/#sql-injection
- http://php-de.github.io/jumpto/faq/#deprecated-mysql
 
Verstehe deine Aussage nicht wirklich.

Es reicht doch mit Hilfe von PHP alle X Minuten, Stunden, Tage, Wochen, Monate oder Jahre eine neue SVG zu erstellen.
 
Ich bezog mich auf Beitrag #4. Der enthält Code zur Durchführung eines externen Requests in einer Schleife in einer Schleife. Das waren zu dem Zeitpunkt glaube ich neue Informationen, aber das scheint an der Stelle der Flaschenhals zu sein.

Ansonsten wollte ich eben sagen, dass man Dinge, die sich einen Tag lang sowieso nicht ändern, nicht permanent für jeden Seitenabruf neu zu generieren braucht. Das heißt, dass es weniger relevant wird, wie lange die Berechnung dauert, da sie nur einmal pro Tag oder so gemacht werden muss.

Das ändert nichts daran, dass es für den Server sicherlich weniger Aufwand ist, ein paar JSON- oder SVG-Strings zu schreiben, als eine Rastergrafik zu erzeugen.[1] Das könnte man wahrscheinlich sogar inklusive Datenbankabruf ohne Caching machen, ohne dass die Performance grausam leidet.

Selbst bei JS/SVG würde man aber durch Caching bei der Generierung in wesentlichem Maße Zeit sparen – allein schon durch Wegfall der DB-Operationen etwa. Dinge nicht tun, ist nun mal per Definition schneller, als Dinge zu tun. :)

Ich weiß nicht genau, wie man das pauschal ausdrücken kann, aber es ist häufig kein guter Einsatz von Arbeitszeit, Dinge zu optimieren, die man cachen kann. Das ist die „falsche Schraube“.

10.000 Hits am Tag, Rastergrafik generieren dauert 300 ms, SVG generieren dauert 30 ms, gecachete Daten durchreichen dauert 5 ms.

Mit Cache kommt man für die Rastergrafik auf insgesamt 300+(10.000*5) = 50.300 ms und für SVG auf 50.030 ms. Da schrumpft der Unterschied auf 270 ms zusammen, was ein halbes Prozent der Gesamtzeit ist.​



1: Na ja, wenn man DOMDocument nutzt (was eigentlich sicher keine schlechte Idee ist), relativiert sich das etwas.
 
Zuletzt bearbeitet:
Zurück