waflija: Klasse unabhängig vom Script?

Hi,

kann ich in PHP eine Klasse von einem Script unabhängig machen?

Eine Klasse (und alles andere) wird ja automatisch nach Script-ende aus dem Speicher gelöscht. Ich würde aber gerne mit mehreren Scripten hintereinander auf eine Klasse zugreifen. (Wie z.B. in C++ möglich)

Beispiel (ein Produkt wird verändert):

-> Daten werden aus Datenbank in eine Instanz geladen.

-> Dialog wird ausgefüllt und gesendet. Der Nutzer bearbeitet ihn.

-> Dialog gibt geänderte Daten an Script zurück. (Änderung der Daten in der Instanz)

-> ein anderer Dialog wird gesendet.

-> Dialog gibt Daten zurück. - Ein anderer Teil der Daten in der Daten in der Instanz wir geändert

->Die Klasse, bzw. die Daten die in der Instanz gesammlt / geändert wurden, wird in die Datenbank geschrieben.

Natürlich müsste die Klasse irgendwann einen Timeout haben, damit bei einem Ansturz einen Clienten die ganze Sache nicht blockiert.

  1. Hallo,

    Du möchtest also ein Objekt cachen? Hast du Probleme mit der Performance oder einen anderen Grund?

    Du könntest dir http://php.net/manual/en/book.apc.php und/oder http://php.net/manual/en/book.memcache.php angucken. Hier gibt es einen Artikel der kurz aufzeigt wie man beide nutzt http://blog.digitalstruct.com/2008/02/27/php-performance-series-caching-techniques/

    Jeena

    1. Hallo,

      Du möchtest also ein Objekt cachen? Hast du Probleme mit der Performance oder einen anderen Grund?

      Du könntest dir http://php.net/manual/en/book.apc.php und/oder http://php.net/manual/en/book.memcache.php angucken. Hier gibt es einen Artikel der kurz aufzeigt wie man beide nutzt http://blog.digitalstruct.com/2008/02/27/php-performance-series-caching-techniques/

      Jeena

      Es geht mir darum bei einem komplexen Objekt die Datenbank zu schonen - Ich möchte nicht jedes mal 20-25 Datensätze Laden müssen, um 2 ändern... (Ich habe sehr viele einzelne Zugriffe, durch Ajax.)

      1. Hallo,

        Es geht mir darum bei einem komplexen Objekt die Datenbank zu schonen - Ich möchte nicht jedes mal 20-25 Datensätze Laden müssen, um 2 ändern... (Ich habe sehr viele einzelne Zugriffe, durch Ajax.)

        Ja wenn du das Objekt nicht aus der DB holen möchtest dann kannst du es cachen, z.b. mit memcache, du musst es aber dann jedes mal serialisieren und deserialisieren.

        Dass man nicht einfach Scripte durchlaufen lässt sondern nach dem beenden des Requests löscht liegt vor allem am Konzept von HTTP das grundsätzlich erst mal zustandslos ist, d.h. es hat keinen zustand von den man ändern könnte sondern jeder Aufruf wird als eine in sich abgeschlossene Transaktion behandelt. Und da PHP vor allem für den Gebrauch mit Hilfe von HTTP konzipiert wurde lassen die Werkzeuge die man so benutzt (Apache, mod_php, etc.) keine druchlaufenden Scripte zu sondern beenden diese.

        Du könntest das umgehen indem du dir deinen eigenen HTTP-Server schreibst der dann einen Zustand im Speicher hält, oder du benutzt eines der Workarounds wie memcache um Objekte halbautomatisch im Speicher zu halten.

        Jeena

  2. Hallo,

    Eine Klasse (und alles andere) wird ja automatisch nach Script-ende aus dem Speicher gelöscht. Ich würde aber gerne mit mehreren Scripten hintereinander auf eine Klasse zugreifen. (Wie z.B. in C++ möglich)

    möchtest du vielleicht Persistenz?

    Grüße

    1. Hallo,

      Eine Klasse (und alles andere) wird ja automatisch nach Script-ende aus dem Speicher gelöscht. Ich würde aber gerne mit mehreren Scripten hintereinander auf eine Klasse zugreifen. (Wie z.B. in C++ möglich)
      möchtest du vielleicht Persistenz?

      Grüße

      Im Prinzip ja. Es würde mir aber reichen, wenn das Objekt einfach im RAM bleibt.

      z.B.

      Script1 -> generiert das Objekt

      Script2 -> ändert es

      Script3 -> Speichern der Daten in DB und löschen des Objektes.

      Standardmäßig wird das Objekt aber am Ende jedes Scriptes in PHP gelöscht...

      1. Moin!

        Im Prinzip ja. Es würde mir aber reichen, wenn das Objekt einfach im RAM bleibt.

        z.B.

        Script1 -> generiert das Objekt

        Script2 -> ändert es

        Script3 -> Speichern der Daten in DB und löschen des Objektes.

        Standardmäßig wird das Objekt aber am Ende jedes Scriptes in PHP gelöscht...

        Wenn dir das nicht gefällt, darfst du nicht mit PHP arbeiten. Es ist nun mal zentrales Merkmal dieser Sprache, dass sie zwischen zwei Skriptaufrufen keine direkte Verbindung herstellt und am Skriptende alles vergisst.

        Trotzdem kann man mit PHP sehr performante Applikationen programmieren. Das tut man allerdings in der Regel, indem man sich erstmal darauf konzentriert, produktiven Code zu schreiben, und in einem zweiten Schritt durch Analyse der Realität dann ermittelt, an welchen Stellen die Performance nicht ausreichend ist. Hast du Performanceprobleme?

        - Sven Rautenberg

        1. Hello,

          Standardmäßig wird das Objekt aber am Ende jedes Scriptes in PHP gelöscht...

          Wenn dir das nicht gefällt, darfst du nicht mit PHP arbeiten. Es ist nun mal zentrales Merkmal dieser Sprache, dass sie zwischen zwei Skriptaufrufen keine direkte Verbindung herstellt und am Skriptende alles vergisst.

          Ist das Merkmal von PHP oder ist es nicht eher DAS Merkmal von HTTP und zustandslosen Client-Server-Anwendungen? Ich stelle mir vor, dass es mit C, C++, Pascal, Perl, usw. nicht anders ist.

          PHP als Modul des Apachen hält zumindest schon mal das ganze Runtime-System parat. Das muss nicht bei jedem Request neu geladen werden. Darum dürfte es auch sinnvoll sein, konsequent PHP-eigene Funktionen zu benutzen, sofern dies sinnvoll ist, und diese nicht erst in der Interpreterschicht selber nachzubauen. Und außerdem sollte man auch konsequent Daten (persistent) - Daten (transient) und Code trennen. Das ist nun leider wieder ein Argument gegen OOP, so wie PHP bisher damit umgeht.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Tach!

            Es ist nun mal zentrales Merkmal dieser Sprache [PHP], dass sie zwischen zwei Skriptaufrufen keine direkte Verbindung herstellt und am Skriptende alles vergisst.
            Ist das Merkmal von PHP oder ist es nicht eher DAS Merkmal von HTTP und zustandslosen Client-Server-Anwendungen?

            Sowohl als auch. Es gibt jedoch auch Client-Server-Anwendungen, die nicht komplett zustandslos sind.

            Ich stelle mir vor, dass es mit C, C++, Pascal, Perl, usw. nicht anders ist.

            ASP.NET-Anwendungen sind zum Beispiel nicht nur einzelne Scripte. Diese Anwendungen sind zumindest über einen längeren Zeitraum aktiv und haben globale Teile, die permanent vorhanden sind. (Stichwörter für Eigenrecherche, wenn es interessiert: Application Life Cyle und Page Life Cycle)

            Meines Wissens findet man teilweise Permanenz auch bei Java und mod_python.

            PHP als Modul des Apachen hält zumindest schon mal das ganze Runtime-System parat. Das muss nicht bei jedem Request neu geladen werden. Darum dürfte es auch sinnvoll sein, konsequent PHP-eigene Funktionen zu benutzen, sofern dies sinnvoll ist, und diese nicht erst in der Interpreterschicht selber nachzubauen.

            Der Geschwindigkeitsunterschied zwischen internen und nachgebauten Funktionen ergibt sich generell auch bei einer CGI-Nutzung. Der Unterschied zwischen CGI und Modul ist die Start-Verzögerung. Es ist auch nicht so, dass PHP-Extensions nur bei Bedarf nachgeladen werden würden. Das ergäbe vielleicht wirklich einen Laufzeit-Unterschied.

            Und außerdem sollte man auch konsequent Daten (persistent) - Daten (transient) und Code trennen. Das ist nun leider wieder ein Argument gegen OOP, so wie PHP bisher damit umgeht.

            Achwas, ASP.NET bekommt das auch wunderbar objektorientiert hin.

            dedlfix.

          2. Moin!

            Wenn dir das nicht gefällt, darfst du nicht mit PHP arbeiten. Es ist nun mal zentrales Merkmal dieser Sprache, dass sie zwischen zwei Skriptaufrufen keine direkte Verbindung herstellt und am Skriptende alles vergisst.

            Ist das Merkmal von PHP oder ist es nicht eher DAS Merkmal von HTTP und zustandslosen Client-Server-Anwendungen? Ich stelle mir vor, dass es mit C, C++, Pascal, Perl, usw. nicht anders ist.

            Dann stellst du dir falsch vor. :)

            Es spricht ja nichts dagegen, dass genau wie der Webserver selbst, der auch dauerhaft läuft, ebenfalls die Webapplikation dauerhaft läuft, fortlaufend einen Datenbestand pflegt und dann zwischendurch nur mal neue Requests vom User entgegennimmt und damit den Vorgang weiterdreht. Java arbeitet beispielsweise so.

            - Sven Rautenberg

            1. Hello,

              Wenn dir das nicht gefällt, darfst du nicht mit PHP arbeiten. Es ist nun mal zentrales Merkmal dieser Sprache, dass sie zwischen zwei Skriptaufrufen keine direkte Verbindung herstellt und am Skriptende alles vergisst.

              Ist das Merkmal von PHP oder ist es nicht eher DAS Merkmal von HTTP und zustandslosen Client-Server-Anwendungen? Ich stelle mir vor, dass es mit C, C++, Pascal, Perl, usw. nicht anders ist.

              Dann stellst du dir falsch vor. :)

              *mmh*
              Nur, um sicher zu gehen: wir sprechen noch von HTTP, nicht verbindungsorientiert und zustandslos?

              Es spricht ja nichts dagegen, dass genau wie der Webserver selbst, der auch dauerhaft läuft, ebenfalls die Webapplikation dauerhaft läuft, fortlaufend einen Datenbestand pflegt und dann zwischendurch nur mal neue Requests vom User entgegennimmt und damit den Vorgang weiterdreht. Java arbeitet beispielsweise so.

              Kann ich mir gar nicht vorstellen, dass Java im HTTP-Umfeld (ich meine jetzt selbstverständlich im Server!) Instanzen eines Objektes im Speicher hält, dessen Aufgaben erfüllt sind. Wozu sollte es das tun? Woher sollte es wissen, dass es gleich nochmal benötigt wird.

              Szenario:
              Nehmen wir doch einfach mal das Beispiel eines simplen Aufrufzählers. Der Client versendet _keinerlei_ Kennungen. Die IP des Client wird zwischen den Requests wild gewechselt. Wie soll Java hier wissen, dass das beim ersten Aufruf instatiierte Objekt beim siebten und beim 56ten nochmal benutzt werden soll. Die Requests dazwischen kamen von anderen Clients, oder auch nicht...

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Moin!

                Kann ich mir gar nicht vorstellen, dass Java im HTTP-Umfeld (ich meine jetzt selbstverständlich im Server!) Instanzen eines Objektes im Speicher hält, dessen Aufgaben erfüllt sind. Wozu sollte es das tun? Woher sollte es wissen, dass es gleich nochmal benötigt wird.

                Szenario:
                Nehmen wir doch einfach mal das Beispiel eines simplen Aufrufzählers. Der Client versendet _keinerlei_ Kennungen. Die IP des Client wird zwischen den Requests wild gewechselt. Wie soll Java hier wissen, dass das beim ersten Aufruf instatiierte Objekt beim siebten und beim 56ten nochmal benutzt werden soll. Die Requests dazwischen kamen von anderen Clients, oder auch nicht...

                Klar, in so einem Szenario ist das Aufbewahren ja auch sinnlos... zumindest für einen Teil. Die DB-Connection zum Hochzählen behälst du nämlich doch persistent im Speicher, oftmals sogar in Form eines Connection-Pools, weil die potentielle Anzahl von Clients, die zu bedienen sind, größer ist als die Anzahl der DB-Connections, welche aber nicht permanent pro Client benötigt werden.

                Und gerade im Szenario eines eingeloggten Users mit Session-ID ist das permanente bzw. für die Lebensdauer der Session dauernde Bereithalten von User-Daten im Speicher nicht komplett idiotisch. Der User wird bei Login einmal aus der DB geladen, alle Interaktionen laufen ausschließlich über das Java-Programm, alle Updates des Users werden zeitnah wieder in die DB geschrieben - da ist dann keine Notwendigkeit, bei jedem Request den aktuellen User erneut aus der DB zu laden.

                So ein Ansatz ist allerdings auch deutlich herausfordernder, weil man sich jetzt eben über ein Langzeit-Verhalten seiner Applikation Gedanken machen muss. Und wahnsinnige Performance gewinnt man damit auch nicht zwingend, dazu sind Skriptsprachen wie PHP dann doch schon ziemlich gut optimiert, und man kann, wenn das Umfeld es erfordert, zahlreiche "kostenlose" Performanceoptimierungen hinzuziehen, die keine Änderung am Code erfordern. Und natürlich auch Caching einfügen (das ist dann aber nicht mehr "kostenlos", weil es eine Analyse des Nutzungsverhaltens erfordert).

                - Sven Rautenberg

  3. Hello,

    kann ich in PHP eine Klasse von einem Script unabhängig machen?

    Eine Klasse (und alles andere) wird ja automatisch nach Script-ende aus dem Speicher gelöscht. Ich würde aber gerne mit mehreren Scripten hintereinander auf eine Klasse zugreifen. (Wie z.B. in C++ möglich)

    Beispiel (ein Produkt wird verändert):

    -> Daten werden aus Datenbank in eine Instanz geladen.

    -> Dialog wird ausgefüllt und gesendet. Der Nutzer bearbeitet ihn.

    Hier findet ja schon ein Roundturn statt

    -> Dialog gibt geänderte Daten an Script zurück. (Änderung der Daten in der Instanz)

    -> ein anderer Dialog wird gesendet.

    Ein Dialog besteht immer mindestens aus 1 Request und 1 Response

    -> Dialog gibt Daten zurück. - Ein anderer Teil der Daten in der Daten in der Instanz wir geändert

    Ein Dialog kann keine Daten zurückgeben, der wird "geführt" ...

    ->Die Klasse, bzw. die Daten die in der Instanz gesammlt / geändert wurden, wird in die Datenbank geschrieben.

    Natürlich müsste die Klasse irgendwann einen Timeout haben, damit bei einem Ansturz einen Clienten die ganze Sache nicht blockiert.

    Möchtest Du jetzt die Klassendefinition im Speicher behalten oder das davon abgeleitete Objekt. Dann sollte als erstes mal die Sessionleuchte aufleuchten.

    Und wie man Objekte von Sessions zwischenspeichern kann, wird z.B. hier
    http://www.php-faq.de/q-sessions-objekte.html
    oder hier
    {link:http://php.net/manual/de/language.oop5.serialization.php}

    beschrieben.

    Das macht aber eingentlich nicht wirklich Spaß.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  4. Ergänzend zu den anderen Beiträgen möchte ich hier anmerken das Objekte des Typs "ArrayObject" nicht wie ein normales Object in einer Session persistiert werden können.

    Gruß
    ergänzender
    T-Rex