2008-10-04 8 views
7

Ich habe eine API, die abhängig von bestimmten Statusinformationen zwischen Anforderungen ist. Als eine einfache erste Version des Codes benutze ich einfach PHP-Sessions, um die Statusinformationen statt etwas fortgeschrittener zu speichern (APC, Memcache, DB). Während meiner ersten Tests in einem Webbrowser funktionierte alles perfekt. Es scheint jedoch, dass die Statusinformationen nicht erhalten werden, wenn Clients versuchen, eine Verbindung über Nicht-Browser-Methoden wie Curl oder wget herzustellen.In PHP wird eine Sitzung erstellt, wenn ein Browser nicht verwendet wird

Wird eine PHP-Sitzung nur erstellt, wenn ein Browser die Seite anfordert? Ich starte die Session explizit mit session_start() und benenne sie vorher mit session_name().

Eine zusätzliche Notiz. Ich erfuhr, dass eines der Hauptprobleme, das ich hatte, war, dass ich die Sitzung benannte, anstatt die Sitzungs-ID über Session-ID ($ ID) zu setzen; Meine Absicht bei der Verwendung von session_name() war es, die gleiche Sitzung, die zuvor erstellt wurde, abzurufen, und die richtige Weise, dies zu tun ist, indem Sie die Sitzungs-ID nicht den Sitzungsname festlegen.

Es scheint, dass Sitzungsinformationen auf dem Server wie unten angegeben gespeichert werden (DANKE). Aber um dies zu behalten, müssen Sie die Session-ID oder, wie in meinem Fall, eine andere ID übergeben, die den Benutzer eindeutig identifiziert. Verwenden Sie diese ID als Sitzungs-ID, und Ihre Sitzungen funktionieren wie erwartet.

Antwort

20

Session Cookies

, dass HTTP Denken Sie daran, ist staatenlos, so Sitzungen auf dem Server verfolgt werden, aber der Client hat sich mit jeder Anforderung zu identifizieren. Wenn Sie session_start(), deklarieren, setzt Ihr Browser normalerweise einen Cookie (die "PHP Session Id") und identifiziert sich dann selbst, indem er den Cookie-Wert mit jeder Anfrage sendet. Wenn ein Skript mit einer Anfrage mit einem Sitzungswert aufgerufen wird, versucht die Funktion session_start(), die Sitzung nachzuschlagen. Um dies zu beweisen, beachten Sie, dass Sitzungen sterben, wenn Sie Ihre Cookies löschen .. viele werden sogar sterben, sobald Sie den Browser verlassen, wenn der Cookie ein "Session" -Cookie (ein temporärer) ist. Sie haben erwähnt, dass Sie die Sitzung benennen. Sehen Sie in Ihren Browser-Cookies nach, ob Sie einen Cookie mit demselben Namen finden können.

All dies ist zu sagen, dass Cookies eine aktive Rolle in Ihren Sitzungen spielen, wenn also der Client Cookies nicht unterstützt, dann können Sie eine Sitzung nicht so machen, wie Sie es gerade tun. Zumindest nicht für diese alternativen Kunden. Eine Sitzung wird auf dem Server erstellt. die Frage ist, ob der Kunde teilnimmt oder nicht.

Wenn Cookies für Ihren Client keine Option sind, müssen Sie einen anderen Weg finden, um eine Sitzungs-ID an den Server zu übergeben. Dies kann beispielsweise in der Abfragezeichenfolge erfolgen, obwohl es als etwas weniger privat angesehen wird, eine Sitzungs-ID auf diese Weise zu senden.

mysite.com?PHPSESSID=10alksdjfq9e 

Wie kann dies speziell mit Ihrer Version von PHP variieren, aber es ist im Grunde nur eine Konfiguration. Wenn die richtigen Laufzeitoptionen eingestellt sind, fügt PHP die Session-ID transparent als einen Abfrageparameter zu den Links auf der Seite hinzu (natürlich nur aus der gleichen Quelle). Sie können die Besonderheiten für die Einstellung auf dem PHP website finden.

