PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Session mit PHP4.0.6



Pingu
10-01-2005, 13:54
Ich habe ein Problem mit Sessions und der PHP Version 4.0.6.

Ich habe lokal die PHP Version 4.1.2 laufen und beim Provider läuft PHP Version 4.0.6. Nach der Dokumentation bei php.net kommt im Zusammenhang mit PHP4.1.2 die superglobale Variable $_SESSION und mit PHP4.0.6 die globale Variable $HTTP_SESSION_VARS zum Einsatz. Diese sollte man nach dem Manual der Funktion session_register() vorziehen. Da ich aber nicht jedes mal alles anpassen will, habe ich mir folgende Funktionen zum Zugriff auf die Variablen geschrieben:

function SESSIONSet($name, $var) {

global $HTTP_SESSION_VARS;

if (empty($name)) return;
if (!is_string($name)) return;
if (empty($var)) return;

if (isset($_SESSION)) $_SESSION[$name] = $var;
if (isset($HTTP_SESSION_VARS)) $HTTP_SESSION_VARS[$name] = $var;

} // function SESSIONSet($name, $var)

function SESSIONGet($name) {

global $HTTP_SESSION_VARS;

if (empty($name)) return NULL;
if (!is_string($name)) return NULL;

if (isset($HTTP_SESSION_VARS)) $return = $HTTP_SESSION_VARS[$name];
if (isset($_SESSION)) $return = $_SESSION[$name];

return $return;

} //function SESSIONGet($name)

Diese möchte ich dann einfach im normalen Ablauf entsprechend nutzten, z.B.:
$SESSIONContact = SESSIONGet("contact");bzw.
SESSIONSet("contact", $SESSIONContact);

Mit PHP4.1.2 funktioniert dies auch problemlos. Deshalb bin ich davon ausgegangen, daß dies mit PHP4.0.6 auch gehen müßte. Denn laut Manual muß man $_SESSION nur durch $HTTP_SESSION_VARS ersetzen, weil beides ist äquivalent.
Leider ist dem nicht so. Deshalb habe ich die Funktionen folgenderweise abgewandelt:

function SESSIONSet($name, $var) {

//global $HTTP_SESSION_VARS;

if (empty($name)) return;
if (!is_string($name)) return;
if (empty($var)) return;

if (isset($_SESSION)) $_SESSION[$name] = $var;
//if (isset($HTTP_SESSION_VARS)) $HTTP_SESSION_VARS[$name] = $var;
$GLOBALS["HTTP_SESSION_VARS"][$name] = $var;

} // function SESSIONSet($name, $var)

function SESSIONGet($name) {

//global $HTTP_SESSION_VARS;

if (empty($name)) return NULL;
if (!is_string($name)) return NULL;

$return = $GLOBALS["HTTP_SESSION_VARS"][$name];
//if (isset($HTTP_SESSION_VARS)) $return = $HTTP_SESSION_VARS[$name];
if (isset($_SESSION)) $return = $_SESSION[$name];

return $return;

} //function SESSIONGet($name)

Leider hat die Verwendung der superglobalen Variable $GLOBALS auch nicht zu Ziel geführt.
Ich habe mir dann mal mit phpinfo() [nach einem vorherigen session_start()] alles anzeigen lassen, um festzustellen, daß zwar die Variablen $HTTP_COOKIE_VARS, $HTTP_SERVER_VARS und $HTTP_ENV_VARS gesetzt sind. Aber die Variable $HTTP_SESSION_VARS nicht gesetzt ist.

PHP4.0.6 scheint die Session-ID aber ganz normal zu vergeben. Sie wird beim ersten Aufruf in alle Links richtig als Parameter eingesetzt und als Cookie gesendet. Laut phpinfo() werden Sessions auch unterstützt.

Ich habe auch nocheinmal das simple Beispiel vom Manual genommen und ausprobiert:
<?php
session_start();
// Verwenden Sie bei PHP 4.0.6 oder niedriger $HTTP_SESSION_VARS
if (!isset($HTTP_SESSION_VARS['zaehler'])) {
$HTTP_SESSION_VARS['zaehler'] = 0;
} else {
$HTTP_SESSION_VARS['zaehler']++;
}
echo $HTTP_SESSION_VARS['zaehler'];
?>
Aber auch das geht nicht. Der Zähler erhöht sich nicht.

Also meine Fragen: Weiß jemand woran das liegen könnte? Habe ich irgendetwas übersehen? Das simple Beispiel müßte doch ohne jede weitere Einstellung funktionieren, oder nicht? Bin ich schon betriebsblind?

Pingu

PS: Ich habe noch die Info gefunden, daß es mit dem Save-Handler zu tun haben könnte. Deshalb habe ich den session.save_path über ini_set() von /tmp auf /[DOCUMENT_ROOT]/tmp gesetzt, weil da habe ich per FTP Zugriff. Dort habe ich dann gesehen, daß das File sess_[PHPSESSIONID] mit der Länge 0 und den Zugriffsrechten des Webservers erstellt wurde. Also prinzipiell scheint PHP da irgendetwas zu machen. Nur noch nicht ganz was es soll.
Folgend noch der relevant Abschnitt aus der phpinfo():

Session Support enabled

Directive Local Value Master Value
session.auto_start Off Off
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.entropy_file no value no value
session.entropy_length 0 0
session.gc_maxlifetime 1440 1440
session.gc_probability 1 1
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path /var/net/www/www.can-cia.de/tmp /tmp
session.serialize_handler php php
session.use_cookies On On

Pingu
12-01-2005, 16:03
Ok, ich habe die Lösung zu meinem Problem gefunden. Falls andere mal auf das gleiche Problem stoßen sollten hier die Lösung:

Ich bin durch eine Google-Suche auf folgenden Beitrag bei phpBuilder.com gestoßen: http://www.phpbuilder.com/lists/php-general/2003031/0269.php

Dieser besagt im Wesentlichen (ich weiß nicht ob dies ein Feature oder ein Bug von PHP4.0.6 ist), daß wenn man register_globals=on hat, muß man die Funktion session_register() verwenden und wenn man register_globals=off hat, muß man die globale Variable $HTTP_SESSION_VARS verwenden. Angeblich soll dazu auch ein Hinweis im Manual stehen. Nur habe ich ihn noch nicht gefunden.

Pingu