Tom: Zeitverlust bei bedingten includes, Speicherverbrauch

Hello,

hat sich von Euch schon mal jemand mit dem Unterschied zwischen festen und  bedingten includes bei PHP beschäftigt?

Mich würde interessieren, wie die Unterschiede im Laufzeitverhalten sind.
Lässt sich das irgendwie feststellen?

Im Prinzip sind ja dynamisch aus der DB zugeladene Inhalte auch nichts viel anderes.

Eines der Ziele dabei ist es, Arbeitsspeicher zu sparen.
Wann kann ich davon ausgehen, dass der Speicher wieder freigegeben wird und welcher? Der für die Deklaration der Funktionen oder Klassen wird wohl bis zum Scriptende verloren bleiben, oder?

Nicht mehr benutzte Objekte und Variablen müssten sich entfernen lassen, soweit sie nicht automatisch entsorgt werden? Welche regeln gelten hier?

Liebe Grüße aus Syburg bei Dortmund

Tom vom Berg

--
Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de
  1. Hallo,

    hat sich von Euch schon mal jemand mit dem Unterschied zwischen festen und  bedingten includes bei PHP beschäftigt?

    Was genau verstehst du unter festen und bedingten Includes?

    Gruß
    Christoph

    1. Hello,

      Was genau verstehst du unter festen und bedingten Includes?

      Feste sind imperative Includes, also solche die unbedingrt durchgeführt werden.
      Bedingte werden nur durchgeführt, wenn eine bestimmte Bedingung erfüllt wird, also z.B. der Client einen bestimmten Dialog (.Z. Mailer, Suche, Übersichten, usw. ) angefordert hat.

      Liebe Grüße aus Syburg bei Dortmund

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
  2. Hallo Tom,

    hat sich von Euch schon mal jemand mit dem Unterschied zwischen festen und  bedingten includes bei PHP beschäftigt?

    Es gibt keinen Unterschied (außer natürlich der Tatsache, dass die Bedingung selbst noch ausgewertet werden muss). PHP arbeitet immer nach dem folgenden Schema: 1) Datei kompilieren in Opcodes. 2) Opcodes ausführen. (Schritt 1 kann mit Opcode Caches übersprungen werden) Sobald er auf einen Include-Opcode kommt, dann wird der ausgeführt und die Datei ausgelesen - vorher nicht. Wenn die Bedingung true ist, gibt es also keinen Unterschied zwischen dem include in der Bedingung und dem include außerhalb. Nur wenn die Bedingung false ist, wird halt das include gespart, d.h. die Datei nicht eingelesen (was aber auch logisch sein sollte...).

    Eines der Ziele dabei ist es, Arbeitsspeicher zu sparen.

    Was stellst Du denn an, damit das schon relevant wird? Wie viel Code willst Du denn laden? Selbst große Frameworks wie das Zend Framework o.ä. kommen mit den bestehenden Speicherlimitationen sehr gut zurecht...

    Wann kann ich davon ausgehen, dass der Speicher wieder freigegeben wird und welcher?

    PHP gibt am Scriptende grundsätzlich allen Speicher frei, der im Script alloziert wurde (memcache, persistente Verbindungen und Opcode Caches im SHM sind die Ausnahmen).

    Der für die Deklaration der Funktionen oder Klassen wird wohl bis zum Scriptende verloren bleiben, oder?

    Ja, Funktionen und Klassen leben so lange wie das Script.

    Nicht mehr benutzte Objekte und Variablen müssten sich entfernen lassen, soweit sie nicht automatisch entsorgt werden? Welche regeln gelten hier?

    Ich verstehe den Satz nicht. Generell gilt: Wenn eine Variable nicht mehr verwendet wird (weil die Funktion z.B. beendet wird), dann werden alle mit der Variablen assoziierten Resourcen freigegeben. Für Objekte werden zusätzlich noch eventuell definierte Destruktor-Funktionen aufgerufen, bei Resourcen gibt's intern sowas ähnliches (daher muss man Dateien in PHP auch nicht immer explizit schließen). Wenn Du etwas explizit loswerden willst, nimm unset().

    Was willst Du eigentlich anstellen? Mich dünkt stark, dass Du Deinen Code immer noch stark mikrooptimieren willst, obwohl ich ja immer noch auf eine Antwort auf mein Posting dazu warte...

    Viele Grüße,
    Christian

    1. Hello,

      mit Mikrooptimierung hat das nichts zu tun, sondern mit eher mit dem Aufspüren der Verhaltensweise von PHP. Hatte ich Dich richtig verstanden, dass bedingte includes NICHT duchgeführt werden, wenn die Bedingung nicht erfüllt wird? So hatte ich es erwartet. Wenn es nun doch anders sein sollte, dass z.B. PHP trotzdem schon die zu includierenden Dateien "Vorladen" würde, dann mach nochmal Piep :-)

      Was willst Du eigentlich anstellen? Mich dünkt stark, dass Du Deinen Code immer noch stark mikrooptimieren willst, obwohl ich ja immer noch auf eine Antwort auf mein Posting dazu warte...

      Drängler ;-)

      Ich habe es nicht vergessen. Das Blatt füllt sich langsam. Für und Wider...

      Kannst Du mir in diesem Zusammenhang erklären, was man unter einer "Reflection API" versteht (und ob diese für PHP auch existiert -> http://www.php.net/manual/de/language.oop5.reflection.php, das muss sie wohl sein?)?

      Wie kann ich die für die Entwicklungszeit von Applikationen am leichtesten/besten nutzbar machen?

      Liebe Grüße aus Syburg bei Dortmund

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hi,

        Kannst Du mir in diesem Zusammenhang erklären, was man unter einer "Reflection API" versteht (und ob diese für PHP auch existiert -> http://www.php.net/manual/de/language.oop5.reflection.php, das muss sie wohl sein?)?

        Ja, der Link zeigt auf das entsprechende von PHP.

        Reflection ist die Möglichkeit, sich dynamisch Informationen über die Laufzeitumgebung zu machen. Das heißt: Du kannst dynamisch zur Laufzeit herausbekommen, welche Methoden in einer Klasse existieren. Welche Interfaces eine Klasse implementiert. Welche Parameter bestimmte Methoden haben. Und so weiter, und so fort.

        Ein Beispiel, wo Reflection hilfreich sein kann: Plugins. Wenn ein Plugin eine Klasse ist, dann kann man mit Reflection zum Beispiel abfragen, welche Methoden die Klasse hat - und damit zum Beispiel für Methoden, die bestimmten selbst festgelegten Namenskonventionen folgen, automatisch ein Formular mit Konfigurationsoptionen anbieten. Mal ein stark vereinfachtes Beispiel:

        class LdapAuthPlugin {  
          public function setHost ($value) { ... }  
          public function setPort ($value) { ... }  
          public function setFilter ($value) { ... }  
        }
        

        Mit Reflection kann man jetzt z.B. folgendes machen:

        * $class = new ReflectionClass ($pluginClass);
           ($pluginClass sei hier z.B. 'LdapAuthPlugin')

        * $methods = $class->getMethods();
           $methods ist jetzt ien Array das alle Methoden der Klasse enthält

        * $methods durchgehen und alle Methoden die mit 'set' anfangen abgreifen

        * 'set' aus dem Methodennamen entfernen

        * Ein Formular erzeugen, das 3 Einträge enthält, für Host, Port und
           Filter. Damit wird das Plugin konfiguriert.

        * Beim Nutzen des Plugins die 3 konfigurierten Werte setzen.

        Das nur mal als Abriss, wofür Reflection gut sein könnte. Es gibt auch andere Beispiele, wo das hilfreich sein könnte.

        Viele Grüße,
        Christian