php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 17.07.2010, 19:48  
Neuer Benutzer
 
Registriert seit: 17.07.2010
Beiträge: 5
PHP-Kenntnisse:
Fortgeschritten
arthurdent befindet sich auf einem aufstrebenden Ast
Standard Imagick Bildverarbeitung Skript (Memory Leak ?)

Hallo zusammen,

ich bin neu hier und habe ein Problem mit einem PHP-Skript. Es handelt sich um ein Skript für eine Community-Seite, welches Bilder verkleinern und drehen soll. Für die Bildverarbeitung verwende ich Imagick.

Bei Lasttests mit JMeter habe ich festgestellt, dass der Arbeitsspeicher (24GB) des Apache-Servers nach einiger Zeit voll läuft. Offenbar steht irgendetwas im Arbeitsspeicher weiter zur Verfügung nachdem das Skript schon beendet ist.

Ich benutze Imagick zum ersten Mal und weiß nicht ob dabei Memory Leaks entstehen können. Eventuell liegt es auch am Testplan und die Sessions werden zu lange im Arbeitsspeicher gehalten.

Testskript:

Code:
Threadgroup
->Cookie Manager
->Bilddatei wird hochgeladen
->Bilddatei wird verkleinert und gedreht
Für alle Testverbindungen wird keepalive verwendet (bin nicht sicher ob das wichtig ist).

PHP-Skript:

PHP-Code:
$db = @ mysql_connect ("localhost""root""test")
or die (
'Konnte keine Verbindung zur Datenbank herstellen');
$db_select = @ mysql_select_db ("test");

@
session_start();

//Max. Abma¤e laden        
$imagick = new Imagick($file);
                
//Imagedaten holen
$size $imagick->getImageGeometry(); 
$width intval($size['width']);
$height intval($size['height']);
        
//Image auf maximale Gr?¤e strecken/verkleinern
$rheight $rwidth $height $width;
                                    
//Resampelte Version erstellen
$newname $path.$id."_0.".$ext;
$smaller $path.$id."_0_sm.".$ext;
$imagick->thumbnailImage($rwidth$rheight);
$imagick->writeImage($newname);
$imagick->destroy();
            
//Thumbnail erstellen
$tmbname $path.$id.'_tmb.jpg';
$tmb = new Imagick();
$tmb->readImage($newname);
$rotateimg $tmb->clone();
$tmb->stripImage();
$tmbwidth $width 131 $height;
$tmb->thumbnailImage($tmbwidth131);
$tmb->writeImage($tmbname);
$tmb->destroy();

//Gedrehte Versionen erstellen
$rotateimg->rotateImage(new ImagickPixel(), 270);
$rotateimg->writeImage($path.$id."_90.".$ext);
$rotateimg->rotateImage(new ImagickPixel(), 270);
$rotateimg->writeImage($path.$id."_180.".$ext);
$rotateimg->rotateImage(new ImagickPixel(), 270);
$rotateimg->writeImage($path.$id."_270.".$ext);
$rotateimg->destroy();
        
$_SESSION['own'][] = array($id$width$height$rwidth$rheight);
        
unset(
$imagick$thumbnail$rotateimg$size);
mysql_close($db);
exit(); 
Ich wäre für Eure Hilfe echt dankbar. Bin nämlich mittlerweile mit meinem Latein am Ende.

Vielen Dank im Voraus.

Gruß Christian
arthurdent ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 17.07.2010, 21:08  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

Infos über Betriebsystem, Versionen (php, imagemagick, weitere aktive extensions [phpinfo ?], ..., selbst kompiliert / PECL / paket aus der distri ) wäre interessant.

Dann schmeiss doch mal wirklich alles raus was du nicht brauchst, mysql, session, dann kannst du das komplett ausschließen.

Dann mal schauen was apache auf seiner übersicht-seite an "offenen/aktiven" verbindungen sagt.

Eventuell mal einen blick mit http://forge.bearstech.com/trac/wiki/PhpTop wagen um mal zu sehen was passiert.
robo47 ist offline   Mit Zitat antworten
Alt 17.07.2010, 21:47  
Neuer Benutzer
 
Registriert seit: 17.07.2010
Beiträge: 5
PHP-Kenntnisse:
Fortgeschritten
arthurdent befindet sich auf einem aufstrebenden Ast
Standard

Danke für die Antwort. Auf Top kann ich im Moment nicht zugreifen.
Hab hier zuhause keinen root-Zugang. Testen kann ich erst Montag wieder.
Hier aber schon einmal die phpinfo:

http://www.file-upload.net/download-...info.html.html

Geändert von arthurdent (17.07.2010 um 21:52 Uhr).
arthurdent ist offline   Mit Zitat antworten
Alt 18.07.2010, 00:14  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

Was hast du denn bisher getan/getestet ?

Sind ja alles scheinbar out-of-the-box debian lenny pakete, mal geschaut ob es bei php, imagemagick, pecl oder debian lenny für die pakete/versionen irgendwelche eventuell bugreports gibt (eventuell auch schon geschlossene die aber in deiner Version noch nicht geschlossen sind ?)

Ansonsten am besten mal händisch ein komplett aktuelles set von php + imagemagick + pecl imagemagick-extension kompilieren und in nem vhost via cgi das php testen.
robo47 ist offline   Mit Zitat antworten
Alt 18.07.2010, 00:27  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Ich wiederhole noch mal robos implizit gestellte Frage, wofür baust du im gezeigten Code die Datenbankverbindung auf, und was schreibst du in die Session?

Werden die erzeugten Bildversionen gecached, oder veranstaltest du das bei jedem Abfruf auf's neue?

Und mit was für Nutzer-/Zugriffszahlen hast du den Lasttest gemacht?
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 18.07.2010, 01:02  
Erfahrener Benutzer
 
Registriert seit: 17.07.2009
Beiträge: 223
PHP-Kenntnisse:
Fortgeschritten
Tiberius zeigte ein beschämendes Verhalten in der Vergangenheit
Tiberius eine Nachricht über ICQ schicken
Standard

nach wievielen MaxRequestsPerChild werden denn die Apache Prozesse gekillt?
Tiberius ist offline   Mit Zitat antworten
Alt 18.07.2010, 10:21  
Neuer Benutzer
 
Registriert seit: 17.07.2010
Beiträge: 5
PHP-Kenntnisse:
Fortgeschritten
arthurdent befindet sich auf einem aufstrebenden Ast
Standard

@ChrisB:
In der Datenbank habe ich Flags für die Verarbeitung gespeichert. Die Verarbeitung kann nur durchgeführt werden, wenn eine der Flags positiv ist, so kann kann ich die Anzahl der gleichzeitigen Verarbeitungen kontrollieren bzw. eine Warteschleife aufbauen. Ich habe den Code hier aufs wesentliche reduziert, damit es etwas übersichtlicher ist.

Aus der Session wird dem User eine Gallerie seiner hochgeladenen Bilder erstellt. Gespeichert werden Bild-ID, Größe vorher, Größe nachher.

Die erzeugten Bilder werden auf der Festplatte gespeichert. Das Skript wird nur bei neuen Uploads ausgeführt.

Der Lasttest wurde mit 50 Usern und 100 Wiederholungen durchgeführt. Think-Times hatte ich nicht eingefügt.

@robo47
Für die installierten Pakete konnte ich keine relevanten Bugs finden. Bisher habe ich das Problem auf diese Stelle im Code reduziert. Auf dem Server laufen ebenfalls Crons mit Bildverarbeitung, die im Grunde genommen nichts großartig anderes machen. Hier kommt es jedoch nicht zu Problemen.

@Tiberius
Das weiß ich nicht genau, müsste ich nachgucken.
arthurdent ist offline   Mit Zitat antworten
Alt 18.07.2010, 11:01  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

Zitat:
Zitat von arthurdent Beitrag anzeigen

