SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

TYPO3 Kochbuch

TYPO3 Kochbuch zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP für Fortgeschrittene und Experten

PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 20.07.2010, 21:07:44
Airwolf89 Airwolf89 ist offline
Anfänger
 
Registriert seit: Jun 2010
Alter: 34
Beiträge: 54
Garbage Collection in PHP

Hallo Leute,

ich hätte da mal eine Frage. Meine ersten tiefergehenden Programmiererfahrungen habe ich mit Java gemacht bevor ich mich nun hauptsächlich mit PHP beschäftige.
Nun habe ich mir mal ein wenig um die Performance bei PHP Gedanken gemacht, da kommt man ja auch zwangsläufig an der Garbage Collection nicht vorbei.
Nun habe ich mich gefragt, kann man in PHP die Garbage Collection auch manuell aufrufen? In Java gibt es ja den befehl System.gc(); Gibt es sowas für PHP auch? Habe ein bisschen gegoogelt aber nichts gefunden.

Weiterhin habe ich mir dann mal Gedanken an einem konkreten Beispiel gemacht.
Mal angenommen ich habe eine Datei index.php welche eine oder mehrere Klassen instanziert, welche dann für sich auch wieder ein paar Klassen instanzieren. Mal angenommen ich rufe dann, z.B. durch einen Link wieder die index.php auf. Was passiert dann mit den Instanzen des vorherigen Durchlaufs? Ich meine, es existieren ja dann so gesehen immer noch Referenzen auf diese Klassen, allerdings kommt man an die ja nicht mehr ran. Werden die vom Garbage Collector entsorgt?

Wenn nicht, was könnte man tun damit diese nicht als Speicherleichen im Speicher vor sich hin vegetieren?

Danke im voraus.
Mit Zitat antworten
  #2  
Alt 20.07.2010, 21:49:19
cortex cortex ist offline
SELFPHP Profi
 
Registriert seit: Apr 2008
Alter: 48
Beiträge: 1.938
AW: Garbage Collection in PHP

mach dir keine gedanken um den php garbage collector; der arbeitet besser, als du / die meisten von uns das manuell hinbekommen würden. der gc wird bei neuen versionen immer wieder überarbeitet / verbessert; du musst dir keine sorgen machen, dass das thema seitens der entwickler stiefmütterlich behandelt würde.

Zitat:
Zitat von Airwolf89 Beitrag anzeigen
Habe ein bisschen gegoogelt aber nichts gefunden.
warum suchst du nicht im php-handbuch?

Garbage Collection

Zitat:
Zitat von Airwolf89 Beitrag anzeigen
Weiterhin habe ich mir dann mal Gedanken an einem konkreten Beispiel gemacht [...]
derart primitive szenarien werden selbstverständlich durch die gc erfasst. php ist darauf zugeschnitten, via http - ein zustandsloses protokoll - zu funktionieren. von java kommend, musst du in dieser hinsicht zuerst einmal umdenken.

cx
Mit Zitat antworten
  #3  
Alt 21.07.2010, 10:47:54
Airwolf89 Airwolf89 ist offline
Anfänger
 
Registriert seit: Jun 2010
Alter: 34
Beiträge: 54
AW: Garbage Collection in PHP

Ok, dann bin ich beruhigt =)

Das mit dem googlen war nur auf den manuellen Aufruf bezogen, weil ich da nichts gefunden habe.

Wenn das mit dem Beipsiel so klappt, wie du sagt, dann ist alles gut.

Vielen Dank.
Mit Zitat antworten
  #4  
Alt 05.09.2010, 03:00:29
rei rei ist offline
Anfänger
 
Registriert seit: Sep 2010
Ort: Sünching bei Straubing - Regenburg
Alter: 51
Beiträge: 17
AW: Garbage Collection in PHP ist so naja

Also so uneingeschränkt zustimmen kann ich da nicht,
dass bei php gc Friede, Freude, Eierkuchen herrscht.

Man siehe nur 5.3 :
http://de.php.net/manual/de/features...iderations.php

Ein anderes Problem mit dem ArbeitsSpeicher kannst Du mit folgenden Script anzeigen lassen:
Es wird ein Array befüllt bis es den Arbeitsspeicher zerlegt;
-einmal ohne FunktionsAufruf, bzw direkt zuweisen,
-einmal mit FunktionsAufruf.

Eigentlich sollte es ja egal sein, aber mit FunktionsAufruf läuft der Speicher deutlich schneller voll und wird auch bei PHP 5.3 nicht korrekt bereinigt.

