Почему мое приложение не может найти обработчик сеанса? Я получаю это за ошибку:Неустранимая ошибка: класс 'xxx' не найден
Fatal error: Class 'Session' not found in /Users/Eamon/Sites/index.php on line 2
EDIT 2 (переработан index.php)
Вот мой index.php:
<?php
class Session
{
private $savePath;
function open($savePath, $sessionName)
{
$this->savePath = $savePath;
if (!is_dir($this->savePath)) {
mkdir($this->savePath, 0777);
}
return true;
}
function close()
{
return true;
}
function read($id)
{
return (string)@file_get_contents("$this->savePath/sess_$id");
}
function write($id, $data)
{
return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
}
function destroy($id)
{
$file = "$this->savePath/sess_$id";
if (file_exists($file)) {
unlink($file);
}
return true;
}
function gc($maxlifetime)
{
foreach (glob("$this->savePath/sess_*") as $file) {
if (filemtime($file) + $maxlifetime < time() && file_exists($file)) {
unlink($file);
}
}
return true;
}
}
$handler = new Session();
session_set_save_handler(
array($handler, 'open'),
array($handler, 'close'),
array($handler, 'read'),
array($handler, 'write'),
array($handler, 'destroy'),
array($handler, 'gc')
);
// the following prevents unexpected effects when using objects as save handlers
register_shutdown_function('session_write_close');
session_start();
// proceed to set and retrieve values by key from $_SESSION
// set time-out period (in seconds)
$inactive = 600;
// check to see if $_SESSION["timeout"] is set
if (isset($_SESSION["timeout"])) {
// calculate the session's "time to live"
$sessionTTL = time() - $_SESSION["timeout"];
if ($sessionTTL > $inactive) {
session_destroy();
echo "session destroyed;"
}
}
?>
<html>...<html>
<?php
session_destroy();
?>
session.php (я в основном скопировали это отсюда: http://phpmaster.com/writing-custom-session-handlers/):
EDIT (добавлен интерфейс, как показано ниже).
<?php
interface SessionHandlerInterface
{
public function open($path, $name);
public function read($sessionId);
public function write($sessionId, $data);
public function close();
public function destroy($sessionId);
public function gc($lifetime);
}
class Session implements SessionHandlerInterface {
// implement interfaces here
function open($path, $name) {
$db = new PDO("mysql:host=localhost;dbname=itit", "root", "bonjour3");
$sql = "INSERT INTO session SET session_id =" . $db->quote($sessionId) . ", session_data = '' ON DUPLICATE KEY UPDATE session_lastaccesstime = NOW()";
$db->query($sql);
}
function read($sessionId) {
$db = new PDO("mysql:host=localhost;dbname=itit", "root", "bonjour3");
$sql = "SELECT session_data FROM session where session_id =" . $db->quote($sessionId);
$result = $db->query($sql);
$data = $result->fetchColumn();
$result->closeCursor();
return $data;
}
function write($sessionId, $data) {
$db = new PDO("mysql:host=localhost;dbname=itit", "root", "bonjour3");
$sql = "INSERT INTO session SET session_id =" . $db->quote($sessionId) . ", session_data =" . $db->quote($data) . " ON DUPLICATE KEY UPDATE session_data =" . $db->quote($data);
$db->query($sql)
}
function close() {
$sessionId = session_id();
//perform some action here
}
function destroy($sessionId) {
$db = new PDO("mysql:host=localhost;dbname=itit", "root", "bonjour3");
$sql = "DELETE FROM session WHERE session_id =" . $db->quote($sessionId);
$db->query($sql);
setcookie(session_name(), "", time() - 3600);
}
function gc($lifetime) {
$db = new PDO("mysql:host=localhost;dbname=itit", "root", "bonjour3");
$sql = "DELETE FROM session WHERE session_lastaccesstime < DATE_SUB(NOW(), INTERVAL " . $lifetime . " SECOND)";
$db->query($sql);
}
}
?>
Спасибо за любую помощь!
UPDATE
Я исправил несколько ошибок ... Я отредактировал мой код выше, чтобы отразить мои изменения, однако у меня есть несколько новых ошибок, которые нуждаются в сортировке:
Warning: Wrong parameter count for session_set_save_handler() in /Users/Eamon/Sites/index.php on line 4
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /Users/Eamon/Sites/index.php:1) in /Users/Eamon/Sites/index.php on line 5
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /Users/Eamon/Sites/index.php:1) in /Users/Eamon/Sites/index.php on line 5
UPDATE 2
По-видимому,
The function session_set_save_handler requires six parameters be passed to it.
Я прочитал это здесь: http://forums.phpfreaks.com/topic/18940-session-set-save-handler-problem/
UPDATE 3
Исправлена ошибка выше параметра ... просто поставить класс сеанса непосредственно в моем index.php (я изменил код выше, чтобы отразить мои изменения в index.php). В принципе ... У меня именно то, что вы видите в примере 2 здесь - http://php.net/manual/en/function.session-set-save-handler.php.
Вот новая ошибка я получаю:
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /Users/Eamon/Sites/templates/showuser.php:1) in /Users/Eamon/Sites/templates/showuser.php on line 2
Вот showuser.php:
<?php
session_start();
$host="localhost"; // Host name
$uname="root"; // Mysql username
$password="bonjour3"; // Mysql password
$db_name="itit"; // Database name
$tbl_name="users"; // Table name
// Connect to server and select database.
$mysqli = mysqli_connect($host, $uname, $password, $db_name);
$stmt = $mysqli->prepare("SELECT email FROM users WHERE username = ?");
$stmt->bind_param("s", $_SESSION["username"]);
$stmt->execute();
$stmt->bind_result($em);
$stmt->fetch();
?>
<h2>Username - Email</h2>
<div id="userinfo"><? echo $_SESSION["username"] ?> - <? echo $em ?></div>
<?
$stmt->close();
mysqli_close($mysqli);
?>
снова ... проверить изменения, которые я сделал в index.php (Файл session.php больше не существует).
@ YogeshSuthar..fixed it - но теперь я получаю 'Fatal error: Interface 'SessionHandlerInterface' не найден в xxx' Я нашел это - http://php.net/manual/en/class.sessionhandlerinterface.php. Ниже приведен комментарий, чтобы добавить его в пространство имен ... я не знаю, что это значит. – ewizard
@ewizard Вы должны также включить путь к этому интерфейсу. –
, поэтому мне нужно создать интерфейс в файле с именем SessionHandlerInterface.php? Или я могу это сделать откуда-то ... У меня нет этого файла в моем каталоге. – ewizard