Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > удаление сессии и как с эти бороться


Автор: Sniper 19.7.2008, 20:16
проблема такая.

Мои скрипты могут стоять без действия сутками, т.е человек вечером поработал с сайтом  и оставил компьютер включённым на нём [на сайте] - пришёл утром и продолжил работу (его сессия не должна удалиться)

но как известно через 24 минуты простоя "мусоросборщик" вычищает просроченные сессии рандомно с вероятностью 1%

как сделать чтобы данные сессии не удалялись по крайней мере неделю? Может как-то через cookie? или сессиями можно обойтись?

Автор: Feldmarschall 19.7.2008, 20:18
Это противоречит принципу работы сессий.
Что у тебя такого важного в сессии хранится, что нельзя записать туда заново?

Автор: Sniper 19.7.2008, 20:20
Цитата

Что у тебя такого важного в сессии хранится, что нельзя записать туда заново?

всё как у всех IP адрес и логин пользователя
Цитата


что нельзя записать туда заново?


вот тут не понятно, как перезаписать?

Автор: Feldmarschall 19.7.2008, 20:54
И всего-то?  И ты думаешь, что если тебя этот форум запомнил то это он сессию на год растянул?
автологин куками делается, а не сессиями

Автор: Sniper 19.7.2008, 21:32
Цитата(Feldmarschall @  19.7.2008,  17:54 Найти цитируемый пост)
автологин куками делается, а не сессиями 

а как?

Автор: Feldmarschall 19.7.2008, 21:59
осподи.
да посмотри в любом поисковике "PHP автологин"
ставишь куку. уникальную для юзера. если пришла - логин и пароль вводить не надо.
что непонятного-то?

Автор: Sniper 19.7.2008, 22:27
т.е надо сессии удалить и переделать всё на куки?

Автор: Feldmarschall 19.7.2008, 22:30
господи, твоя воля
нет, переделывать не надою.
авторизация делается сессиями.
автологин - куками

Автор: Sniper 19.7.2008, 22:43
Цитата

авторизация делается сессиями.
автологин - куками

какова последовательность действий всего этого? 

1. создаём сессию
2. записываем логин в сессию
3. создаём куку
4. записываем логин пароль в куку (шифруем)

Теперь сессия перестала существовать. что тогда делать?
заново создавать сессию? из куки записывать в сессию данные?

Автор: Feldmarschall 19.7.2008, 22:46
1. просим логин, пароль и галочку "запомнить меня", как это проиходит на этом форуме и на миллионах других сайтов, некоторые из которых ты, может быть, как я очень надеюсь, видел.
2. проверяем логин и пароль. если правильные, то
3. стартуем сессию.
4. проверяем галочку, и если нажата, то ставим уникальную куку.
а дальше -
0. проверяем куку, и, если есть, то не просим п.1 и не делаем п.2, а сразу п.3

