Reihenfolge beim Shutdown

Reihenfolge beim Shutdown

am 12.11.2006 22:39:15 von Thomas Mlynarczyk

Hallo,

In welcher Reihenfolge führt PHP eigentlich die "Abschlußarbeiten" am Ende
eines Skripts aus? Als da wären:

- registrierte Shutdown-Funktionen
- Destruktoren
- Callbacks vom Output-Buffering
- Session-Variablen abspeichern
- (...)

Natürlich kann ich das für meine lokale PHP-Version problemlos austesten,
aber wie sieht es mit anderen Versionen aus? Die Doku ist da leider nicht
sehr mitteilsam und Googlen hat bei mir nur folgende Erkenntnisse zutage
gefördert:

1. Die Reihenfolge hat sich in der Vergangenheit (mehrmals?) geändert.
2. Sie wird sich wohl auch in Zukunft noch ändern
3. Die perfekte Reihenfolge gibt es nicht

Aus programmiertechnischer Sicht ist das nicht gerade optimal. Außerdem habe
ich beim Herumprobieren festgestellt, daß ich seltsamerweise z.B. auch dann
noch auf Objekte zugreifen kann, wenn deren Destruktoren bereits aufgerufen
wurden.

Hat jemand ein paar genauere Informationen zu diesem Thema?

Gruß,
Thomas

Re: Reihenfolge beim Shutdown

am 12.11.2006 23:00:30 von Claus Reibenstein

Thomas Mlynarczyk schrieb:

> In welcher Reihenfolge führt PHP eigentlich die "Abschlußarbeiten" am Ende
> eines Skripts aus? Als da wären:

Warum willst Du das wissen? Gibt es irgendwelche Probleme, deren Ursache
Du darin vermutest?

> Natürlich kann ich das für meine lokale PHP-Version problemlos austesten,

Wie willst Du das anstellen?

> Aus programmiertechnischer Sicht ist das nicht gerade optimal.

Inwiefern?

Gruß. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /

Re: Reihenfolge beim Shutdown

am 12.11.2006 23:50:53 von Rudi Menter

aus Reibenstein:

>> In welcher Reihenfolge führt PHP eigentlich die "Abschlußarbeiten"
>> am Ende eines Skripts aus?

Oh, schon wieder FRAGEN! Der stellt tatsächlich Fragen!

1) > Warum willst Du das wissen?

Eben! Weshalb denn!

2) > Gibt es irgendwelche Probleme, deren Ursache Du darin vermutest?

Genau, alles muß man den Leuten mühselig aus der Nase ziehen.

>> Natürlich kann ich das für meine lokale PHP-Version problemlos austesten,

3) > Wie willst Du das anstellen?

Ja, es wird immmer schlimmer! Behauptungen, Behauptungen, Behauptungen.

>> Aus programmiertechnischer Sicht ist das nicht gerade optimal.

4) > Inwiefern?

Das ist nicht zu fassen was hier eingerissen ist, da wirst du auf eine
Art hingehalten, daß du gezwungen bist, dein Posting auf die Fragen
1), 2), 3). 4) zu beschränken, bevor dir überhaupt richtig mitzumachen
und überhaupt mal zu einer AUSSAGE zu kommen die Möglichkeit gegeben wird!

> Gruß. Claus

Ja, ja, schon gut.

WAS ist nur aus den Postern geworden! Da muß der Klaus erst VIER
Fragen stellen, bevor man hier überhaupt noch zur Sache kommen darf!

Nicht zu fassen... strengt euch mal etwas an Leute, sonst ergeht
vielleicht umgehend Beschwerde durch die Forumsleitung...

scnr. fG
--

Re: Reihenfolge beim Shutdown

am 13.11.2006 07:43:20 von Ulf Kadner

Thomas Mlynarczyk schrieb:

> In welcher Reihenfolge führt PHP eigentlich die "Abschlußarbeiten" am Ende
> eines Skripts aus? Als da wären:

Würde mich auch mal interessieren für was Du derartige Infos nutzen willst.

>
> - registrierte Shutdown-Funktionen
> - Destruktoren
> - Callbacks vom Output-Buffering
> - Session-Variablen abspeichern

