Script erzeugt irgendwann Serverabsturz
Klaus
- php
0 Vinzenz Mai0 Klaus
Hallo,
nach langem Suchen mit Try&Error hab ich es endlich geschafft, das Script allen Übels zu ermitteln.
Hintergrund waren tägliche Abstürze vom Apache mit der einzigen Fehlermeldung im Error.log:
Parent: child process exited with status 3221225477 -- Restarting.
Weder im Ereignislog noch sonstwo ein Hinweis auf ein Script oder sonstwas.
Lange Rede kurzer Sinn, ich hab das Script nun lokalisieren können, weiß aber nicht, ob und wo ich am Script etwas ändern könnte, damit der Apache nicht abraucht.
Der Apache 2.2.4 läuft auf nem Win2000 mit Disabled use of AcceptEx() WinSock2 API. PHP Version ist 5.2.1
Das Script wird alle 60 Sekunden aufgerufen, aber wenn's nur alle 5 Minuten aufgerufen würde, könnte ich auch mit leben.
Ich weiß nicht, ob es ein PHP-Bug ist, der Speicher nicht richtig freigibt, oder ein Problem mit der COM-Schnittstelle. Vielleicht ist es auch ein Notes-Problem?
Macht natürlich Sinn, wenn ich das Script mal hier poste...:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>SpamSentinel Statistik</title>
<?
echo "<meta http-equiv="refresh" content="60; URL=spamstat.php">";
?>
<style type="text/css">
td {font-size:14pt;}
td.werte {color:yellow;font-size:16pt;}
</style>
</head>
<body>
<?
$session = new COM( "Lotus.NotesSession" );
$session->Initialize('kennwort');
//echo "Current user: " . $session->UserName . "<br><br>\n\n";
$db = $session->getDatabase( "10.1.1.1", "SpamSentinel\SpamSentinelAdmin.nsf", false );
if (!$db) {
echo "Konnte Datenbank nicht öffnen!!!<br>";
exit;
}
$view = $db->getView( "Spam Statistics" );
$entry = $view->GetFirstDocument();
$aktdatum = date("d.m.Y");
$aktjahr = date("Y");
$aktmonat = date("m");
$nmonat = $aktmonat * 1;
$amonat = array("Dummy","Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
$textmonat = $amonat[$nmonat];
$j_inbound = 0;
$j_blocked = 0;
$j_prozent = 0;
$m_inbound = 0;
$m_blocked = 0;
$m_prozent = 0;
$d_inbound = 0;
$d_blocked = 0;
$d_prozent = 0;
while (is_object($entry)) {
$field = $entry->GetFirstItem( "LogDate" );
$created = $field->text;
$datum = substr($created,0,10);
$jahr = substr($created,6,4);
$monat = substr($created,3,2);
if ($jahr == $aktjahr) {
$field = $entry->GetFirstItem( "InboundMessages" );
$allemails = $field->text;
$field = $entry->GetFirstItem( "BlockedSpamCop" );
$feld1 = $field->text;
$field = $entry->GetFirstItem( "BlockedSpamnet" );
$feld2 = $field->text;
$field = $entry->GetFirstItem( "BlockedDomains" );
$feld3 = $field->text;
$field = $entry->GetFirstItem( "BlockedWords" );
$feld4 = $field->text;
$field = $entry->GetFirstItem( "BlockedSubjects" );
$feld5 = $field->text;
$field = $entry->GetFirstItem( "BlockedRecipients" );
$feld6 = $field->text;
$field = $entry->GetFirstItem( "BlockedInvalidRecipients" );
$feld7 = $field->text;
$geblockt = $feld1+$feld2+$feld3+$feld4+$feld5+$feld6+$feld7;
$j_inbound += $allemails;
$j_blocked += $geblockt;
if ($monat == $aktmonat) {
$m_inbound += $allemails;
$m_blocked += $geblockt;
}
if ($datum == $aktdatum) {
$d_inbound = $allemails;
$d_blocked = $geblockt;
}
}
$entry = $view->getNextDocument($entry);
}
$session = null;
unset($session);
if ($d_inbound > 0) {
$d_prozent = round($d_blocked * 100 / $d_inbound, 2);
}
if ($m_inbound > 0) {
$m_prozent = round($m_blocked * 100 / $m_inbound, 2);
}
if ($j_inbound > 0) {
$j_prozent = round($j_blocked * 100 / $j_inbound, 2);
}
$d_inbound = number_format($d_inbound,0,"",".");
$d_blocked = number_format($d_blocked,0,"",".");
$m_inbound = number_format($m_inbound,0,"",".");
$m_blocked = number_format($m_blocked,0,"",".");
$j_inbound = number_format($j_inbound,0,"",".");
$j_blocked = number_format($j_blocked,0,"",".");
?>
<h2 align="center">SpamSentinel Statistik</h2>
<p align="center">Zur Zeit deaktiviert</p>
<table border="0" align="center" cellspacing="5" cellspacing="5">
<tr><td></td><td align="right">empfangene Mails</td><td align="right">geblockte Mails</td><td align="right">Anteil in %</td></tr>
<tr><td>Heute</td><td class="werte" align="right"><?=$d_inbound;?></td><td class="werte" align="right"><?=$d_blocked;?></td><td class="werte" align="right"><?=$d_prozent;?>%</td></tr>
<tr><td><?=$textmonat;?></td><td class="werte" align="right"><?=$m_inbound;?></td><td class="werte" align="right"><?=$m_blocked;?></td><td class="werte" align="right"><?=$m_prozent;?>%</td></tr>
<tr><td><?=$aktjahr;?></td><td class="werte" align="right"><?=$j_inbound;?></td><td class="werte" align="right"><?=$j_blocked;?></td><td class="werte" align="right"><?=$j_prozent;?>%</td></tr>
</table>
</body>
</html>
Hallo Klaus,
nach langem Suchen mit Try&Error hab ich es endlich geschafft, das Script allen Übels zu ermitteln.
$session = new COM( "Lotus.NotesSession" );
$session->Initialize('kennwort');
[...]
sehr mutig: Wie wäre es damit zu überprüfen, ob das COM-Objekt wirklich erstellt wird, statt munter auf möglicherweise nicht vorhandene Methoden zuzugreifen.
1. Füge Deinem Skript eine angemessene Fehlerbehandlung hinzu.
2. Trenne Anwendungslogik und Ausgabe.
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
$session = new COM( "Lotus.NotesSession" );
$session->Initialize('kennwort');
sehr mutig: Wie wäre es damit zu überprüfen, ob das COM-Objekt wirklich erstellt wird, statt munter auf möglicherweise nicht vorhandene Methoden zuzugreifen.
- Füge Deinem Skript eine angemessene Fehlerbehandlung hinzu.
- Trenne Anwendungslogik und Ausgabe.
Gut... ich weiß, sauber ist es, wenn ich eine Fehlerbehandlung einbaue, die überprüft, ob das Objekt erzeugt wurde. Das hab ich bisher nicht.
Da es auf dem alten Server nahezu 3 Monate anstandlos gelaufen ist und mit dem Wechsel auf den neuen Server täglich den Apache mehrfach abstürzen lässt, sollte es doch (hoffentlich) nicht daran liegen, dass das mal ein Objekt nicht erzeugt wurde. Müsste dann schlicht unsauber einen Error rauswerfen und gut ist, oder?
Punkt 2 verstehe ich leider nicht ganz, ich dachte, die Anwendungslogik ist von der Ausgabe getrennt, denn zunächst sammle ich erst alle Daten und dann gebe ich das Endresultat aus, oder verstehe ich da etwas komplett falsch?
Klaus