parsing - xml datei bis zu 120 MB groß!

daflowjoe

Mitglied
Hi,

ich benutze ein PHP Script, dass diverse Daten aus einer SQL Datenbank holt und sie dann für ein Actionscript in XML aufbereitet.

Klar, sind das schon ein paar Daten schließlich werden Informationen zu jeder Stunde des gesamten Jahres gespeichert. Ich finde jedoch, dass die Datenmengen trotzdem etwas überproportioniert sind.

Das Script:
Code:
<?
include 'functions.php';
mysql_connect("localhost", "simon", "simon") or die("Es konnte keine Verbindung aufgebaut werden");
mysql_select_db("simon");
$handle = fopen("test.xml", "w++");

//$query = "select count(*) as Jahre, REPLACE(tag, "/", ".") as datum, substr(tag,8,4)as jahr, substr(tag,1,2)as tag, CASE substr(tag,4,3) When 'Jan' Then '01'  When 'Feb' Then '02' When 'Mar' Then '03' When 'Apr' Then '04' When 'May' Then '05' When 'Jun' Then '06' When 'Jul' Then '07' When 'Aug' Then '08' When 'Seb' Then '09' When 'Oct' Then '10' When 'Nov' Then '11' When 'Dec' Then '12' End as monat, stunde, anzahl from (select tag, stunde, ip, count(stunde) as anzahl from (select  substr(zeitpunkt,2,11) as tag, substr(zeitpunkt,14,2)as stunde, ip FROM access_log group by ip ORDER By tag) as tab32 group by tag, stunde order by tag) as tabl order by tag, stunde";
$querydata = 'select REPLACE(tag, "/", ".") as datum, substr(tag,8,4)as jahr, substr(tag,1,2)as tag, CASE substr(tag,4,3) When \'Jan\' Then \'01\'  When \'Feb\' Then \'02\' When \'Mar\' Then \'03\' When \'Apr\' Then \'04\' When \'May\' Then \'05\' When \'Jun\' Then \'06\' When \'Jul\' Then \'07\' When \'Aug\' Then \'08\' When \'Seb\' Then \'09\' When \'Oct\' Then \'10\' When \'Nov\' Then \'11\' When \'Dec\' Then \'12\' End as monat, stunde, anzahl from (select tag, stunde, ip, count(stunde) as anzahl from (select  substr(zeitpunkt,2,11) as tag, substr(zeitpunkt,14,2)as stunde, ip FROM access_log group by ip ORDER By tag) as tab32 group by tag, stunde order by tag) as tabl order by tag, stunde';
$execute_f = select($querydata);

foreach($execute_f as $querykey)
{
	
	$arr_db[$querykey['jahr'].$querykey['monat'].$querykey['tag'].$querykey['stunde']] = $querykey['anzahl']; 
}

$queryYears = 'select count(*) as jahre from(select REPLACE(tag, "/", ".") as datum, substr(tag,8,4)as jahr, substr(tag,1,2)as tag, CASE substr(tag,4,3) When \'Jan\' Then \'01\'  When \'Feb\' Then \'02\' When \'Mar\' Then \'03\' When \'Apr\' Then \'04\' When \'May\' Then \'05\' When \'Jun\' Then \'06\' When \'Jul\' Then \'07\' When \'Aug\' Then \'08\' When \'Seb\' Then \'09\' When \'Oct\' Then \'10\' When \'Nov\' Then \'11\' When \'Dec\' Then \'12\' End as monat, stunde, anzahl from (select tag, stunde, ip, count(stunde) as anzahl from (select  substr(zeitpunkt,2,11) as tag, substr(zeitpunkt,14,2)as stunde, ip FROM access_log group by ip ORDER By tag) as tab32 group by tag, stunde order by tag) as tabl group by jahr order by tag, stunde)as donno';
$years = select($queryYears);
foreach($years as $years_nr)
{
		$jahre = $years_nr['jahre'];
}

$queryFirstyear = 'select REPLACE(tag, "/", ".") as datum, substr(tag,8,4)as jahr, substr(tag,1,2)as tag, CASE substr(tag,4,3) When \'Jan\' Then \'01\'  When \'Feb\' Then \'02\' When \'Mar\' Then \'03\' When \'Apr\' Then \'04\' When \'May\' Then \'05\' When \'Jun\' Then \'06\' When \'Jul\' Then \'07\' When \'Aug\' Then \'08\' When \'Seb\' Then \'09\' When \'Oct\' Then \'10\' When \'Nov\' Then \'11\' When \'Dec\' Then \'12\' End as monat, stunde, anzahl from (select tag, stunde, ip, count(stunde) as anzahl from (select  substr(zeitpunkt,2,11) as tag, substr(zeitpunkt,14,2)as stunde, ip FROM access_log group by ip ORDER By tag) as tab32 group by tag, stunde order by tag) as tabl group by jahr order by jahr limit 1';
$firstYear = select($queryFirstyear);
foreach($firstYear as $arrFirstYear)
{
		$startjahr = $arrFirstYear['jahr'];
}


$content = '<statistik>';
fwrite($handle, $content);

$endjahr = $startjahr + $jahre;

for ($jahr = $startjahr ; $jahr <= $endjahr; $jahr++) //Anzahl der vorhanden jahre ermitteln //Anzahl der vorhanden jahre ermitteln //Anzahl der vorhanden jahre ermitteln //Anzahl der vorhanden jahre ermitteln //Anzahl der vorhanden jahre ermitteln
{
		$content = '<year n="'.$jahr.'" >';
		fwrite($handle, $content);
		
		for($monat = 1; $monat <= 12; $monat++)
		{
				$name = getMonth($monat);
				$content = '<m n="'.$name.'">';
				fwrite($handle, $content);
						$monatstage = getMonthdays($monat, $jahr);
						for($tag = 1; $tag <= $monatstage; $tag++)
						{
							$tag = unformat($tag);
							$monat = unformat($monat);
							$datum = $tag.'-'.$monat.'-'.$jahr;
							$name = getDay($datum);
							$datum = $tag.'.'.$monat.'.'.$jahr;
							$content = '<d n="'.$name.'">';
							fwrite($handle, $content);
							
							for($stunde = 1; $stunde <= 24; $stunde++)
							{
									if (isset($arr_db[$jahr.$monat.$tag.$stunde]))
									{
										$zugriffe = $arr_db[$jahr.$monat.$tag.$stunde];
									}
									else
									{
										$zugriffe = 0;
									}
									
									$content = '<h k="'.$zugriffe.'" />';
									fwrite($handle, $content);
							}
							$content = '</d>';
							fwrite($handle, $content);
						}
				$content = '</m>';
				fwrite($handle, $content);
		}			
		$content = '</year>';
		fwrite($handle, $content);
}

$content = '</statistik>';
fwrite($handle, $content);
    fclose($handle);
    print 'test';
?>

Hat jemand eine Idee wiso die Dateu so groß wird? Ich brauch die Daten aber im Flash! Was kann man da tun?

lg Joe
 
Was zeigt denn deine xml Datei an, wenn du sie öffnest? bzw. Wieviele Zeilen hast du denn?
 
Wieso so umständlich arbeiten, wenn es schon länger bequeme XML Reader gibt.

Unter PHP gibt es z.B.

PHP4: DOM XML Funktionen
PHP5: DOM Funktionen
PHP5: SimpleXML Funktionen
PHP5: XMLReader Funktionen (erst ab PHP 5.1.0

Damit sollte es bequemer gehen.

Diese verschachtelten Schleifen und ebenfalls der permanente Aufruf von fwrite sollte ebenfalls ziemlich resourcenfressend sein.
Performanter sollte da die Zuweisung in einen großen String (oder einen Array und diesen dann per [phpf]implode[/phpf] bearbeiten) sein und diesen dann in die Datei zu schreiben.
 
Zurück