Vieles (z.B. Zerstören von Objekten läuft ja eh über den GC. Da zusagen
wann das genau im GC auftritt ist schon ziemlich gewagt.

> Natürlich kann ich das für meine lokale PHP-Version problemlos austesten,

-v bitte

MfG, Ulf

Re: Reihenfolge beim Shutdown

am 13.11.2006 08:46:32 von Martin Kaffanke

Am Mon, 13 Nov 2006 07:43:20 +0100 schrieb Ulf Kadner:

>
> Würde mich auch mal interessieren für was Du derartige Infos nutzen willst.

>> - Destruktoren
>> - Session-Variablen abspeichern

Gerade bei diesen wäre es interessant für mich, weil man im Destruktor
eigentlich noch die Session aufräumen könnte.

lg,
Martin

Re: Reihenfolge beim Shutdown

am 13.11.2006 12:07:05 von Claus Reibenstein

Martin Kaffanke schrieb:

> Am Mon, 13 Nov 2006 07:43:20 +0100 schrieb Ulf Kadner:
>
>> Würde mich auch mal interessieren für was Du derartige Infos nutzen willst.
>
>>> - Destruktoren
>>> - Session-Variablen abspeichern
>
> Gerade bei diesen wäre es interessant für mich, weil man im Destruktor
> eigentlich noch die Session aufräumen könnte.

Es wäre fatal, wenn Destruktoren aktiv würden, bevor die Instanzen in
der Session gespeichert sind. Danach wäre die Instanz nämlich kaputt und
könnte gar nicht mehr gespeichert werden.

Wenn Du etwas nicht in der Session haben willst, nimm es vorher raus.

Gruß. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /

Re: Reihenfolge beim Shutdown

am 13.11.2006 13:04:59 von Thomas Mlynarczyk

Also sprach Claus Reibenstein:

> Warum willst Du das wissen? Gibt es irgendwelche Probleme, deren
> Ursache Du darin vermutest?

Ich sollte doch z.B. schließlich wissen, ob meine registrierte
Shutdown-Funktion bereits aufgerufen wurde, wenn meine ob-Funktion
aufgerufen wird. Oder wenn ich meine eigene Fehlerbehandlungsroutine
schreibe, dann soll diese *am Ende* des Scripts die "gesammelten"
Fehlermeldungen in eine Protokolldatei schreiben (also als allerletzte
Aktion). Oder wenn der Destruktor aufgerufen wird, in dem noch
Session-Variablen verändert werden sollen. Oder, oder, oder... Ist es nicht
ganz selbstverständlich, daß ich wissen muß, in welcher Reihenfolge PHP
meinen Code ausführt?

>> Natürlich kann ich das für meine lokale PHP-Version problemlos
>> austesten,

> Wie willst Du das anstellen?

register_shutdown_function( 'shutdown' );
function shutdown () { echo 'Shutdown'; }
ob_start( 'obflush' );
function obflush ( $s ) { return $s . 'Flush'; }
class Test { function __destruct () { echo 'Destruktor'; } }
new Test;

>> Aus programmiertechnischer Sicht ist das nicht gerade optimal.

> Inwiefern?

Siehe oben.

Gruß,
Thomas

Re: Reihenfolge beim Shutdown

am 13.11.2006 13:17:46 von Thomas Mlynarczyk

Also sprach Ulf Kadner:

>> In welcher Reihenfolge führt PHP eigentlich die "Abschlußarbeiten"
>> am Ende eines Skripts aus? Als da wären:

> Würde mich auch mal interessieren für was Du derartige Infos nutzen
> willst.

Nur mal *ein* Beispiel: Fehlerbehandlungsroutine sammelt während der
Ausführung des Skripts Fehlermeldungen und schreibt sie *am Ende* in eine
Protokolldatei. Ein ob-Handler nimmt noch Manipulationen am Output vor,
wobei potentiell Fehlermeldungen erzeugt werden können. Ein Destruktor hat
seinerseits noch wichtige Dinge zu erledigen, bei denen er einerseits
Session-Variablen verändert und andererseits auch wieder potentiell
Fehlermeldungen erzeugen kann. Hier darf natürlich die Session erst nach den
Destruktoren abgespeichert werden und die Fehlerbehandlungsroutine muß zu
allerletzt aufgerufen werden.

Und ist es denn nicht eigentlich ganz selbstverständlich, daß man als
Programmierer wissen muß, in welcher Reihenfolge die einzelnen Bestandteile
eines Skripts ausgeführt werden?

> Vieles (z.B. Zerstören von Objekten läuft ja eh über den GC. Da
> zusagen wann das genau im GC auftritt ist schon ziemlich gewagt.

Es geht ja hier auch um den speziellen Fall am Ende des Skripts, nicht um
Objekte, die z.B. nur lokal in einer Funktion existieren und beim "return"
freigegeben werden. Davon abgesehen: Werden denn Destruktoren vom GC
aufgerufen? Ich dachte, Objekte werden erst dann für den GC "interessant",
wenn PHP sie "freigegeben" hat?

>> Natürlich kann ich das für meine lokale PHP-Version problemlos
>> austesten,

> -v bitte

siehe mein anderes Posting in diesem Thread.

Gruß,
Thomas

Re: Reihenfolge beim Shutdown

am 13.11.2006 13:23:59 von Thomas Mlynarczyk

Also sprach Claus Reibenstein:

> Es wäre fatal, wenn Destruktoren aktiv würden, bevor die Instanzen in
> der Session gespeichert sind. Danach wäre die Instanz nämlich kaputt
> und könnte gar nicht mehr gespeichert werden.

Dann müßte ich derartige "Endmanipulationen" an der Session z.B. in einer
Shutodwn-Funktion vornehmen - wobei ich wiederum auf die Reihenfolge 1)
Shutdown-Funktion 2) Session speichern angewiesen wäre.

