Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 无法使自定义会话保存处理程序在centOS中工作(未调用注册的方法)_Php_Mysql_Session - Fatal编程技术网

Php 无法使自定义会话保存处理程序在centOS中工作(未调用注册的方法)

Php 无法使自定义会话保存处理程序在centOS中工作(未调用注册的方法),php,mysql,session,Php,Mysql,Session,我遇到了一个奇怪的问题。linux中的会话保存处理程序无法正常工作相同的代码可以在本地windows平台上正常工作。。以下是我的会话保存处理程序代码: <?php class session { public static function init() { session_set_save_handler('session::open', 'session::close', 'session::read', 'session::write', 'session::dest

我遇到了一个奇怪的问题。linux中的会话保存处理程序无法正常工作相同的代码可以在本地windows平台上正常工作。。以下是我的会话保存处理程序代码:

<?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();
  }
}
session::init();
session_start();
但是在静态类会话中没有调用任何方法。在调用会话启动后,应用程序似乎停止运行

我使用的php版本是php版本5.1.6。我不知道它是否与php.ini相关,还是db的某些特权导致了这些问题?我正在使用根db用户,并且连接已设置

下面是session的php.ini设置根据Mike Purcell的建议,我已将session.save_路径从/var/lib/php/session更改为/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
错误消息是: 致命错误:会话启动[]:未能初始化存储模块:用户路径:/tmp


请帮忙,谢谢

经过无休止的调试和环境更改,我终于找到了解决方案


我发现这是php版本的问题。CentOS VPS默认使用CentOS 5.5和PHP 5.1.6,但在支持自定义会话保存处理程序方面存在问题。奇怪的是没有人和医生提到这件事!!!我的建议是使用PHP 5.2.6版或更高版本来使用此功能。

我在linux中使用虚拟主机,但我比较了windows设置和linux设置之间的phpInfo,发现虚拟目录支持选项已禁用,这有关系吗,如果有,我如何将其更改为启用?很高兴听到您让它正常工作。应该已经意识到PHP版本可能有问题,尽管我们大多数人认为现在每个人都在5.3.10+上,有些人甚至在5.4上。感谢您通过这个问题提供的帮助,Mike@nemozhp:这种支持和文档问题的根源在于CentOS。我相信Centos 5违约回购协议提供了5.3.3。如果我记得的话,Centos 6回购协议最多只能提供5.3.6。您想要的包的前缀是php53-,而不是旧的php-包,它们实际上只是php5.2。PHP或多或少不再支持PHP5.2。@nemozhp:另外,如果您是为PHP5.1编程,您已经落后6年半了。如果使用PHP5.2,您将落后5年半。从那以后,出现了一些漏洞、安全漏洞和增强功能,如果你突然升级,这些漏洞、漏洞和增强功能实际上可能会削弱你的应用程序。因此,尽管升级到5.3.6甚至5.4.1之后最终是维护现代健康网站的最佳方案,但您应该小心,首先在单独的开发主机中测试/修复所有内容,因为这可能会破坏您的整个代码库。@bob the destroyer:谢谢您的评论,我只是使用了一个vps myhosting,它使用PHP5.1作为默认设置。我刚换了一个副总裁,这是明智的选择。