Автор: Sniper 19.7.2008, 22:57
если выйти с сайта, то да так и будет. А если я нахожусь на какойто странице, я афк, прошли 24 минуты я вернулся, тыкаю на какую-то кнопку на этой странице, а всё, сессии нет уже, что тогда? по нажатию кнопки стартовать сессию? а так нельзя "заголовки уже отправлены" ;-). что то я пока не понимаю ;-(

Автор: Feldmarschall 19.7.2008, 23:01
Цитата(Sniper @  19.7.2008,  22:57 Найти цитируемый пост)
"заголовки уже отправлены"

С какой стати? 

Какая разница "находишься ты на странице и вернулся" или "выйти с сайта а потом зайти"? Что вообще такое "нахожусь на странице"?
Тебя, похоже, надо послать популярную ссылку на танке почитать.

Автор: Sniper 19.7.2008, 23:11
сейчас страницы выглядят примерно так:

somepage.php
Код

<?php
session_start();
<div>
<span>$_SESSION['id_user'];</span></div>

if (isset($_POST['actionbutton'])) { //исключительно в целях демонстрации ;-)
  print $_SESSION['id_user'];
}

<form action="" method="post">
<input type="submit" value="submit" name="actionbutton"/>
</form>
?>


вот у меня в браузере эта страница http://mymegasuperhost.ru/somepage.php (я нахожусь на странице somepage.php]) сессия активна и всё хорошо. можно кликать на кнопку и мы увидим логин пользователя.

Если сессия удалилась(прошли 24 минуты) а я нажал на кнопку Submit, то я получаю кучу ошибок, потому что $_SESSION['id_user'] то уже нету.


Так вот вопрос: что делать когда на кнопку нажали, а сессии уже нет?

Автор: Feldmarschall 19.7.2008, 23:20
Я даже затрудняюсь, что на это ответить.

Ну, чтобы не было ошибок, надо, наверное, проверять.
Если юзер залогинен, то выводить $_SESSION['id_user']. а если не залогинен - то не выводить.
Тогда и ошибок не будет.

Цитата(Sniper @  19.7.2008,  23:11 Найти цитируемый пост)
что делать когда на кнопку нажали, а сессии уже нет?

а что сделать, когда с сайта ушли, и назад пришли - ты знаешь? Вот и сделай то же самое.

Автор: Sniper 19.7.2008, 23:30
Цитата
Если юзер залогинен, то выводить $_SESSION['id_user']. а если не залогинен - то не выводить.
Тогда и ошибок не будет.


здорово конечно, но так не пойдёт ;-) 

Код

if (isset($_POST['actionbutton'])) {
  echo "тут выводим нужный текст";
//тут проверили куки допустим (хотя это жесть проверять куки на каждой такой кнопке)
//стартуем сессию
  session_start(); //я не могу написать так как на печать было выведено выше
// читаем куки и присваиваем сессии значения этих куки
}

Автор: Feldmarschall 19.7.2008, 23:38
а зачем ты поменял местами if (isset($_POST['actionbutton']))  и session_start(); ?

вообще, эти смайлики твои меня немного раздражают. ты бы писал поподробнее. чтобы я сразу на все твои вопросы ответил.
ты каких-то элементарных вещей не понимаешь, но я никак не могу понять - каких именно.
я пока только понял, как ты пишешь код - накопировал разных кусков, про которые где-то сказали, что "так правильно". но при этом зачем они, и как работают - понимание слабое. А часто - вообще неправильное. В результате и получаются такие усмешечки "так не пойдёт ;-)"
пойдет. все пойдет. если хотя бы чуть-чуть выучить, что такое веб-сайт и как он общается с браузером.
а если уж ты сподобишься проверять свои идеи на практике - так и вовсе проблем никаких не будет.

Добавлено через 10 минут и 9 секунд
Как я уже упоминал, по такой схеме работают все сайты - от этого до мейл.ру. поэтому первый шаг к реализации - это сначала ПОВЕРИТЬ мне. Что сработает. Этим ты значительно облегчишь себе задачу.

Автор: Sniper 20.7.2008, 09:12
Цитата(Feldmarschall @  19.7.2008,  20:38 Найти цитируемый пост)
а зачем ты поменял местами if (isset($_POST['actionbutton']))  и session_start(); ?

да не менял я их местами! ты думаешь что я вообще ламер?
полный код (для понимания):

Код

<?php
session_start();
<div>
<span>$_SESSION['id_user'];</span></div>
if (isset($_POST['actionbutton'])) {
  echo "тут выводим нужный текст";
//тут проверили куки допустим (хотя это жесть проверять куки на каждой такой кнопке)
//стартуем сессию
  session_start(); //я не могу написать так как на печать было выведено выше
// читаем куки и присваиваем сессии значения этих куки
}
<form action="" method="post">
<input type="submit" value="submit" name="actionbutton"/>
</form>
?>



