PHP, cURL und die SESSION

Mir hat ein kleines Problem beinahe das Genick gebrochen … mehrstündige Recherchen im Netz brachten mich keinen Meter weiter, ich hoffe der Artikel hilft dem ein oder anderen bei der “Fehlersuche” – aber fangen wir von vorne an.

Sessions sind eine prima Sache, wer Daten über mehrere Scripte hinaus austauschen will, der greift darauf zurück.
Leider passiert es nun manchmal, dass man ein eigenes Script als fertiges HTML benötigt – ein include() per HTTP fällt aber auf vielen Servern dank der allow_url_include Konfigurationseinstellung flach, also muss cURL her.
Mit cURL können wir ein beliebiges Script per HTTP aufrufen und den Inhalt in der aktuellen Seite einbinden, ohne dass ein User etwas davon merkt.

Wer nun aber denkt, er könne die Session-Daten auch in dem Script abgreifen, das per cURL geladen wird, der wird sein blaues Wunder erleben. cURL generiert jedesmal eine neue Session-ID, anstatt die vorhandene fortzusetzen – ist ja auch klar, das ist, als ob man einen zweiten Browser startet, also übergibt man die Session-ID. Entweder kann man diese einfach als GET-Parameter anhängen, oder man setzt eine cURL-Option für ein Cookie.

Das sieht dann so aus:

Wer jetzt das Script aufruft, wird mit einer Sanduhr belohnt. Das Script läd und läd und hört nicht auf. Ein neuer Seitenaufruf schlägt ebenfalls fehlt und wird wieder mit einer Sanduhr belohnt. Der User denkt dann sein Browser wäre abgestürzt, weil nichts mehr funktioniert.

Warum?

Wenn man es weiß, ich die Lösung (wie immer) ganz einfach.
PHP schreibt die Session-Daten erst bei der Beendigung eines Scripts in die Datei auf dem Server. Während das Script läuft, ist die Datei gesperrt, so dass nicht mehrere Scripte gleichzeitig die Daten ändern. Wir müssen also dafür sorgen, dass die Session-Daten gespeichert werden, bevor wir das nächste Script aufrufen. Das erledigt session_write_close(); für uns.

Die Daten in der Superglobalen $_SESSION stehen nach dem Schließen selbstverständlich noch (read-only) zur Verfügung.
Lese- und Schreibrechte hat jetzt aber das per cURL aufgerufene Script.

4 Responses to “PHP, cURL und die SESSION”


  • Hallo,

    vielen Dank für den Beitrag das ist genau das was ich suche….aber wo ist der Code hin? =(

    Gruß

    Rene

  • Hallo Rene,

    die beiden Code-Blöcke sind vermutlich bei einem der letzten WordPress-Updates abhanden gekommen.
    Ich versuche das heute Abend zu rekonstruieren bzw. aus dem Projekt auszulesen.

    Gruß, Martin

  • Hmm, komisch, ich kann die beiden Code-Blöcke in Opera 11 sehen – welchen Browser nutzt du?
    Ich kopier den Code mal hier in die Antwort (der untere Absatz ist der funktionierende)

    Das sieht dann so aus:

    < ?php session_start();
    // beliebiger Code
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_COOKIE, session_name() . "=" . session_id());
    curl_exec($ch);
    curl_close($ch);
    ?>

    ………..

    Das erledigt session_write_close(); für uns.

    < ?php session_start();
    // beliebiger Code
    session_write_close();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_COOKIE, session_name() . "=" . session_id());
    curl_exec($ch);
    curl_close($ch);
    ?>

  • Hey,

    ich nutze Firefox 3.6.15. WordPress dürfte damit eigentlich keine Probleme haben…

    Gruß

    Rene

Leave a Reply