Christian Kruse: Demo: JavaScript und Binärdateien, Multimedia

Beitrag lesen

Hallo Martin,

Ungepuffert würde bedeuten: sie bleiben als IP Pakete auf der Leitung (und der Client wartet), bis das PHP losläuft und sie liest.

Nein, das läuft so nicht. AFAIK nimmt der Webserver den vollständigen POST-Request entgegen, bevor er den PHP-Prozess überhaupt startet.

Das ist hochgradig Server-spezifisch. Apache ist nicht der einzige Server.

Und jetzt wollte ich gerade schreiben, dass Apache das so auch nicht tut und meine Erinnerung im Sourcecode schnell verifizieren, um dann festzustellen, dass die Architektur von Apache sich massiv geändert hat seit ich dafür entwickelt habe. Jetzt habe ich fast eine Stunde darauf verwenden müssen um festzustellen, wo sich was geändert hat und dann zu merken, dass das nicht so ohne weiteres beantwortbar ist 😜

Per Default liest der Apache nicht zuerst den POST-Request, bevor er das CGI-Script startet, sondern er streamt den Request in chunks. Das Herz-Stück ist dabei diese Code-Stelle:

            /* read */
            apr_bucket_read(bucket, &data, &len, APR_BLOCK_READ);

            if (conf->logname && dbpos < conf->bufbytes) {
                int cursize;

                if ((dbpos + len) > conf->bufbytes) {
                    cursize = conf->bufbytes - dbpos;
                }
                else {
                    cursize = len;
                }
                memcpy(dbuf + dbpos, data, cursize);
                dbpos += cursize;
            }

            /* Keep writing data to the child until done or too much time
             * elapses with no progress or an error occurs.
             */
            rv = apr_file_write_full(script_out, data, len, NULL);

Dieser Code wird in einer Loop aufgerufen, Apache liest also den Body in Blöcken der Maximal-Größe APR_BLOCK_READ aus dem Bucket und schreibt ihn ins STDIN des CGI. Ein Bucket ist dabei eine Abstraktion einer I/O-Schnittstelle, und hier kommt dann auch das Problem zum tragen: Apache hat sog. Filters, das ist ein Stück Software, dass sowohr VOR dem Request als auch nach dem Request über die Daten laufen kann, und die, klar, nacheinander ab. Es ist also prinzipiell möglich, dass ein Filter den Request vor der Verarbeitung liest.

Das ist aber, wie gesagt, in der Default-Konfiguration nicht der Fall!

LG,
CK