2012-04-05 7 views
-1

Ich habe ein einfaches PHP-Skript, das als Cron-Job ausgeführt wird. Es dient dazu, die Kopfzeilen einer Webseite zu überprüfen und zu melden, wenn sich verschiedene Elemente geändert haben.Einfaches PHP-Skript mit 290 MB Speicher - warum?

Ich habe verschiedene Versionen dieses Skripts in der Vergangenheit verwendet und es hat immer gut funktioniert, aber jetzt verwende ich es auf einem Server, der Warnungen per E-Mail sendet, wenn Skripte mehr als 100 MB Speicher verwenden (außer Whitelist-Skripte natürlich), und überraschenderweise meldet mein Header-Checking-Skript gelegentlich große Mengen an Speicherverbrauch mindestens ein paar Mal pro Tag.

Das Skript läuft alle 5 Minuten, und das Speicherproblem tritt 5 oder 6 Mal am Tag auf - es scheint sich selbst zu lösen, aber ich möchte es davon abhalten, diese große Menge an Speicher gelegentlich für eine solche zu verwenden einfacher Job.

Die Warnung E-Mails für dieses einfache Skript Nutzung von rund 290MB berichten:

<?php 

    $message = ""; 

    function array_find ($needle, $haystack, $search_keys = false) { 
    if (!is_array($haystack)) return false; 
    foreach ($haystack as $key => $value) { 
     $what = ($search_keys) ? $key : $value; 
     if (strpos($what, $needle) !== false) return $key; 
    } 
    return false; 
    } 

    $url = 'http://www.EXAMPLE.com/'; 

    $haystack = get_headers($url); 
    $needle = "PHPSESSID"; 

    if (!((array_find($needle, $haystack)) != '')) { 
    $message .= "No PHPSESSID in headers"; 
    } 

    if (!(strpos($haystack[0], '200'))) { 
    $message .= "No 200 OK"; 
    } 

    if ($message != '') { 
    mail("[email protected]", "Headers Changed", $message, "From: Example <[email protected]>"); 
    } 

    exit; 

?> 

Der Server ist ein VPS CENTOS 5.8, Apache 2.2.16, PHP 5.3.3

Vielen Dank für jeden Lauf Hilfe.

+1

Möchten Sie Ihren Code ein bisschen mehr lesbar mit Zeilenumbrüchen betrachten verfolgen zu machen? Ich bin sicher, dass eine Funktion nicht in einer einzigen Zeile ausgeführt werden muss. Es hilft wahrscheinlich bei Leuten, die sich die Zeit nehmen möchten, um Ihren Code anzusehen. – Nanne

+0

'if (! ((Array_find ($ nadel, $ haystack))! = '')) {'? "Ja wirklich?" Warum nicht nur 'if (array_find ($ nadel, $ haystack) === FALSCH)'? – DaveRandom

Antwort

2

Vielleicht bekommen Sie nur 5 oder 6 Mal am Tag große Heuhaufen?

PHP ist ein speicherhungriger Biest. Das ist Fakt. Bei relativ großen Datenfeldern kann der Speicherverbrauch mehr als nur spürbar werden.

Es gibt einen interessanten Artikel dazu, genannt "How big are PHP arrays (and values)? (Hint: BIG!)" Ein sehr zu empfehlen!

1

Vielleicht versuchen, memory_get_usage() nach jedem größeren Teil zu tun. Das sollte dir helfen, es einzugrenzen.

1

versuchen, eine Datei mit nur get_headers ($ url) und memory_get_usage machen() und die Ergebnisse sehen ...

<?php 
$url = "http://www.example.com"; 
get_headers($url); 
echo memory_get_usage(); 
?> 

Nach meiner Erfahrung get_headers() auf PHP> = 5 viel Speicher frisst. Sie können den Artikel überprüfen „get_headers() function results in memory leak

PS: Sie können auch xDebug verwenden, um die Speichernutzung des Skripts

Verwandte Themen