@robo47
Für die installierten Pakete konnte ich keine relevanten Bugs finden. Bisher habe ich das Problem auf diese Stelle im Code reduziert. Auf dem Server laufen ebenfalls Crons mit Bildverarbeitung, die im Grunde genommen nichts großartig anderes machen. Hier kommt es jedoch nicht zu Problemen.
Der Unterschied ist wohl schon dass anstatt mod_php hier php-cli ( /usr/bin/php ) zum einsatz komt, bastel mal so ein script und lass das XXXX mal in einer schleife laufen und schau ob es via cli auch passiert, dann versuch es mit der php-cgi-binary (sollte unter debian /usr/bin/php-cgi sein) in der shell und danach bau nen vhost und nutze dort php-cgi (via php-info überprüfen ob es klappt) und schauen ob das problem auch auftritt.
robo47 ist offline   Mit Zitat antworten
Alt 18.07.2010, 13:00  
Neuer Benutzer
 
Registriert seit: 17.07.2010
Beiträge: 5
PHP-Kenntnisse:
Fortgeschritten
arthurdent befindet sich auf einem aufstrebenden Ast
Standard

Danke, ich werde morgen dann noch einmal Tests laufen lassen und dann posten, ob und wie das Problem behoben wurde.
arthurdent ist offline   Mit Zitat antworten
Alt 20.07.2010, 19:50  
Neuer Benutzer
 
Registriert seit: 17.07.2010
Beiträge: 5
PHP-Kenntnisse:
Fortgeschritten
arthurdent befindet sich auf einem aufstrebenden Ast
Standard

Ergebnis:

Das Skript ist so wie es ist völlig in Ordnung. Das Problem war ein anderes. Ich hatte die Lasttests zur Überprüfung nie bis zum Ende laufen lassen, da die Arbeitsspeicher-Nutzung immer weiter angestiegen ist. Das ist aber bei Linux-Servern ganz normal, da die Server den Speicher immer erst bei Bedarf wieder freigeben. Manchmal fängt man an Gespenster zu sehen. Vielen Dank für Eure Hilfe. Thema kann geschlossen werden.
arthurdent ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Kann man mit einem eingebundenem PHP Skript auf den Text einer HTML-Seite zugreifen? HottiWF PHP Tipps 2010 10 18.03.2010 18:20
Skript einbau - Sicherheit Rubio PHP Tipps 2010 4 13.02.2010 19:37
[Erledigt] Imagick - farbe eines Pixels ändern charlie_harper PHP Tipps 2009 7 03.11.2009 21:09
perl skript aus php skript aufrufen axmuellser PHP Tipps 2009 1 16.04.2009 17:59
[Erledigt] Imagick (PECL) Bild ausgeben Schlumpf PHP Tipps 2008 2 29.10.2008 13:57
Skript auf einem anderen Server! aha_01 PHP Tipps 2008 3 05.12.2007 09:02
Startup Skript m_haussner Datenbanken 3 10.10.2007 20:56
Diverses aus meinem Apache Logs robo47 Server, Hosting und Workstations 5 25.05.2007 22:45
ein Skript startet ein zweites... ajo_silent PHP-Fortgeschrittene 8 03.05.2006 13:42
Skript "tarnen"? Off-Topic Diskussionen 17 07.08.2005 19:42
Ein php skript aus einem anderen skript heraus aufrufen PHP Tipps 2005-2 8 06.08.2005 20:23
Javascript - CountUP Skript zählt falsch.. Chr!s HTML, Usability und Barrierefreiheit 0 28.03.2005 14:32
[Erledigt] php skript ruft anderes php skript auf PHP-Fortgeschrittene 7 09.01.2005 23:06
SKRIPT GESUCHT - Werbung auf einer site anzeigen Beitragsarchiv 4 29.08.2004 14:07
[Erledigt] Php skript upload problem! PHP Tipps 2004 2 30.06.2004 00:06

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
new imagick, bildverarbeitung skript, imagick thumbnail erstellen, bildverarbeitung php, imagick writeimage, imagick rotateimage php, http://www.php.de/php-fortgeschrittene/69815-imagick-bildverarbeitung-skript-memory-leak.html, imagemagick php script, imagick memory leak, php imagick memory, imagick php library (pecl paket), php memory bilder drehen, imagick php leak cli, imagick php memory leak cli, imagick php memory leak, image patch bildverarbeitung, imagick memory#, bildverarbeitung bild drehen, imagick writeimage path, bilder verkleinern und memory herstellen

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:29 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum