Wie xml efektiv auslesen ?

spikaner

Quereinsteiger @ php
Ich möchte aus einer xml 3 werte herausholen und bräuchte einen lösungsansatz wie ich das anstelle ohne zu sehr auf die Preformancebremse zu treten da das ganze ca. 1000 mal hintereinander ablaufen soll nur mit einer anderen type id.
das xml file sieht so aus
Code:
<!-- This is the new API :-) -->
<api version="2.0" method="marketstat_xml">
	<marketstat>
		<type id="12235">
			<all>
				<volume>272.00</volume>
				<avg>186268660.24</avg>
				<max>400000000.00</max>
				<min>81000003.00</min>
				<stddev>55912428.07</stddev>
				<median>188900000.00</median>
				<percentile>0.00</percentile>
			</all>
			<buy>
				<volume>115.00</volume>
				<avg>138325891.61</avg>
				<max>185000003.02</max>
				<min>81000003.00</min>
				<stddev>30999153.09</stddev>
				<median>130200600.00</median>
				<percentile>179654546.44</percentile>
			</buy>
			<sell>
				<volume>157.00</volume>
				<avg>219009867.54</avg>
				<max>400000000.00</max>
				<min>185000000.00</min>
				<stddev>39650396.34</stddev>
				<median>216500000.00</median>
				<percentile>188578571.38</percentile>
			</sell>
		</type>
	</marketstat>
</api>
Nun benötige ich aber blos unter <sell> max min und median , wie realisiere ich das am besten und einfachsten da jedesmal ein link aufgerufen wird (http://domain.com/xmlout?typeid=12235)

mfg spikaner
 
Thx schonmal.., hab jetzt auf die schnelle das gebastellt was funktioniert.. nur das script muss jetzt knapp 1000 mal laufen und der datenbankeintrag bei mir kommt dann auch noch hinzu. und es dauert jetzt schon eine halbe ewigkeit (k.a. vermutlich ist die gegenstelle so langsam ^^)
PHP:
<?php
$file="(http://domain.com/xmlout?typeid=12235";  
$inhalt=file_get_contents($file);
if (!empty($inhalt)) {
	$xml = new SimpleXMLElement($inhalt);

	echo $xml->marketstat->type->sell->max;
	echo '</br>';
	echo $xml->marketstat->type->sell->min;
	echo '</br>';
	echo $xml->marketstat->type->sell->median;
	echo '</br>';
}
?>
wie verhindere ich oder kann ich nun verhindern das mein script miten in der ausführung wegen zeitüberschreitung stopt ?

mfg
 
Entweder max_execution_time in der php.ini hoch setzen, oder ini_set() benutzen.

Möglicherweise kannst du auch schon früher ansetzen. Schau doch mal nach, ob es tatsächlich die Gegenstelle ist, die da lange braucht. microtime() sollte dabei helfen, herauszufinden, welche Stelle des Codes langsam ist. Wenn es die Gegenstelle ist, kannst du ja mal schauen, ob es der Download des XML ist (evtl. große Datei) oder die Verarbeitung und Bereitstellung bei domain.com. Wenn es der Download ist, kann man evtl. mit GZIP-Komprimierung die Sache etwas beschleunigen.
 
Indem Du mit get()-Variable jeweils den nächsten Selbstaufruf machst. Erstelle ein array mit den Dateinamen/Urls und rufe nach erfolgreichem Auslesen und Eintragen Dich selbst auf mit einem inkrementierenden Zähler. Möglicherweise liegen die XML-IDs eh hintereinander, dann brauchst Du kein array.. Somit kannst Du auch an der url get Variable einsehen, wo sich Dein script grad befindet.

mfg chmee
 
Zuletzt bearbeitet:
Ich habe das bei eve-online mal getestet, die liefern sehr schnell aus. Kann nicht an denen liegen. Ist vermutlich die Anzahl der Aufrufe, die werden so was wie ein Filtersystem haben, damit da nicht gegrast wird.
 
@saftmeister es ist tatzächlich für eve-online ;) nur für eine "partnerseite" um marktpreise zu bekommen und dessen server ist so langsam. Die max_execution_time kann ich leider nich hochsetzen läst der Hoster nicht zu.