Im Sinne von OOP wäre es sicher ideal, sämtliche "Endarbeiten" von
Destruktoren erledigen zu lassen. Was natürlich eine bestimmte, sinnvolle
Reihenfolge voraussetzen würde.

Gruß,
Thomas

Re: Reihenfolge beim Shutdown

am 13.11.2006 16:53:34 von Ulf Kadner

Thomas Mlynarczyk schrieb:

> Nur mal *ein* Beispiel: Fehlerbehandlungsroutine sammelt während der
> Ausführung des Skripts Fehlermeldungen und schreibt sie *am Ende* in eine
> Protokolldatei. Ein ob-Handler nimmt noch Manipulationen am Output vor,
> wobei potentiell Fehlermeldungen erzeugt werden können. Ein Destruktor hat

Wieso nutzt Du da Ausgabepufferung? Schreib doch erst wenns wirklich
notwendig ist. So ein "Reingequetsche" ist mM nach keine gute Lösung.

Mal abgesehen davon braucht man derartige Funktionalität (aber Ohne
ob_*) nur zum Debuggen wenn mal aufm Webspace was nicht gleich will.

Da ist es doch einfacher ohne Buffering auszukommen.

Ich bau schon seit ewigkeiten Webseiten mit PHP, aber so ne Arbeitsweise
wurde noch nie benötigt. Allerdings sehe ich das oft bei Anderen und
freue mich über meinen Code. :-) Klingt zwar ganz einfach, ist es aber
auch! ;-)

> seinerseits noch wichtige Dinge zu erledigen, bei denen er einerseits
> Session-Variablen verändert und andererseits auch wieder potentiell

Du hast doch bereits ein ShutDown-Funktion registriert. Papp einfach
alles was am Ende geschehen soll dort rein und verwalte (Wie Pear z.B.)
alle betroffenen Singleton-Klassen mit einem Manager-Objekt welches sich
darum kümmert das PHP erfährt das was freigegeben werden kann.

> Und ist es denn nicht eigentlich ganz selbstverständlich, daß man als
> Programmierer wissen muß, in welcher Reihenfolge die einzelnen Bestandteile
> eines Skripts ausgeführt werden?

Warum? Es gab bisher (ich mach das mit PHP seit 1995) noch nie eine
Notwendigkeit derartiges Wissen zu wollen. Ich nehme stark an das Du
diese Herangehensweise von anderen Sprachen kennst?

> Es geht ja hier auch um den speziellen Fall am Ende des Skripts,

also in der Shutdownfunktion. Diese stellt wenn gesetzt ja selbiges dar.

> Objekte, die z.B. nur lokal in einer Funktion existieren und beim "return"
> freigegeben werden. Davon abgesehen: Werden denn Destruktoren vom GC
> aufgerufen? Ich dachte, Objekte werden erst dann für den GC "interessant",
> wenn PHP sie "freigegeben" hat?

Hab ich mich etwas missverständlich bzw. falsch ausgedrückt. Aber wenn
der GC etwas freigibt, dann nicht ausschliesslich weil der User es so
will, sondern nur wenn dieser eine Notwendigkeit zur Freigabe sieht.
(geringer Speicher etc) Also eigentlich wie in Java oder C#

