Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Сохранение сессии
maax  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 92
Пользователь №: 41664
На форуме: 1 год, 4 месяца, 6 дней
Карма:




Может быть такое что если перезалить файл на сервак то файлы сессии удалятся ,заметил такую странную вещь ,если я не обновляю сайт , никакие файлы не трогаю,несколько дней сессия сохранена вылетов нету,только я решаю обновить один из 2х файлов Auth.class.php и ajax.php через некоторое время я обязательно вылечу или со всех устройств или с какого то одного,точно не понял каким образом это происходит,папку сохранения сессий сменил из tmp на свою,и оттуда они удаляются сами по себе

ini_set('session.save_path', $_SERVER['DOCUMENT_ROOT'] .'/sessions/');
ini_set('session.gc_maxlifetime', 604800);
session_start();


может кто увидит в этих файлах то что может затереть сессию или каким образом они пропадают

файл ajax.php

<?php

include './classes/Auth.class.php';
include './classes/AjaxRequest.class.php';

if (!empty($_COOKIE['sid'])) {
// check session id in cookies
session_id($_COOKIE['sid']);
}
session_start();

class AuthorizationAjaxRequest extends AjaxRequest
{
public $actions = array(
"login" => "login",
"logout" => "logout",
"register" => "register",
);


public function login()
{
if ($_SERVER["REQUEST_METHOD"] !== "POST") {
// Method Not Allowed
http_response_code(405);
header("Allow: POST");
$this->setFieldError("main", "Method Not Allowed");
return;
}
setcookie("sid", "");

$username = $this->getRequestParam("username");
$password = $this->getRequestParam("password");
$remember = !!$this->getRequestParam("remember-me");

if (empty($username)) {
$this->setFieldError("username", "Enter the username");
return;
}

if (empty($password)) {
$this->setFieldError("password", "Enter the password");
return;
}

$user = new Auth\User();
$auth_result = $user->authorize($username, $password, $remember);

if (!$auth_result) {
$this->setFieldError("password", "Invalid username or password");
return;
}

$this->status = "ok";
$this->setResponse("redirect", ".");
$this->message = sprintf("Hello, %s! Access granted.", $username);
}

public function logout()
{
if ($_SERVER["REQUEST_METHOD"] !== "POST") {
// Method Not Allowed
http_response_code(405);
header("Allow: POST");
$this->setFieldError("main", "Method Not Allowed");
return;
}

setcookie("sid", "");

$user = new Auth\User();
$user->logout();

$this->setResponse("redirect", ".");
$this->status = "ok";
}

public function register()
{
if ($_SERVER["REQUEST_METHOD"] !== "POST") {
// Method Not Allowed
http_response_code(405);
header("Allow: POST");
$this->setFieldError("main", "Method Not Allowed");
return;
}

setcookie("sid", "");

$username = $this->getRequestParam("username");
$password1 = $this->getRequestParam("password1");
$password2 = $this->getRequestParam("password2");

if (empty($username)) {
$this->setFieldError("username", "Enter the username");
return;
}

if (empty($password1)) {
$this->setFieldError("password1", "Enter the password");
return;
}

if (empty($password2)) {
$this->setFieldError("password2", "Confirm the password");
return;
}

if ($password1 !== $password2) {
$this->setFieldError("password2", "Confirm password is not match");
return;
}

$user = new Auth\User();

try {
$new_user_id = $user->create($username, $password1);
} catch (\Exception $e) {
$this->setFieldError("username", $e->getMessage());
return;
}
$user->authorize($username, $password1);

$this->message = sprintf("Hello, %s! Thank you for registration.", $username);
$this->setResponse("redirect", "/");
$this->status = "ok";
}
}


$ajaxRequest = new AuthorizationAjaxRequest($_REQUEST);
$ajaxRequest->showResponse();


файл Auth.class.php

<?php

namespace Auth;