@chmee hättest du evtl nen codeschnipsel parat mit den Seite neu laden höhrt sich am besten an.
Würde dann ger bei jeden durchlauf den status ausgeben ala
PHP:
		echo "Marktpreis für: ".$name." empfangen. </br>";
		echo "Id: ".$id." erfolgreich geändert. </br>";
	}
	else
	{
		echo "Keinen Preis für: ".$name." empfangen. </br>";
		echo "Id: ".$id." nicht erfolgreich geändert. </br>";
und das ganze dann fortlaufend untereinander schreiben lassen. Ist das möglich ?

P.S. mom schaut mein script so aus, aber bricht wegen der ladezeit ab.
PHP:
while($id < $maxid)
{
	$sql="SELECT  
	*
	FROM
	structures
	WHERE
	id = '$id'
	";
	$result=mysql_query($sql);
	$row=mysql_fetch_assoc($result) or die('query fehlgeschlagen');
	$type = $row['typeid'];
	$name = $row['name'];
	$max = $row['max'];
	$min = $row['min'];
	$mittel = $row['mittel'];


	$file="http://domain.com/xmlout?typeid=".$type;  
	$inhalt=file_get_contents($file);
	if (!empty($inhalt)) {
		$xml = new SimpleXMLElement($inhalt);

		$maxneu = $xml->marketstat->type->sell->max;
		$minneu = $xml->marketstat->type->sell->min;
		$mittelneu = $xml->marketstat->type->sell->median;

		$sql="UPDATE
		structures
		SET
		max = '$maxneu',
		min = '$minneu',
		mittel = '$mittelneu'
		WHERE
		id = '$id'";
		mysql_query($sql);

		echo "Marktpreis für: ".$name." empfangen. </br>";
		echo "Id: ".$id." erfolgreich geändert. </br>";
	}
	else
	{
		echo "Keinen Preis für: ".$name." empfangen. </br>";
		echo "Id: ".$id." nicht erfolgreich geändert. </br>";
	}
$id++;
}

mfg
 
allgemein gehaltenes Beispiel ausm Kopf
PHP:
$ID = array(1,2,3,4,5,6,7,8);
$cID = count($ID);
# -- könnte auch ein array aus der DB sein
# -- könnte man auch nur einmal aufrufen ;)
# -- und mitschleppen, zB per post

$pointer = $_GET['index'];

# -- wenn keine get-Variable, dann pointer auf 0 (start) setzen
if(!$pointer) { $pointer = 0; }

# -- wenn pointer = count() -> ENDE
if($pointer==$cID) { exit(); }

# -- Verarbeitung
echo " ich verarbeite..";

# -- Ausgabe
echo $pointer++;

# -- Verweis auf sich selbst und Aufruf
# -- ohne Ausgabe hätte ein header() gereicht..
$eigeneURL = $_SERVER['PHP_SELF']."?index=".$pointer;
echo '<meta http-equiv="Refresh" content="1; url='.$eigeneURL.'">';
Wie gesagt, jetzt so hingeschlunzt. Optimierungsmöglichkeiten gibt es (zB array einmal in der ersten if-Abfrage erstellen und per post mitschleppen) und Fehler können auch drin sein..

(p.s.: Grundsätzlich ist der meta refresh ne schmutzige Lösung an dieser Stelle, sollte eigentlich in den head. aber man könnte auch nen javascript-schnippsel einbauen oder auf die Ausgabe per se verzichten und in php per header() den Selbstaufruf initiieren - man hat ja ne kleine Kontrolle in der url..)

mfg chmee
 
Zuletzt bearbeitet:
Thx, funktioniert jetzt wunderbar, anbei mal meine Version falls es jemand gebrauchen kann.

mfg Spikaner

PHP:
<?php
session_start ();

// db verbindung aufbauen am besten nur einmal in extra Datei und danach das script via header aufrufen. 

$mysql_user = '....';
$mysql_pw = '....';
$mysql_host = '....';
$mysql_db = '....';

$connect    = @mysql_connect($mysql_host, $mysql_user, $mysql_pw); 
$db = mysql_select_db($mysql_db,$connect) or die ("Kann die Datenbank nicht lesen!"); 

IF (!isset($_GET['eintrag'])) {

	$_SESSION['fehler'] = 0;
	$_SESSION['richtig'] = 0;
	$count = mysql_query('SELECT id FROM structures') OR die(mysql_error());
	$cID = mysql_num_rows($count);
}
else
{
	$cID = $_GET['eintrag']; // könnte man auch auf session umstellen da sowiso eine gestartet wird.
}

// Kann man in die erste isset nehmen Übersichtshalber aber extra 

IF (isset($_GET['index'])) {
	$pointer = $_GET['index'];
}
else
{
	$pointer = 0;
}


# -- wenn pointer = count() -> ENDE

if($pointer==$cID) {

	IF ($_SESSION['fehler'] == 0){
		echo "<font color=\"#008000\">".$_SESSION['richtig']." Datensätze erfogreich verarbeitet.</font></br>";
		echo "Marktpreise sind nun auf den aktuellen Stand.</br>";
	}
	else
	{
		echo "Leider lief nicht alles glatt.</br>";
		echo "<font color=\"#FF0000\">".$_SESSION['fehler']." Datensätze enthielten Fehler.</font></br>";
		echo "Die Restlichen ".$_SESSION['richtig']." Datensätze wurden erfolgreich verarbeitet, </br>";
		echo "Bitte gegebenfalls die Seite später nocheinmal aufrufen.</br>";
	}
exit();
}

# -- Verarbeitung

$pointer++;
$id = $pointer; // nur gemacht um zu vorherigen post den vergleich darzustellen

$sql="SELECT  
*
FROM
structures
WHERE
id = '$id'
";
$result=mysql_query($sql);
$row=mysql_fetch_assoc($result) or die('query fehlgeschlagen');
$type = $row['typeid'];
$name = $row['name'];
$max = $row['max'];
$min = $row['min'];
$mittel = $row['mittel'];

$file="http://domain.com/xmlout?typeid=".$type;  
$inhalt=file_get_contents($file);
if (!empty($inhalt)) {
	$xml = new SimpleXMLElement($inhalt);
	$maxneu = $xml->marketstat->type->sell->max;
	$minneu = $xml->marketstat->type->sell->min;
	$mittelneu = $xml->marketstat->type->sell->median;
	$sql="UPDATE
	structures
	SET
	max = '$maxneu',
	min = '$minneu',
	mittel = '$mittelneu'
	WHERE
	id = '$id'";
	mysql_query($sql);

	echo "<font color=\"#008000\">Marktpreis für: ".$name." empfangen. </br>";
	echo "Id: ".$id." erfolgreich geändert. </font></br>";
	$_SESSION['richtig'] = $_SESSION['richtig'] + 1;
}
else
{
	$_SESSION['fehler'] = $_SESSION['fehler'] + 1;
	echo "<font color=\"#FF0000\">Keinen Preis für: ".$name." empfangen. </br>";
	echo "Id: ".$id." nicht erfolgreich geändert. </font></br>";
}


# -- Verweis auf sich selbst und Aufruf

$eigeneURL = $_SERVER['PHP_SELF']."?index=".$pointer."&eintrag=".$cID;
echo '<meta http-equiv="Refresh" content="1; url='.$eigeneURL.'">';  


?>
 

Neue Beiträge

Zurück