Das Script wurde getestet mit:
Apache2;
5.2.12 - apache2handler
5.2.12 - cgi-fcgi
5.3.1 - cgi-fcgi
Immer mit dem gleichen Ergebnis.
Egal ob gc_enabled(), manueller Aufruf von gc_collect_cycles() , ...

Ich komm bei 64MB
auf ca. 230000 Einträge ohne FunktionsAufruf
und ca. 150000 Einträge mit FunktionsAufruf
(.. und das sind leider zuwenig Einträge,
bzw berechnet mal die StringGrösse mit dem calc!)

Bitte berichtet mit Eure Erfahrungen mit dem Script und dem Arbeitsspeicher.
Merci.

PHP-Code:

<pre>
//teste wie gross ein Array werden darf bis der Arbeitssepeicher voll ist
http://de.php.net/manual/de/features.gc.php
gc_collect_cycles(); http://de.php.net/manual/de/function.gc-enabled.php
</pre>
<?php
echo "phpversion()=".phpversion()."<br>";
echo 
"php_sapi_name()=".php_sapi_name()."<br>";
if(
function_exists('gc_enabled')){
    echo 
"gc_enabled()=".intval(gc_enabled())."<br>";
}else{
    echo 
"NO function: gc_enabled()<br>";
}

//print Menu BEGIN
echo '
<a href="./'
.basename($_SERVER['SCRIPT_NAME']).'?mitFunktion=0" target="_self">ohne FunktionsAufruf</a><br>
<a href="./'
.basename($_SERVER['SCRIPT_NAME']).'?mitFunktion=1" target="_self">mit FunktionsAufruf</a><br>
'
.date('c').'<br>
'
;
//print Menu END

//check USER-Parameter BEGIN
$mitFunktion false;
if(
array_key_exists('mitFunktion',$_GET)){
    
$mitFunktion intval($_GET['mitFunktion']);
}
//check USER-Parameter END

if($mitFunktion == false){
    
//run test ohne FunktionsAufruf BEGIN
    
$list = array();//init $list (poor old friend will hang in memory)
    
$key 0
    while(
true){ // = bis zum bitteren Ende
        
if( ($key 10000) == ){
            echo 
"\n<br>do add 10000. count=".count($list);
        }
        
$list[] = md5(microtime());$key++; //add simple/short String per ROW
    
}
    
//run test ohne FunktionsAufruf END
}else{
    
//run test MIT FunktionsAufruf BEGIN
    
$list = array();//init $list (poor old friend will hang in memory)
    
while(true){ // = bis zum bitteren Ende
        
$list addRows($list10000);
    }
    
//run test MIT FunktionsAufruf END
}

function 
addRows($list = array(), $anzahl 10000){
    
//check Parameter BEGIN
    
if(is_array($list) == false){
        
$list = array();
    }
    
$anzahl intval($anzahl);
    
//check Parameter END
    
echo "\n<br>do add 10000. count=".count($list);
    for(
$i 0$i<$anzahl$i++){
        
$list[] = md5(microtime());//add simple/short String per ROW
    
}
    return 
$list;
}

?>
Ich vermute der Speicher läuft beim call_by_value voll ;?
$list = addRows($list, 10000);
Mit Zitat antworten
  #5  
Alt 05.09.2010, 03:36:43
rei rei ist offline
Anfänger
 
Registriert seit: Sep 2010
Ort: Sünching bei Straubing - Regenburg
Alter: 51
Beiträge: 17
AW: Garbage Collection in PHP - Instanzen des vorherigen Durchlaufs

Zitat:
Mal angenommen ich rufe dann, z.B. durch einen Link wieder die index.php auf. Was passiert dann mit den Instanzen des vorherigen Durchlaufs?
Das stimmt schon http ist zustandslos - konkret -
wenn das script fertig ist, wird alles in die Tonne getretten
und beim nächsten Aufruf von index.php neu angelegt -
JEDOCH NICHT deine SessionWerte ;)

z.B.: (Skript ist Freiflug)
PHP-Code:

<?php
//include_once('/path/to/class.myClass.php');
session_start();

if(isset(
$_SESSION['storedObj'])){
    
$myObj unserialize($_SESSION['storedObj']);
}
else{
    
$myObj = new myClass('Hallo World');
}

echo ( 
$myObj->getST() );
$myObj->setST('Aber Hallo');