MfG, Ulf

Re: Reihenfolge beim Shutdown

am 13.11.2006 19:40:55 von Claus Reibenstein

Thomas Mlynarczyk schrieb:

> Also sprach Claus Reibenstein:
>
>> Warum willst Du das wissen? Gibt es irgendwelche Probleme, deren
>> Ursache Du darin vermutest?
>
> Ich sollte doch z.B. schließlich wissen, ob [...]

Wozu? Welchen Sinn soll das haben?

> Ist es nicht
> ganz selbstverständlich, daß ich wissen muß, in welcher Reihenfolge PHP
> meinen Code ausführt?

Nein. Es ist keinesfalls selbstverständlich. Es ist eher sogar
vollkommen unverständlich.

Wenn Du möchtest, dass bestimmte Aktionen an bestimmten Stellen in einer
bestimmten Reihenfolge ausgeführt werden, dann schreibe das genau so in
Dein Script rein. Das ist die _einzige_ vernünftige, verlässliche und
portable Methode. Alles andere ist Murks und wird schon beim nächsten
PHP-Update oder -Upgrade oder gar einem Systemwechsel nicht mehr
funktionieren (Stichwort: wiederverwendbarer Code).

Gruß. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /

Re: Reihenfolge beim Shutdown

am 13.11.2006 22:10:35 von Thomas Mlynarczyk

Also sprach Claus Reibenstein:

>> Ist es nicht
>> ganz selbstverständlich, daß ich wissen muß, in welcher Reihenfolge
>> PHP meinen Code ausführt?

> Nein. Es ist keinesfalls selbstverständlich. Es ist eher sogar
> vollkommen unverständlich.

Es ist also völlig egal, ob PHP erst den Datenpuffer löscht
und ihn dann in die Datei schreibt oder umgekehrt?


> Wenn Du möchtest, dass bestimmte Aktionen an bestimmten Stellen in
> einer bestimmten Reihenfolge ausgeführt werden, dann schreibe das
> genau so in Dein Script rein. Das ist die _einzige_ vernünftige,
> verlässliche und portable Methode.

Ja, nichts anderes will ich doch machen! Ich weiß z.B., daß der Konstruktor
eines Objekts stets *vor* dessen Destruktor aufgerufen wird - warum soll ich
dann bitte nicht wissen wollen dürfen, ob z.B. erst mein ob-Callback und
danach meine Shutdown-Funktion aufgerufen werden oder umgekehrt? Und ob ich
dort noch was an den Session-Variablen ändern kann, oder diese schon
abgespeichert wurden?

Gruß,
Thomas

Re: Reihenfolge beim Shutdown

am 13.11.2006 22:43:21 von Thomas Mlynarczyk

Also sprach Ulf Kadner:
> Thomas Mlynarczyk schrieb:
>
>> Nur mal *ein* Beispiel: Fehlerbehandlungsroutine sammelt während der
>> Ausführung des Skripts Fehlermeldungen und schreibt sie *am Ende* in
>> eine Protokolldatei. Ein ob-Handler nimmt noch Manipulationen am
>> Output vor, wobei potentiell Fehlermeldungen erzeugt werden können.

> Wieso nutzt Du da Ausgabepufferung? Schreib doch erst wenns wirklich
> notwendig ist. So ein "Reingequetsche" ist mM nach keine gute Lösung.

Ich *darf* doch wohl ganz legitim und unter Wahrung eines guten
Programmierstils einen eigenen ob-Handler gemäß PHP-Doku benutzen, wenn das
für mein Skript sinnvoll ist? Und es *kann* doch wohl vorkommen, daß darin
ein Fehler erzeugt wird (trigger_error) oder - weil niemand perfekt ist -
ganz von alleine passiert? Und die Fehler werden von meinem Error-Handler
aufgefangen, der sie zunächst in einem Array speichert und am Ende des
Skripts z.B. in eine Logdatei schreibt. Folglich muß er wissen, wann das
Skript "am Ende" ist. Da wird nirgendwo was "reingequetscht" und ich
schreibe doch auch nur und erst dann irgendetwas irgendwo hin wenn es
wirklich notwendig ist.

> Mal abgesehen davon braucht man derartige Funktionalität (aber Ohne
> ob_*) nur zum Debuggen wenn mal aufm Webspace was nicht gleich will.