Цитата(Feldmarschall @  19.7.2008,  20:38 Найти цитируемый пост)
я пока только понял, как ты пишешь код - накопировал разных кусков, про которые где-то сказали, что "так правильно". 

ха ха ха.

как сделать автологин я понял.

расмотрим ещё раз код.

Код

<?php
session_start();
<div>
<span>$_SESSION['id_user'];</span></div>
if (isset($_POST['actionbutton'])) { //исключительно в целях демонстрации ;-)
  print $_SESSION['id_user'];
}
<form action="" method="post">
<input type="submit" value="submit" name="actionbutton"/>
</form>
?>


Давай так, на примере ещё раз.
значение $_SESSION ['id_user'] используются везде у меня в коде.
когда сессия пропадает через 24 минуты , пропадает и это значение массива - мне нужно его восстановить в общем сделать так чтобы оно не удалялось довольно долго. Как это сделать?

Автор: Nigel 20.7.2008, 09:59
для начала прочитайте http://phpfaq.ru/session. Для того, чтобы сессия жила дольше 24 мин., есть session.gc_maxlifetime.
В первом куске кода: зачем на 9-й строке стартуете сессию, если она уже есть на 2-ой?

Автор: Feldmarschall 20.7.2008, 10:30
Nigel, для того, чтобы сессия жила дольше 24 мин. должны быть очень веские основания. И уж никак к этим основаниям не относятся туманные представления об основах функционирования веб-сайтов.

Добавлено @ 10:33
Если ты понял, как сделать автологин, то какая проблема сделать в начале страницы автологин, и спокойно продолжить работу?
Думаю, тебе надо ещё с ним разобраться.
Предлагаю эту тему закрыть, поскольку вопрос "как продлить сессию" не имеет практического смысла, и начать новую, посвященную автологину.


Автор: Sniper 20.7.2008, 12:25
размышляя в стоматологическом кресле я понял как надо сделать:

начало любой страницы

Код

<?php

session_start();

if (!isset($_SESSION['id_user'])) {
  $_SESSION['id_user'] = $_COOKIE['username'];
}



когда пользователь первый раз логинится сделать соответствующие setcookie 

правильно?

Автор: Feldmarschall 20.7.2008, 12:30
не совсем. реальная система сильно сложнее. но примерно так, да.
если писать просто id, то любой сможет залогиниться под видом любого юзера - id обычно найти совсем несложно. твой, например, здесь - 192.
надо писать что-то уникальное, и проверять по базе.

Автор: Sniper 20.7.2008, 14:19
Цитата

надо писать что-то уникальное, и проверять по базе.


что-то уникальное это что и по какой базе проверять?  smile 

Автор: Feldmarschall 20.7.2008, 14:22
случайное число. по базе данных. в которую его записать.

Автор: Sniper 20.7.2008, 17:23
Цитата(Feldmarschall @  20.7.2008,  11:22 Найти цитируемый пост)
случайное число. по базе данных. в которую его записать. 

а чем это отличается от просто id?
наверное это рандомное число надо менять с какой0то частотой... объясните подробнее

Автор: Feldmarschall 20.7.2008, 17:30
Отличается тем, что его никто не знает, в отличие от id
можешь сделать какой-нибудь хэш, к примеру, md5(секретное слово (общее для всего сайта+пароль юзера))

Автор: Sniper 20.7.2008, 19:40
Цитата

можешь сделать какой-нибудь хэш, к примеру, md5(секретное слово (общее для всего сайта+пароль юзера))



опять таки попрошу рассказать последовательность действий.

1. создаём секретное слово
2. пишем в БД, файл

что потом? как использовать?

3. 
4.

Автор: Feldmarschall 20.7.2008, 19:42
как обычно. 
точно так же, как с id
если у тебя пришел if в куке, ты можешь узнать по базе, что это за пользователь?
если у тебя пришел секретный идентификатор, то какая проблема ТОЧНО ТАК ЖЕ найти в базе запись, содержащую такую строку?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)