class 
myClass{
    private 
$something 'init';
    
    function 
__construct($string  'construct') {
        
$this->setST($string);
    }

    function 
__destruct() {
        
$_SESSION['storedObj'] = serialize($this);
    }
    
    function 
getST(){
        return 
$this->something;
    }
    
    function 
setST($string  'unset'){
        
$this->something $string;
        return 
true;
    }
}

?>
geht auch eleganter...
Dein Reinhard Neidl.
__________________
Meine Tochter: kleine Frau ganz gross

Reinhard Neidl Webprogrammierung

Geändert von rei (05.09.2010 um 03:52:40 Uhr)
Mit Zitat antworten
  #6  
Alt 05.09.2010, 10:18:11
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Alter: 15
Beiträge: 2.269
AW: Garbage Collection in PHP

@rei

Zitat:
Also so uneingeschränkt zustimmen kann ich da nicht, dass bei php gc Friede, Freude, Eierkuchen herrscht.
Ach herrje...
Was meinst du?
Zirkuläre Referenzen? Was willst du damit?
Also nicht Praxis relevant.


Das Zeit Problem?
Es macht wenig Sinn in PHP tausende von Objekten oder hunderttausende Arrays zu erzeugen.
Also nicht Praxis relevant.


Ein PHP Script "lebt" nur vom Request bis zum Response. Und sobald diese Zeit länger als 500 msec dauert, fängt der Besucher an zu warten. Mehr als 10 Sekunden hält kein Besucher aus. Und klickt weg.
Die meisten Provider brechen Scripte nach 30 Sekunden ab. Dann ist sowieso Schluss mit Lustig. Also reden wir hier über Zeiten im Sekunden Bereich. Und da reicht die Zeit einfach nicht um so riesen Datenstrukturen auf zu bauen.

Bedenke:
Eine Java Applikation läuft Stunden, oder gar Tage durch.
Eine PHP Script in der Regel nur ein paar Dutzend Milli Sekunden.
Das ist ein ERHEBLICHER Unterschied.


---------
Ich habe ja keine Ahnung was du mit PHP anstellen willst, aber wenn du Schwachstellen in unserer geliebten Sprache unbedingt finden willst, dann findest du sie auch. Und wenn du unsere geliebte Sprache in aller Öffentlichkeit demontieren möchtest, kann kannst du das natürlich tun, aber welchen Sinn macht das?

Stelle bitte Praxis relevante Fragen!
Ein solches schon fast polemisches runter buttern mag ich nicht.

-----------

PHP-Code:
  $myObj unserialize($_SESSION['storedObj']) 
Was soll das unserialize() da tun?
Unsinn!

Es macht herzlich wenig Sinn Session mit allem möglichen Gedöns zuzustopfen!
Z.B. die User_id in Session zu halten macht Sinn!
Aber die Rechte des Users haben da nichts zu suchen. Das wäre redundante Datenhaltung. Auch: Der Admin könnte diesen User nicht bannen.

Geändert von DokuLeseHemmung (05.09.2010 um 10:29:44 Uhr)
Mit Zitat antworten
  #7  
Alt 05.09.2010, 11:41:03
cortex cortex ist offline
SELFPHP Profi
 
Registriert seit: Apr 2008
Alter: 48
Beiträge: 1.938
AW: Garbage Collection in PHP

ich habe bis dato keine negativen erlebnisse mit der garbage collection in php gemacht. möglicherweise liegt das daran, dass ich php ausschliesslich für webanwendungen nutze - quasi im sinne des erfinders. doku's ausführungen habe ich nichts hinzuzufügen; lediglich das bereits gesagte:

Zitat:
Zitat von cortex Beitrag anzeigen
php ist darauf zugeschnitten, via http - ein zustandsloses protokoll - zu funktionieren. von java kommend, musst du in dieser hinsicht zuerst einmal umdenken.
zum thema sessions:

Zitat:
Zitat von rei Beitrag anzeigen
wenn das script fertig ist, wird alles in die Tonne getretten [...] JEDOCH NICHT deine SessionWerte ;)
ich sehe kein überraschungsmoment.

cx
Mit Zitat antworten
  #8  
Alt 05.09.2010, 15:17:22
knight1 knight1 ist offline
Junior Member
 
Registriert seit: May 2003
Ort: Trier
Alter: 47
Beiträge: 310
knight1 eine Nachricht über MSN schicken knight1 eine Nachricht über Skype™ schicken
AW: Garbage Collection in PHP

