Ich traf ein seltsames Problem. Der Session-Save-Handler in Linux kann nicht normal funktionieren (derselbe Code kann in meiner lokalen Windows-Plattform gut funktionieren). Hier ist mein Code für Session Save Handler:Kann nicht benutzerdefinierte Session speichern Handler arbeiten (keine registrierte Methode genannt) in CentOS
<?php
class session
{
public static function init()
{
session_set_save_handler('session::open', 'session::close', 'session::read', 'session::write', 'session::destroy', 'session::gc');
}
public static function open($save_path, $session_name)
{
if (!is_dir($save_path)) {
mkdir($save_path, 0777);
}
return true;
}
public static function close()
{
return true;
}
public static function read($sid)
{
global $db, $user;
register_shutdown_function('session_write_close');
if (!isset($_COOKIE[session_name()])) {
$user = anonymousUser($sid);
return '';
}
$result = $db->query('SELECT s.data as session_data, s.* , u.* FROM users u INNER JOIN sessions s ON u.uid = s.uid WHERE s.sid = "' . $db->escape($sid) .
'" AND timestamp >= ' . $db->escape(TIMESTAMP - Bl_Config::get('session.lifetime', 10800)));
$user = $result->row();
if ($user) {
$data = $user->session_data;
unset($user->passwd, $user->session_data);
if ($user->uid > 0 && $user->status == 1) {
$userInstance = User_Model::getInstance();
$user->roles = $userInstance->getUserRoles($user->uid);
$user->roles[] = User_Model::ROLE_AUTHENTICATED_USER;
$user->permissions = array();
$user->data = (isset($user->data) && $user->data) ? unserialize($user->data) : array();
foreach ($user->roles as $rid) {
$user->permissions = array_merge($user->permissions, $userInstance->getRolePermissions($rid));
}
$user->permissions = array_unique($user->permissions);
} else {
$user = anonymousUser($sid);
}
return $data;
} else {
$user = anonymousUser($sid);
return '';
}
}
public static function write($sid, $data)
{
global $db, $user;
if (!isset($user) || ($user->uid == 0 && empty($_COOKIE[session_name()]) && empty($data))) {
return true;
}
$uri = '/' . Bl_Core::getUri();
$db->exec('UPDATE sessions SET uid = ' . $db->escape($user->uid) . ', ip = "' . $db->escape(ipAddress()) .
'", uri = "' . $db->escape($uri) . '", data = "' . $db->escape($data) . '", timestamp = ' .
$db->escape(TIMESTAMP) . ' WHERE sid = "' . $db->escape($sid) . '"');
if (!$db->affected()) {
$db->exec('INSERT IGNORE INTO sessions (sid, uid, ip, uri, data, timestamp) VALUES ("' . $db->escape($sid) .
'", ' . $db->escape($user->uid) . ', "' . $db->escape(ipAddress()) . '", "' . $db->escape($uri) . '", "' .
$db->escape($data) . '", ' . $db->escape(TIMESTAMP) . ')');
}
return true;
}
public static function destroy($sid)
{
global $db;
$db->exec('DELETE FROM sessions WHERE sid = "' . $db->escape($sid) . '"');
return true;
}
public static function gc($lifetime)
{
global $db;
$db->exec('DELETE FROM sessions WHERE timestamp < ' . $db->escape(TIMESTAMP - Bl_Config::get('session.lifetime', 10800)));
return true;
}
public static function count($timestamp = 0, $hasAnonymous = true)
{
global $db;
if (!$hasAnonymous) {
$cond = ' AND uid > 0';
} else {
$cond = '';
}
$result = $db->query('SELECT COUNT(0) FROM sessions WHERE timestamp > ' . $timestamp . $cond);
return $result->one();
}
}
Hier ist die Art, wie ich die Session Save Handler aufrufen:
session::init();
session_start();
Aber keine Methode wurde in der statischen Klasse Sitzung aufgerufen. Und anscheinend hat die App nach dem Aufruf von session_start() angehalten.
Die PHP-Version, die ich verwendete, ist PHP Version 5.1.6
. Ich weiß nicht, ob es mit php.ini verwandt ist oder ein Privileg für db solche Probleme verursacht? Ich benutze den Benutzer root db und die Verbindung wurde bereits festgelegt ...
Hier ist php.ini Einstellungen für die Sitzung (nach Mike Purcells Vorschlag habe ich den session.save_path von "/ var/lib/php/session“auf "/ tmp"):
session.save_handler = files
session.save_path = "/tmp"
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path =/
session.cookie_domain =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.bug_compat_42 = 0
session.bug_compat_warn = 1
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
Und die Fehlermeldung lautet: Fatal error: session_start() [<a href='function.session-start'>function.session-start</a>]: Failed to initialize storage module: user (path: /tmp)
Bitte helfen, danke!
Ich benutze einen virtuellen Host in Linux, aber ich vergleiche 'phpInfo()' zwischen meinen Windows-Einstellungen und Linux-Einstellungen, fand ich die Option für 'Virtual Directory Support'ist' deaktiviert', ist das wichtig, wenn ja , wie kann ich es auf "aktiviert" ändern? – nemozhp