Hiho!
Ich habe meine Raspberrys ganz neu, es sind beides B Modelle. Der eine läuft mit Openelec am TV. Am anderen versuche ich mit PHP und Mysql zu programmieren. Mehrere Projekte auf Webservern habe ich schon am laufen.
Doch auf dem Raspberry PI will es nicht so wie ich. Mein Script holt sich XML Scripte (bis zu 512) nacheinander von einem Server. Das ist ein Anbieter für Fußballdaten, dort zahle ich auch Geld, daher kann ich diese Links nicht post. Nun versuche ich die XML Daten auszulesen, doch mein Script bricht nach einiger Zeit immer ab weil der Arbeitsspeicher voll läuft. Irgendwo scheine ich etwas nicht frei zugeben. Er soll bei jedem durchlauf der FOR Schleife wieder bei Null anfangen und alle Variablen leer sein, damit kein Speicher unnötig belegt wird.
Hier mal mein Script vielleicht sieht ja jemand wo ich etwas ändern kann.
Daten des Servers:
Raspbian mit PHP
PHP Version => 5.4.4-14+deb7u5
#!/usr/bin/php -q
<?php
include('zugriff_fussball_db_2.inc.php');
$sql = "SELECT goalserve, saison, id_liga, id_land FROM v_liga_link;";
$db = verbindungaufbauen(true);
$statement = $db->prepare($sql);
$statement->execute();
while ($result = $statement->fetchObject()) {
$liga['id_liga'][] = $result->id_liga;
$liga['id_land'][] = $result->id_land;
$liga['saison'][] = $result->saison;
$liga['saison_xml'][] = str_replace("-", "/", $result->saison);
$liga['xml_link'][] = $result->goalserve;
}
while ($statement->nextRowSet());
$statement->closeCursor();
$db = null;
$array = array();
$rueck = array();
//Auslesen der Daten aus der Datenbank
for ($b = 0; $b < count($liga['xml_link']); $b++) {
unset($xml_file);
unset($rueck);
$rueck=array();
$xml_file = simplexml_load_file($liga['xml_link'][$b]);
$saison = $liga['saison'][$b];
$id_liga = $liga['id_liga'][$b];
$id_land = $liga['id_land'][$b];
$saison_xml = $liga['saison_xml'][$b];
$fehler = 0;
$ok = 0;
//prüfen ob richtige Saison in DB Eingetragen
if ($xml_file->tournament->attributes()->season == $saison_xml) {
//Spiele für eine Liga holen
if (isset($xml_file->tournament->week)) {
$xmltag = $xml_file->tournament->week;
}
//Spiele für einen PokalWettbewerb holen
if (isset($xml_file->tournament->stage)) {
$xmltag = $xml_file->tournament->stage;
}
//Runden durchlaufen
for ($i = 0; $i < count($xmltag); $i++) {
//Begegnung durchlaufen wenn KO Spiel
for ($a = 0; $a < count($xmltag[$i]->aggregate); $a++) {
$erg = spiele_eintragen($xmltag[$i]->aggregate[$a]->match, $xmltag[$i]->attributes()->name, $db, $saison, $id_liga, $id_land);
if (!is_null($erg))
$rueck = $erg;
}
//Begegnung durchlaufen wenn Gruppenphase
for ($a = 0; $a < count($xmltag[$i]->week); $a++) {
$erg = spiele_eintragen($xmltag[$i]->week[$a]->match, ($xmltag[$i]->week[$a]->attributes()->number . ". " . $xmltag[$i]->attributes()->name), $db, $saison, $id_liga, $id_land);
if (!is_null($erg))
$rueck = $erg;
}
//Begegnungen in normalen Ligen durchlaufen
if ($xmltag[$i]->attributes()->number != "") {
$spieltag = $xmltag[$i]->attributes()->number;
} else {
$spieltag = $xmltag[$i]->attributes()->name;
}
$erg = spiele_eintragen($xmltag[$i]->match, $spieltag, $db, $saison, $id_liga, $id_land);
if (!is_null($erg))
$rueck =$erg;
}// Runden Ende
}
$db = verbindungaufbauen(true);
$call_mannschafthinzufuegen = $db->prepare("call p_mannschafthinzufuegen(:heim_team,:land,:heim_team_id);");
foreach ($rueck as $value) {
$ret = $call_mannschafthinzufuegen->execute($value);
if ($ret === TRUE) {
$ok++;
} else {
$fehler++;
$sql_fehler[] = $call_mannschafthinzufuegen->errorInfo();
}
}
$db = null;
}//Auslesen aus der Datenbank Ende
//Ausgabe der Ergebnisse für eine Liga
echo date("d.m.Y", time()) . " - " . date("H:i", time()) . " Fehler:" . $fehler . " OK:" . $ok . "\n";
if ($fehler > 0) {
var_dump($sql_fehler);
}
function spiele_eintragen($xml_spiel, $spieltag, $db, $saison, $liga, $land) {
global $array; //Mit dem Array prüfen ob das Team schon gefunden wurde dann nicht erneut das SQL aufbauen um DB Abfrage zu vermeiden.
for ($b = 0; $b < count($xml_spiel); $b++) {
$heim_team = $xml_spiel[$b]->localteam->attributes()->name;
$gast_team = $xml_spiel[$b]->visitorteam->attributes()->name;
$heim_team_id = (int) $xml_spiel[$b]->localteam->attributes()->id;
$gast_team_id = (int) $xml_spiel[$b]->visitorteam->attributes()->id;
if ($heim_team != "" AND $heim_team_id != "" AND !array_key_exists($heim_team_id, $array)) {
$array[$heim_team_id] = $heim_team;
$sql_mannschaften[] = array("heim_team" => $heim_team, "land" => $land, "heim_team_id" => $heim_team_id);
}
if ($gast_team != "" AND $gast_team_id != "" AND !array_key_exists($gast_team_id, $array)) {
$array[$gast_team_id] = $gast_team;
$sql_mannschaften[] = array("heim_team" => $gast_team, "land" => $land, "heim_team_id" => $gast_team_id);
}
}
if (isset($sql_mannschaften))
return $sql_mannschaften;
}
Alles anzeigen
Noch ein Top Auszug wo man das voll laufen sieht, das ist der Stand kurz vor dem abstürzen des Scripts
top - 14:44:06 up 1:21, 2 users, load average: 0,35, 0,26, 0,14
Tasks: 70 total, 2 running, 68 sleeping, 0 stopped, 0 zombie
%Cpu(s): 14,9 us, 2,9 sy, 0,0 ni, 74,0 id, 5,2 wa, 0,0 hi, 2,9 si, 0,0 st
KiB Mem: 448736 total, 440428 used, 8308 free, 13016 buffers
KiB Swap: 102396 total, 0 used, 102396 free, 90952 cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2804 pi 20 0 296m 270m 5144 R 17,4 61,7 1:36.46 db_update_manns