Oder zum Loggen.

> Du hast doch bereits ein ShutDown-Funktion registriert. Papp einfach
> alles was am Ende geschehen soll dort rein

Ja. Nur was bedeutet *am Ende* hier genau? Wenn z.B. *danach* noch mein
ob-Callback aufgerufen wird, dann war es eben noch nicht *das Ende*. In
diesem Fall sollte ich das, was *am Ende* geschehen soll, in den ob-Callback
packen. Ich muß also wissen, in welcher Reihenfolge Shutdown-Funktion und
ob-Callback ausgeführt werden.

[Kenntnis der Reihenfolge der Ausführung der Skriptbestandteile]
> Warum? Es gab bisher (ich mach das mit PHP seit 1995) noch nie eine
> Notwendigkeit derartiges Wissen zu wollen.

Es ist also völlig egal, ob Deine Skripte von oben nach unten oder von unten
nach oben abgearbeitet werden? Oder vielleicht erst die geraden
Zeilennummern und dann die ungeraden? Ich finde Deine Einstellung äußerst
seltsam.

>> Es geht ja hier auch um den speziellen Fall am Ende des Skripts,
> also in der Shutdownfunktion. Diese stellt wenn gesetzt ja selbiges
> dar.

"Ende" bedeutet, daß es kein *danach* mehr gibt. Wenn aber mein ob-Callback
*nach* der Shutdown-Funktion aufgerufen wird ...?

> Hab ich mich etwas missverständlich bzw. falsch ausgedrückt. Aber wenn
> der GC etwas freigibt, dann nicht ausschliesslich weil der User es so
> will, sondern nur wenn dieser eine Notwendigkeit zur Freigabe sieht.
> (geringer Speicher etc) Also eigentlich wie in Java oder C#

In der PHP-Doku steht, daß der Destruktor dann aufgerufen wird, wenn es
keine Referenz mehr auf das Objekt gibt (was identisch ist mit "zum Abschuß
durch GC freigegeben"). Deshalb wundert es mich, daß ich z.B. in meinem
ob-Callback auf ein globales Objekt zugreifen kann, obwohl dessen Destruktor
*vor* dem ob-Callback aufgerufen wird.

Gruß,
Thomas

Re: Reihenfolge beim Shutdown

am 13.11.2006 23:13:17 von Ulf Kadner

Thomas Mlynarczyk schrieb:

>> Wieso nutzt Du da Ausgabepufferung? Schreib doch erst wenns wirklich
>> notwendig ist. So ein "Reingequetsche" ist mM nach keine gute Lösung.
>
> Ich *darf* doch wohl ganz legitim und unter Wahrung eines guten
> Programmierstils einen eigenen ob-Handler gemäß PHP-Doku benutzen, wenn das
> für mein Skript sinnvoll ist?

Habe ich versucht Dir etwas zu verbieten? Alles nur meine Empfehlung...
wir kommst Du auf solche Abwege?

> ein Fehler erzeugt wird (trigger_error) oder - weil niemand perfekt ist -
> ganz von alleine passiert? Und die Fehler werden von meinem Error-Handler
> aufgefangen, der sie zunächst in einem Array speichert und am Ende des
> Skripts z.B. in eine Logdatei schreibt. Folglich muß er wissen, wann das
> Skript "am Ende" ist. Da wird nirgendwo was "reingequetscht" und ich
> schreibe doch auch nur und erst dann irgendetwas irgendwo hin wenn es
> wirklich notwendig ist.

Da stimme meine Meinung leider nicht mit Deiner überein. Schrieb ich ja
bereits.

>> Mal abgesehen davon braucht man derartige Funktionalität (aber Ohne
>> ob_*) nur zum Debuggen wenn mal aufm Webspace was nicht gleich will.
>
> Oder zum Loggen.

Ja.

>> Du hast doch bereits ein ShutDown-Funktion registriert. Papp einfach
>> alles was am Ende geschehen soll dort rein
>
> Ja. Nur was bedeutet *am Ende* hier genau?

Am Ende des Scripts, aber natürlich vor den GC.

> Wenn z.B. *danach* noch mein
> ob-Callback aufgerufen wird,

Nein. Wo ende ist ist Ende. :-)

> diesem Fall sollte ich das, was *am Ende* geschehen soll, in den ob-Callback
> packen. Ich muß also wissen, in welcher Reihenfolge Shutdown-Funktion und
> ob-Callback ausgeführt werden.

s.o.

>> Warum? Es gab bisher (ich mach das mit PHP seit 1995) noch nie eine
>> Notwendigkeit derartiges Wissen zu wollen.
>
> Es ist also völlig egal, ob Deine Skripte von oben nach unten oder von unten
> nach oben abgearbeitet werden? Oder vielleicht erst die geraden
> Zeilennummern und dann die ungeraden? Ich finde Deine Einstellung äußerst
> seltsam.

Ich halte es für äußerts seltsam was Du in meine Antwort hinein
interpretierst. Wie sprachen nicht von irgendwelche Richtungen. Wenn Du
Dich mit so tiefgreifenden Dingen beschäftigen willst sollte Dir klar
sein das ich gewisse Sachen nicht extra noch mal betonen muss.

Re: Reihenfolge beim Shutdown

am 14.11.2006 07:32:48 von Claus Reibenstein

Thomas Mlynarczyk schrieb:

> Ich *darf* doch wohl ganz legitim und unter Wahrung eines guten
> Programmierstils [...]

Ich halte das, was Du da zusammenbasteln möchtest, schlicht und einfach
für _schlechten_ Programmierstil.

Wer sagt eigentlich, dass Deine Destruktoren _überhaupt_ aufgerufen
werden am Ende? Ich gehe eher mal davon aus, dass der Prozess vom System
direkt entsorgt wird.

Nur mal so als Denkanstoß.

Gruß. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /

Re: Reihenfolge beim Shutdown

am 14.11.2006 11:42:57 von Thomas Mlynarczyk

Also sprach Ulf Kadner:

>> Und die Fehler werden von meinem
>> Error-Handler aufgefangen, der sie zunächst in einem Array speichert
>> und am Ende des Skripts z.B. in eine Logdatei schreibt. Folglich muß
>> er wissen, wann das Skript "am Ende" ist.

> Da stimme meine Meinung leider nicht mit Deiner überein. Schrieb ich
> ja bereits.

Ich sollte also einfach eine registrierte Shutdown-Funktion für das
Schreiben der Fehlermeldungen in meine Protokolldatei nehmen? Gut, aber dann
werden doch mögliche Fehlermeldungen im ob-Callback nicht mehr erfaßt? Oder
willst Du mir einfach sagen, daß ich meine Skripte so schreiben sollte, daß
die Reihenfolge beim Shutdown egal ist? Das wäre natürlich die sicherste
Lösung, und die werde ich natürlich wann immer möglich wählen, aber es gibt
Fälle, für die die Kenntnis der Reihenfolge von Bedeutung ist.

> Am Ende des Scripts, aber natürlich vor den GC.

>> Wenn z.B. *danach* noch mein
>> ob-Callback aufgerufen wird,

> Nein. Wo ende ist ist Ende. :-)

Mein PHP 5.1.4 hält folgende Reihenfolge ein:
1. registrierte Shutdown-Funktionen
2. Destruktoren
3. ob-Callback

"Ende" ist für mich daher in diesem Fall ob-Callback. Mein Problem besteht
nun einfach darin, daß diese Reihenfolge in älteren und/oder zukünftigen
PHP-Versionen anders sein könnte.

> Ich halte es für äußerts seltsam was Du in meine Antwort hinein
> interpretierst. Wie sprachen nicht von irgendwelche Richtungen. Wenn
> Du Dich mit so tiefgreifenden Dingen beschäftigen willst sollte Dir
> klar sein das ich gewisse Sachen nicht extra noch mal betonen muss.

Offenbar liegt hier irgendwo ein gravierendes Mißverständnis vor. Ich wollte
eigentlich nur wissen, wie PHP in den einzelnen Versionen (und
voraussichtlich in Zukunft) die Shutdown-Reihenfolge handhabt, was mir da
wann noch zur Verfügung steht (Session-Variablen ändern, auf Objekte
zugreifen...), und was man allgemein bei diesem Thema beachten sollte. Und
da es sich bei Shutdown-Funktionen, Destruktoren und ob-Callback um vom
Programmierer geschrieben Code handelt, der Teil des Skripts ist und
potentiell wechselseitig voneinander abhängig sein kann, scheint mir die
Frage nach der Reihenfolge extrem wichtig zu sein. Umso verwunderter bin
ich, daß diese Frage hier offenbar als völlig irrelevant angesehen wird.

Gruß,
Thomas

Re: Reihenfolge beim Shutdown

am 14.11.2006 11:58:15 von Thomas Mlynarczyk

Also sprach Claus Reibenstein:

> Ich halte das, was Du da zusammenbasteln möchtest, schlicht und
> einfach für _schlechten_ Programmierstil.

Mein ursprüngliches Posting bezog sich keineswegs auf eine konkrete
Implementierung. Ich hatte nur Beispiele genannt, weil die Sinnhaftigkeit
meiner Fragestellung derart stark bestritten wurde. Wie würdest Du denn
Fehlerprotokollierung handhaben? Eine Alternative wäre natürlich, jeden
Fehler *sofort* in die Datei zu schreiben, aber wenn ich z.B. noch eine
Meldung wie "Bis zum Ende ausgeführt" oder "Brauchte ingesamt
$millisekunden" ausgeben will oder meine Protokolldatei im HTML-Format
erstellt werden soll (abschließendes "" einfügen), muß ich
doch "etwas ganz am Ende" tun, oder?

> Wer sagt eigentlich, dass Deine Destruktoren _überhaupt_ aufgerufen
> werden am Ende? Ich gehe eher mal davon aus, dass der Prozess vom
> System direkt entsorgt wird.

Sie werden in meinem PHP 5.1.4 jedenfalls *vor* dem ob-Callback aufgerufen,
und da letzteres zweifellos noch in den "Zuständigkeitsbereich" von PHP
fällt, gehe ich davon aus, daß die Destruktoren ebenfalls unter Kontrolle
von PHP aufgerufen werden - wie sollte es auch anders sein, schließlich sind
die Destruktoren ja PHP-Code.

Die PHP-Doku sagt, daß der Destruktor immer dann aufgerufen wird, wenn es
keine Referenzen mehr auf das Objekt gibt. Du meinst, der Aufruf des
Destruktors ist etwas das nur /vielleicht/ passiert? Worin besteht dann
bitte der Sinn von __destruct()? Eine Konsequenz hieraus wäre doch, daß ich
im Destruktor auf nichts außerhalb des Objekts zugreifen sollte (da ich
nicht weiß, ob das betreffende objektexterne Element überhaupt noch
existiert). Mein Destruktorcode würde sich demnach auf objektinterne
Angelegenheiten beschränken müssen, aber - wozu? Wenn doch das Objekt danach
sowieso tot ist?

Gruß,
Thomas

Re: Reihenfolge beim Shutdown

am 14.11.2006 12:31:51 von Niels Braczek

Thomas Mlynarczyk schrieb:

> Eine Konsequenz hieraus wäre doch, daß ich=20
> im Destruktor auf nichts außerhalb des Objekts zugreifen sollte (da i=
ch=20
> nicht weiß, ob das betreffende objektexterne Element überhaupt noch=
=20
> existiert).

Das ist korrekt. Für Objekte, die in Abhängigkeit stehen, speichert m=
an
intern eine Referenz, sodass die Existenz dieses Objektes gesichert bleib=
t.

> Mein Destruktorcode würde sich demnach auf objektinterne=20
> Angelegenheiten beschränken müssen, aber - wozu? Wenn doch das Obje=
kt danach=20
> sowieso tot ist?

Win paar Beispiele: Das Lösen der Datenbank-Verbindung. Das Schließen=

einer Log-Datei. Also Aufräumarbeiten, die in die Zuständigkeit des
betroffenen Objektes fallen.

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: Reihenfolge beim Shutdown

am 14.11.2006 13:38:05 von Thomas Mlynarczyk

Also sprach Niels Braczek:

> Für Objekte, die in Abhängigkeit stehen, speichert
> man intern eine Referenz, sodass die Existenz dieses Objektes
> gesichert bleibt.

Ich habe Claus' Posting dahingehend interpretiert, daß es nicht sicher ist,
ob der im Destruktor stehende Code überhaupt jemals ausgeführt wird. Da mir
dies absurd erscheint, habe ich die Konsequenzen eines solchen Verhaltens
aufgezeigt.

Die Reihenfolge der Destruktor-Aufrufe respektiert also - wie man
logischerweise annehmen sollte - noch vorhandene Referenzen auf andere
Objekte.

Gruß,
Thomas