Hvorfor æder mit php script memory?

Hej,
Jeg har et problem med at mit PHP script æder vildt meget memory på min apache server.
Jeg har installeret Xampp 5.6.15 med standardindstillinger.
Når jeg kører mit scripts i browseren (holder F5 nede for at siden refreshes en masse gange) kan jeg se i Windows Task Manager at memory forbruget for processen "Apache HTTP Server (32 bit)" stiger og stiger fra ca. 13,1MB til den begynder at sløve ned når den når omkring 140MB, men den stiger stadig.
En kunde der har kørt med scriptet en uges tid, hvor scriptet bliver kørt hvert 5 min ca., havde et forbrug på ovennævnte process i Task Manageren på ca. 450MB. Og det tog ca. 1 min i browseren at køre scriptet..
Det er ikke et særlig avanceret script så forstår ikke hvad der er galt..
Kan i hjælpe?
Scriptet finder og læser en tekst på en hjemmeside hvorefter den laver det om til et RSS-feed.
Scriptet ser sådan her ud:
<?php
// ====
// Parse html start
// ====
# Use the Curl extension to query Google and get back a page of results
$url = "http://www.laesoe-line.dk/aktuelsejlads";
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
$url = null;
unset($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$timeout = null;
unset($timeout);
$html = curl_exec($ch);
curl_close($ch);
$ch = null;
unset($ch);
# Create a DOM parser object
$dom = new DOMDocument();
# Parse the HTML from Google.
# The @ before the method call suppresses any warnings that
# loadHTML might throw because of invalid HTML in the page.
@$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
//@$dom->loadHTML($html);
$html = null;
unset($html);
$scanHtml = false;
$currentSailing = "Aktuel sejlads: ";
# Iterate over all the <a> tags
foreach($dom->getElementsByTagName('div') as $link) {
# Show the <div id>
if ($link->getAttribute('id') == "MainContent") {
$scanHtml = true;
}
if ($scanHtml) {
if ($link->getAttribute('class') == "Description") {
$currentSailing = $currentSailing . $link->nodeValue . " ";
}
}
if ($link->getAttribute('class') == "Clears") {
$scanHtml = false;
break;
}
}
$link = null;
unset($link);
$dom = null;
unset($dom);
$scanHtml = null;
unset($scanHtml);
// ====
// Parse html end
// ====
// ====
// RSS feed start
// ====
header("Content-Type: application/rss+xml; charset=UTF-8");
$rssfeed = '<?xml version="1.0" encoding="UTF-8"?>';
$rssfeed .= '<rss version="2.0">';
$rssfeed .= '<channel>';
$rssfeed .= '<title>Fra Læsø Aktuel sejlads</title>';
$rssfeed .= '<link></link>';
$rssfeed .= '<description></description>';
$rssfeed .= '<language>da-dk</language>';
$rssfeed .= '<copyright></copyright>';
/** Get current info **/
$rssfeed .= '<item>';
$rssfeed .= '<title>' . $currentSailing . '</title>';
$currentSailing = null;
unset($currentSailing);
$rssfeed .= '</item>';
$rssfeed .= '</channel>';
$rssfeed .= '</rss>';
echo $rssfeed;
$rssfeed = null;
unset($rssfeed);
// ====
// RSS feed end
// ====
?>
Venlig hilsen Birk

Som
nævner, hvis din antivirus-scanner står og scanner filerne, kan dette øge ressource-forbruget. @simonpedersen
Ydermere kan hastigheden også påvirkes hvis den URL i henter fra, er langsom om at svare, hvis der kommer mange requests på jeres website, initiere det mange http-requests imod http://www.laesoe-line.dk/aktuelsejlads hvilket nemt kan være skyld load-tiderne.
Mit løsningsforslag ville være at implementere noget cache, så du gemmer indholdet af ovenstående URL lokalt i nogle minutter ad gangen. Det kan gøres rimeligt nemt, jeg har bygget et simpelt lille proof-of-concept eksempel til dig her:
<?php
$cache_file = '/var/www/mincachefil'; // Sti til cache fil
$minutter = 5; // Antal minutter en cache skal gemmes lokales
$url = 'http://www.laesoe-line.dk/aktuelsejlads';
if (file_exists($cache_file) && (filemtime($cache_file) > (time() - 60 * $minutter ))) {
// Cache fil er mindre end 5 min. gammel
// Hent cache-fil og vis dette:
$rssfeed = file_get_contents($cache_file);
} else {
// Vores cache er out-of-date, hent data fra remote server
// og gem vores cache til næste gang
$rssfeed = file_get_contents($url);
file_put_contents($cache_file, $rssfeed, LOCK_EX);
}
Husk at $cache_file skal pege på en fil som er placeret på samme computer/server hvor PHP-scriptet eksekveres og at PHP skal have både læse og skriverettigheder til filen.
Med venlige hilsner Daniel Bahl (@db)
CEO – v5.dk ApS

Det kunne godt være en god ide..
Men det er kun meningen at scriptet køreres hvert 5 minut..
Hvis det er fordi det bliver kørt for ofte kunne jeg vel bare køre det hver time eller sådan noget i stedet for.
Jeg har lige set på serveren hvor scriptet kører og apache processen brugte faktisk ikke særlig meget memory.. ca. 19MB og det har kørt en uge nu..
Så jeg tror slet ikke at det er mit script som laver ballade...
Undskyld min uvidenhed om php jeg tror det hele virker som det skal.
Mvh

Ah, ja - hvis det ikke kører mere end hvert 5 minut, så er der ingen problemer med cache. Det var mere hvis du havde mange hits så scriptet blev kørt flere gange i sekundet eller "holdte F5 nede" som du skrev, så er cache en god idé.
God at du fik løst problemet :-) Ha' en god dag.
Med venlige hilsner Daniel Bahl (@db)
CEO – v5.dk ApS