Seitennotiz: Vor Jahren war dies ein häufiges Problem beim Versuch, eine Sitzung zu implementieren.Cookies waren neuer und viele Leute haben die Cookie-Unterstützung in ihren Browsern wegen angeblicher Sicherheitsbedenken abgeschaltet.

Nebenbei bemerkt:@Uberfuzzy macht eine gute punkt- Sitzungen mit curl oder wget ist tatsächlich möglich. Das Problem ist, dass es weniger automatisch ist. Ein Benutzer kann Headerwerte in eine Datei ablegen und die Werte für zukünftige Anforderungen verwenden. curl hat einige "cookie awareness" -Flags, mit denen Sie leichter damit umgehen können, aber Sie müssen es immer noch explizit tun. Dann könnten Sie das wieder zu Ihrem Vorteil nutzen. Wenn auf Ihrem alternativen Client ein Curl verfügbar ist, können Sie den Anruf plausibel über die Cookie-Awareness-Flags selbst durchführen. Siehe curl manual.

+0

> aber, wenn der Client unterstützt keine Cookies (wie curl oder wget) tatsächlich. beide unterstützen eine Möglichkeit, eine Cookie-Datei zu speichern/zu laden – Uberfuzzy

+0

Guter Fang. Vielen Dank. – keparo

2

Wenn Sie session_start() aufrufen, wird eine Sitzung erstellt, wenn sich der Client nicht in einem vorhandenen befindet. Wenn der Client den Cookie- oder Querystring-Mechanismus, der zum Verwalten der Sitzung verwendet wird, nicht unterstützt (oder so konfiguriert ist, dass er ignoriert wird), wird bei jeder Anforderung eine neue Sitzung erstellt.

Dies kann Ihren Sitzungsspeichermechanismus mit nicht verwendeten Sitzungen aufblähen.

Es könnte eine bessere Idee sein, session_start() nur dann aufzurufen, wenn Sie etwas in der Sitzung speichern möchten (z. B. Benutzeranmeldung oder etwas anderes, was Roboter wahrscheinlich nicht tun), wenn Sie das für wahrscheinlich halten ein Problem sein.

2

Wird eine PHP-Sitzung nur erstellt, wenn ein Browser die Seite anfordert?

Kurze Antwort: Ja. Sitzungen wurden speziell zur Lösung des statuslosen HTTP-Problems mithilfe von Browserfunktionen erstellt. APC, memcached, DB usw. sind nicht wichtig. Dies sind nur Speichermethoden für die Sitzung und haben das gleiche Problem.

Längere Antwort: Das Konzept der Sitzungen wurde erstellt, um die Tatsache zu berücksichtigen, dass HTTP ein zustandsloses Protokoll ist, und es stellt sich heraus, dass dieser Zustand ziemlich wichtig für eine Vielzahl von Softwareanwendungen ist.

Die gebräuchlichste Methode zum Implementieren von Sitzungen ist mit Cookies. PHP sendet die Sitzungs-ID in einem Cookie und der Browser sendet das Cookie mit der Sitzungs-ID zurück. Diese ID wird auf dem Server verwendet, um Informationen zu finden, die Sie in der Sitzung gespeichert haben. PHP kann eine Sitzungs-ID am Ende einer URL einbinden und lesen. aber Dies setzt voraus, dass Benutzer zu Seiten auf Ihrer Website/Anwendung navigieren, indem sie auf Links klicken, die eine generierte Sitzungs-ID enthalten.

In Ihrem speziellen Fall ist es möglich, Cookies mit curl (und möglicherweise wget) zu verwenden. Curl ist ein Webbrowser, nur einer ohne GUI. Wenn es die Befehlszeile curl Programm ist Sie verwenden (im Gegensatz zu der C-Bibliothek gegenüber, PHP-Erweiterung, etc.) Lesen Sie auf den folgenden Optionen

-b/--cookie 
-c/--cookie-jar 
-j/--junk-session-cookies