CGI, OOP, C++ und der Stack



  • Um etwas weiter auszuholen: Ein CGI-Programm wird über Parameter gesteuert. Diese Parameter können aus einem POST oder GET Request kommen. Wenn man also feststellen will ob überhaupt Parameter im Request sind, muß man auch STDIN auslesen und danach sind die Daten in STDIN abgeräumt. D.h., daß diese Daten ja irgendwo gespeichert werden müssen für eine weitere Verwendung. Nun ist ja auch die OOP nicht neu in Sachen CGI und von daher ist es üblich, alles was zu CGI gehört in einer Klasse zu organisieren. In Fakt wird eine Instanz dieser Klasse erstellt, in C++ sähe das so aus CGI cgi; oder CGI cgi = new CGI();
    Das heißt also, daß spätestens mit der ersten Parameterabfrage cgi->param() oder cgi.param() der Gateway STDIN abgeräumt ist und die daraus gelesenen Daten in einer Eigenschaft der CGI-Instanz verbleiben, ebendafür hat man ja diese Instanz. In meinen bisherigen CGI-Klassen passiert das Auslesen STDIN bereits im Konstruktor.

    Nun ist es aber auch so, daß mit CGI cgi; diese Instanz auf dem Stack angelegt wird (https://lerneprogrammieren.com/stack-und-heap/) und bei einem Upload sehr große Datenmengen anfallen können. Von daher ist mein Gedanke naheliegend, in der Eigenschaft nur eine Referenz auf diese Daten zu halten, wie sähe denn der Code hierzu aus?

    Oder ist es hier besser mit new zu arbeiten?

    MFG



  • @_ro_ro Die Daten, die du gelesen hast, musst du ja irgendwo speichern. Sonst kannst du auch keine Referenz darauf verwenden.
    Ich hätte hierfür eine eigene Klasse, z.B. CGIParam oder cgi::param oder wie auch immer.
    Wenn das viele Daten sind und/oder die eine dynamische Größe haben, müssen die eh auf den Heap. (Spezialfälle für dynamische Größe in bestimmten Rahmen mit std::pmr mal außen vor gelassen).

    Das heißt, das irgendwo Speicher mit new auf dem Heap reserviert wird. Das würde ich aber nicht selbst machen, sondern einen passenden Container aus der STL verwenden. Welcher Container verwendet werden sollte, hängt von den konkreten Daten ab, und wie man mit denen weiter arbeiten will.

    Wenn das viele Daten sind, möchte man die dann anschließend nicht im Programm weiter rumkopieren. Da kann man dann Referenzen auf die einmal auf dem Heap gespeicherten Daten verwenden. Dann muss man aber sicherstellen, dass die Daten auch wirklich hinter der Referenz liegen.



  • @_ro_ro: Genau darum geht es doch im anderen aktuellen Thema Pointer wegen möglichen Stackoverflow?, an dem du dich ja auch beteiligt hast (und somit wohl auch gelesen hast).
    Man erzeugt Klassen, deren Member dann Containerklassen bzw. Smart-Pointer sind, deren Daten dann im Freispeicher (umgangssprachlich Heap genannt) liegen. Und somit sind diese Klassenobjekte relativ klein und können bequem auf dem Stack liegen.



  • @Th69

    Ok, das klingt schonmal gut 😉

    Grundsätzlich bewegt ein CGI Programm große Datenmengen. Allein zum Erzeugen einer HTML-Response lädt mein Responseobjekt 4 Templates (Header, Navigationsmenu/Breadcrumb, Body und Footer) und eine 1.5 MB große Binary für die statischen Routen auch dann wenn keine Parameter zu erwarten sind.
    Für Uploads bis 1 GB via HTTP nutze ich ohnehin kein C++ sondern ein spezielles Verfahren mit dem ein Gateway-Timeout umgangen wird.

    MFG


Anmelden zum Antworten