Ich habe eine API, die von bestimmten Statusinformationen zwischen Anforderungen abhängig 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.
Wird eine PHP-Sitzung nur erstellt, wenn ein Browser die Seite anfordert? Ich starte die Sitzung explizit mit session_start () und benenne sie vorher mit session_name ().
Eine hinzugefügte 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 die Sitzungsinformationen auf dem Server gespeichert werden, wie unten angegeben (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.
Sitzungscookies
Denken Sie daran, dass HTTP statuslos ist, also werden Sitzungen auf Ihrem Server verfolgt, aber der Client muss sich bei jeder Anfrage selbst identifizieren. Wenn Sie session_start () deklarieren, setzt Ihr Browser normalerweise ein Cookie (die "PHP-Sitzungs-ID") und identifiziert sich dann selbst, indem er den Cookie-Wert bei jeder Anfrage sendet. Wenn ein Skript mit einer Anfrage mit einem Sitzungswert aufgerufen wird, versucht die Funktion session_start (), die Sitzung nachzuschlagen. Um dies selbst 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 (eine temporäre) 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 bedeutet, dass Cookies in Ihren Sitzungen eine aktive Rolle spielen. Wenn also der Client keine Cookies unterstützt , können Sie eine Sitzung nicht so ausführen, wie Sie es sind tut es derzeit .. zumindest nicht für diese alternativen Kunden. Eine Sitzung wird auf dem Server erstellt. Die Frage ist, ob der Client beteiligt ist oder nicht.
Wenn Cookies für Ihren Client keine Option darstellen, 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.
%Vor%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 finden die Einzelheiten dazu auf der PHP-Website .
Hinweis: 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.
Randbemerkung: @Uberfuzzy macht einen guten Punkt. Die Verwendung von 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 mit den Cookie-Awareness-Flags selbst durchführen. Siehe das Curl-Handbuch .
Wenn Sie session_start () aufrufen, wird eine Sitzung erstellt, wenn sich der Client nicht in einem vorhandenen befindet. Wenn der Client die zum Beibehalten der Sitzung verwendeten Cookies oder den Querystring-Mechanismus nicht unterstützt (oder nicht konfiguriert ist), wird bei jeder Anforderung eine neue Sitzung erstellt.
Dies kann Ihren Sitzungsspeichermechanismus mit nicht verwendeten Sitzungen aufblähen.
Es ist möglicherweise eine bessere Idee, 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.
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 werden unter dem gleichen Problem leiden.
Längere Antwort : Das Konzept der Sitzungen wurde erstellt, um der Tatsache Rechnung zu tragen, dass HTTP ein zustandsloses Protokoll ist, und es stellt sich heraus, dass dieser Zustand für eine Vielzahl von Softwareanwendungen ziemlich wichtig ist.
Die häufigste Art der Implementierung 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 am Ende einer URL eine Sitzungs-ID einschließen und lesen, aber setzt voraus, dass Benutzer zu Seiten auf Ihrer Website / Anwendung navigieren, indem sie auf Links klicken, die eine generierte Sitzungs-ID enthalten / p>
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 das Kommandozeilen-Curl-Programm ist, das Sie verwenden (im Gegensatz zur C-Bibliothek, PHP-Erweiterung, etc.) Lesen Sie die folgenden Optionen
%Vor%