class User
{
private $id;
private $username;
private $db;
private $user_id;

private $db_host = "localhost";
private $db_name = "testdb";
private $db_user = "testdb";
private $db_pass = "testdb";

private $is_authorized = false;

public function __construct($username = null, $password = null)
{
$this->username = $username;
$this->connectDb($this->db_name, $this->db_user, $this->db_pass, $this->db_host);
}

public function __destruct()
{
$this->db = null;
}

public static function isAuthorized()
{
if (!empty($_SESSION["user_id"])) {
return (bool) $_SESSION["user_id"];
}
return false;
}

public function passwordHash($password, $salt = null, $iterations = 10)
{
$salt || $salt = uniqid();
$hash = md5(md5($password . md5(sha1($salt))));

for ($i = 0; $i < $iterations; ++$i) {
$hash = md5(md5(sha1($hash)));
}

return array('hash' => $hash, 'salt' => $salt);
}

public function getSalt($username) {
$query = "select salt from users where username = :username limit 1";
$sth = $this->db->prepare($query);
$sth->execute(
array(
":username" => $username
)
);

$row = $sth->fetch();
if (!$row) {
return false;
}
return $row["salt"];
}

public function authorize($username, $password, $remember=false)
{
$query = "select id, username from users where
username = :username and password = :password limit 1"
;
$sth = $this->db->prepare($query);
$salt = $this->getSalt($username);

if (!$salt) {
return false;
}

$hashes = $this->passwordHash($password, $salt);
$sth->execute(
array(
":username" => $username,
":password" => $hashes['hash'],
)
);

$this->user = $sth->fetch();

if (!$this->user) {
$this->is_authorized = false;
} else {
$this->is_authorized = true;
$this->user_id = $this->user['id'];
$this->saveSession($remember);
}

return $this->is_authorized;
}

public function logout()
{
if (!empty($_SESSION["user_id"])) {
unset($_SESSION["user_id"]);
}
}


public function saveSession($remember = false, $http_only = true, $days = 7)
{
$_SESSION["user_id"] = $this->user_id;

if ($remember) {
// Save session id in cookies
$sid = session_id();

$expire = time() + $days * 24 * 3600;
$domain = ""; // default domain
$secure = false;
$path = "/";

$cookie = setcookie("sid", $sid, $expire, $path, $domain, $secure, $http_only);
}
}


public function create($username, $password) {
$user_exists = $this->getSalt($username);

if ($user_exists) {
throw new \Exception("User exists: " . $username, 1);
}

$query = "insert into users (username, password, salt)
values (:username, :password, :salt)"
;
$hashes = $this->passwordHash($password);
$sth = $this->db->prepare($query);

try {
$this->db->beginTransaction();
$result = $sth->execute(
array(
':username' => $username,
':password' => $hashes['hash'],
':salt' => $hashes['salt'],
)
);

$this->db->commit();
} catch (\PDOException $e) {
$this->db->rollback();
echo "Database error: " . $e->getMessage();
die();
}

if (!$result) {
$info = $sth->errorInfo();
printf("Database error %d %s", $info[1], $info[2]);
die();
}

return $result;
}

public function connectdb($db_name, $db_user, $db_pass, $db_host = "localhost")
{
try {
$this->db = new \pdo("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
} catch (\pdoexception $e) {
echo "database error: " . $e->getmessage();
die();
}
$this->db->query('set names utf8');

return $this;
}
}




Это сообщение отредактировал maax - 12.10.2016 - 11:01
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8737
Пользователь №: 26630
На форуме: 5 лет, 9 месяцев, 7 дней
Карма: 591




нативный сборщик мусора запускается по случайному закону, периодичность и вероятность его вызова определяется директивами session.gc_probability и session.gc_divisor
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maax  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 92
Пользователь №: 41664
На форуме: 1 год, 4 месяца, 6 дней
Карма:




killer8080

так писали же что он удаляет только из одной папки tmp или как то так ,если ее сменить то там это уже не будет работать

я и сменил и типо из своей папки уже ничего такой сборщик не удалит
ini_set('session.save_path', $_SERVER['DOCUMENT_ROOT'] .'/sessions/');

PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8737
Пользователь №: 26630
На форуме: 5 лет, 9 месяцев, 7 дней
Карма: 591




Цитата (maax @ 12.10.2016 - 17:28)
так писали же что он удаляет только из одной папки tmp или как то так ,если ее сменить то там это уже не будет работать

кто такую глупость сказал? Нативный сборщик мусора запускается после session_start() и использует действующий путь. Другое дело что нативный gc может быть отключен, как например в debian, там сессии чистятся bash скриптом по крону, там да, если в рантайме сменить путь, то скрипт чистильщик об этом не узнает.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maax  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 92
Пользователь №: 41664
На форуме: 1 год, 4 месяца, 6 дней
Карма:




killer8080

ну ты предлагаешь написать вот так?

ini_set('session.save_path', $_SERVER['DOCUMENT_ROOT'] .'/sessions/');
ini_set('session.gc_probability', 0);
session_start();


Это сообщение отредактировал maax - 13.10.2016 - 21:26
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8737
Пользователь №: 26630
На форуме: 5 лет, 9 месяцев, 7 дней
Карма: 591




Цитата (maax @ 13.10.2016 - 21:15)
ну ты предлагаешь написать вот так?

я ничего не предлагал, тем более бездумное отключение session gc. Для начала разберись для чего оно тебе нужно. Если решил отключить штатный gc, то взамен должен самостоятельно организовать альтернативный сборщик мусора, как в debian например. Если же тебе просто нужен "вечный логин", то решать это лучше через бд, а не продлением срока хранения сессий.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maax  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 92
Пользователь №: 41664
На форуме: 1 год, 4 месяца, 6 дней
Карма:




killer8080

ну я нашел скрипт на php который удаляет но все равно собираюсь на debian переезжать, короче буду на линуксе осваивать все
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса