2012-04-14 5 views
0

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!

+0

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

Antwort

0

Endlich nach endlosen Debugging und Umgebungswechsel habe ich die Lösung !!!

Ich fand Es ist das Problem der PHP-Version. Der CentOS VPS verwendet Cent OS 5.5 und PHP 5.1.6 als Standard, aber es hat Probleme beim Unterstützen von benutzerdefinierten Session-Save-Handlern. Es ist seltsam, dass niemand und kein Arzt das erwähnt hat !!! Meine Vorschläge verwenden PHP Version 5.2.6 oder höher, um diese Funktion zu verwenden.

+0

Freut mich zu hören, dass es funktioniert. Sollte gemerkt haben, dass es ein Problem mit der PHP-Version gegeben hat, obwohl die meisten von uns davon ausgehen, dass alle inzwischen auf 5.3.10+ sind, einige sogar auf 5.4. –

+0

Vielen Dank für Ihre Hilfe durch dieses Problem Mike! – nemozhp

+0

@nemozhp: Die Ursache dieses Support- und Dokumentationsproblems liegt bei CentOS. Ich glaube Centos 5 Standard-Repos bieten bis zu 5.3.3. Centos 6 Repos bieten nur bis zu 5.3.6, wenn ich mich erinnere. Die gewünschten Pakete haben das Präfix "php53-", _nicht_ die älteren "php-" Pakete, die eigentlich nur PHP 5.2 sind. PHP 5.2 wird mehr oder weniger nicht mehr von PHP unterstützt. –

Verwandte Themen