Zitat:
Zitat von DokuLeseHemmung Beitrag anzeigen
...
Es macht herzlich wenig Sinn Session mit allem möglichen Gedöns zuzustopfen!
...
Da stimme ich Dir absolut zu.
ABER, hast Du dir schon einmal angesehen was z.B. PHPMyAdmin (PMA) alles in die Session reinhaut, ohne es wieder zu löschen wenn es nicht mehr gebraucht wird? Auf meinem Entwicklungssystem wächst die Session-Datei von PMA teilweise auf über 200KB an.

Zitat:
Zitat von cortex Beitrag anzeigen
...
ich sehe kein überraschungsmoment.
...
Vor allem ist man für das was in der Session steht als Coder selbst verantwortlich, siehe mein Beispiel mit PMA. An dem Inhalt einer Session hat der GC nichts verloren.
Unter anderem wenn es an das Aufräumen des Verzeichnisses, wo die Sessions abgespeichert werden, und des in PHP definierten Temp-Verzeichnisses geht, erst dann greift der GC.
Was die PHP-Interne RAM-Verwaltung angeht, kann ich nichts zu sagen. Keine Ahnung ob da auch der GC für zu ständig ist oder ob es einen entsprchenden Programmcode innerhalb des Interpreters gibt.


Kai aka Knight1
__________________
Please visit: http://www.kaikordel.de
Mit Zitat antworten
  #9  
Alt 05.09.2010, 18:15:16
rei rei ist offline
Anfänger
 
Registriert seit: Sep 2010
Ort: Sünching bei Straubing - Regenburg
Alter: 51
Beiträge: 17
AW: Garbage Collection in PHP

Zitat:
in PHP tausende von Objekten oder hunderttausende Arrays zu erzeugen.
Laß doch einfach mal das Script laufen, es wird ja nur ein array befüllt.

Im Frontend laufen natürlich nur ein paar Datensätze auf, im Backend sieht es manchmal anders aus.

Damit möglich Engpässe einer Anwendung, die erst in der Zukunft (gut gefüllte DB) passieren, schon im Vorfeld abgefangen werden können, ist es nun mal nötig die Engpässe/Schwachstellen zu ermitteln/benennen und zu beheben oder zu umschiffen.

z.B.:
Ein Anwendung läuft zwei, drei Jahre und die Statistiken, LogFiles, ExportDumps (für Offline) funktionieren auch gut, aber (leider) ist die Domain erfolgreich und die Exports, Archivierung, CronJobs fahren mitten drin an die Wand (und es wird erst nach zwei,drei Tagen bemerkt). Das ist unangenehm.

Da man(n) mal einen managed Server mal eine Server mit root-Zugang vorgesetzt bekommt,
kann man ja auch nicht immer alles einstellen/konfigurieren wie man will.

Nochmal zurück zum Script:
Wieviele Einträge schafft Euer Server (welche Konfig)?
Was fällt Euch ein mehr Datensätze in ein Array zu packen?
__________________
Meine Tochter: kleine Frau ganz gross

Reinhard Neidl Webprogrammierung
Mit Zitat antworten
  #10  
Alt 05.09.2010, 18:22:08
knight1 knight1 ist offline
Junior Member
 
Registriert seit: May 2003
Ort: Trier
Alter: 47
Beiträge: 310
knight1 eine Nachricht über MSN schicken knight1 eine Nachricht über Skype™ schicken
AW: Garbage Collection in PHP

Aus meiner Sicht ist derjenige der Datenbank-Aufgaben mit solch vielen Datensätzen über ein PHP-Webfrontend abarbeiten lässt ... ähm, naja.

Sowas macht man meines erachtens besser über ein seprates C- oder Java-Programm (oder mit was für einer Datenbankfähigen Programmiersprache auch immer).


Kai aka Knight1
__________________
Please visit: http://www.kaikordel.de
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP Tunnel lusitaz PHP für Fortgeschrittene und Experten 5 23.10.2006 14:41:33
PHP Mail, kommt nicht an darki777 PHP Grundlagen 2 30.08.2006 00:07:27
PHP Aktualisieren? Ben20 Off Topic Area 17 24.07.2003 17:46:26
werte aus anderer php datei includieren Silencer PHP für Fortgeschrittene und Experten 1 06.05.2003 07:59:56
Einführung in PHP und Datenbanken Lómion PHP für Fortgeschrittene und Experten 7 07.02.2002 14:47:29


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:32:12 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt