Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Перебрать все файлы сессии
Форумы портала PHP.SU » » Работа с файловой системой и файлами » Перебрать все файлы сессии

Страниц (2): [1] 2 »
 

1. Contr - 05 Июля, 2014 - 11:34:30 - перейти к сообщению
Есть файлы сессий в папке $dir с таким содержимым:
CODE (htmlphp):
скопировать код в буфер обмена
  1. loggedIn|b:1;dbname|s:5:"S-H-V";pnum|d:5;depnum|i:5;smu|i:1;orgnum|i:1;time|s:1:"4";name|s:11:"Федот";objects|a:2:{i:0;a:3:{s:6:"objnum";i:1;s:7:"objname";s:27:"лч";s:7:"objtype";s:4:"line";}i:1;a:3:{s:6:"objnum";i:2;s:7:"objname";s:6:"УРГ";s:7:"objtype";s:2:"cs";}}objnum|i:1;objtype|s:4:"line";;

требуется удалить все файлы, в которых dbname === "S-H-V"
Есть ли готовые функции php для превращения из "этого" массива? самому писать лень Не понял
2. LIME - 05 Июля, 2014 - 11:41:05 - перейти к сообщению
нет
прав нет на прямые действия
храни сессии в бд(ручками их пиши и читай)
это гораздо гибче
3. Мелкий - 05 Июля, 2014 - 12:21:34 - перейти к сообщению
А потом окажется, что на боевой машине включен suhosin session encrypt

Допишите в бутстрапе/фронтконтроллере
PHP:
скопировать код в буфер обмена
  1. if (isset($_SESSION['dbname']) and 'S-H-V' == $_SESSION['dbname']) session_destroy();

И всё. Сборщик мусора сам приберётся.
4. Contr - 05 Июля, 2014 - 12:23:20 - перейти к сообщению
Мелкий, фишка в том, что session destroy надо вызвать с другой сессии.
(Добавление)
Мелкий пишет:
А потом окажется
не окажется. "машина" моя
5. LIME - 05 Июля, 2014 - 12:26:24 - перейти к сообщению
Contr пишет:
что session destroy надо вызвать с другой сессии.
а нафига
ну лежат они не собраные
но при первом же запросе будут удалены значит считай что их нет
если только из другого движка не создаются
и еще
обрати внимание
LIME пишет:
храни сессии в бд(ручками их пиши и читай)
можно делать любые выкрутасы
хотя может тебе не нужно
6. Contr - 05 Июля, 2014 - 12:31:08 - перейти к сообщению
LIME пишет:
можно делать любые выкрутасы
Возможно...
LIME пишет:
хотя может тебе не нужно
наверно...
Да и создание объекта ПДО постгре при простеньком запросе тоже не вариант
7. LIME - 05 Июля, 2014 - 12:34:06 - перейти к сообщению
а чтение файла каждый раз вариант?
создание объекта быстрее если данные не менялись(кэш запроса)
а если менялись всеравно может быть быстрее но никак не медленнее
(Добавление)
а по хорошему сессии надо хранить в memcache/redis
8. Contr - 07 Июля, 2014 - 14:37:45 - перейти к сообщению
Напишу решение:
(Добавление)
PHP:
скопировать код в буфер обмена
  1.  
  2. $dir = ini_get("session.save_path") . "/";
  3. $a = array_diff(scandir($dir), ['.', '..']);
  4.  
  5. foreach ($a as $v) {
  6.     if ('sess_' . session_id() !== $v) {
  7.         $a = file_get_contents($dir . $v);
  8.        
  9.         $arr = session::unserialize($a);
  10.         foreach ($arr as $val){
  11.             if(isset($val['b']) && $val['dbname'] === "S-H-V"){
  12.                 unlink ($dir . $v);
  13.             }
  14.         }
  15.     }
  16. }

(Добавление)
Как Вам такое решение? Хорошо
(Добавление)
Сам метод:
Спойлер (Отобразить)
9. esterio - 07 Июля, 2014 - 16:08:31 - перейти к сообщению
Contr
не срабортает. Думал такое будет работать но нет.
Проще делать так

как-то так
10. Contr - 07 Июля, 2014 - 18:29:48 - перейти к сообщению
esterio пишет:
Contr
не срабортает. Думал такое будет работать но нет.
Проще делать так

как-то так

Ну так перебирать сессии все равно надо. Откуда вы возьмете сессион ид?
Там то вся фишка в том, чтобы перебрать файлы сессии.
Что вы предложили, заменит только последнюю строчку: вместо unlink (удалить файл) написать сессион дестрой
(Добавление)
Так почему не сработает? У меня срабатывает. Все нормуль
11. esterio - 07 Июля, 2014 - 18:41:44 - перейти к сообщению
Contr пишет:
Так почему не сработает? У меня срабатывает. Все нормуль

Contr пишет:
$a = file_get_contents($dir . $v);

Я когда-то пробовал и мне не удавалось получить содержимое фала сессии. Может версия ПХП древняя незнаю
12. Contr - 07 Июля, 2014 - 18:44:47 - перейти к сообщению
esterio пишет:
Я когда-то пробовал и мне не удавалось получить содержимое фала сессии
Его и нельзя получить: он занят (если хоть раз в скрипте произошла инициализация сессии)
А вот чужие файлы читать и удалять никто не мешает
(Добавление)
свой тоже можно, если в скрипте не было обращения к сесиии
13. Мелкий - 07 Июля, 2014 - 18:47:40 - перейти к сообщению
Contr, прокомментируйте всё-таки вот это:
LIME пишет:
ну лежат они не собраные
но при первом же запросе будут удалены значит считай что их нет

Я не стал спрашивать повторно, т.к. LIME верно раскрыл мою мысль: каково обоснование к написанию своего сборщика мусора?
(Добавление)
Contr пишет:
он занят (если хоть раз в скрипте произошла инициализация сессии)

session_write_close
14. Contr - 07 Июля, 2014 - 19:05:35 - перейти к сообщению
Мелкий пишет:
Contr, прокомментируйте всё-таки вот это:
LIME пишет:

Раз Лайм пишет, вот и пускай коментирует )))
Я не понимаю о чем он пишет:
Кто собранный? Кто будет удален?
Суть в том, что в моем проекте (да и даже на этом форуме) при каждом запросе к серверу происходит проверка на доступность пользователя к своему функционалу. Задача: удалить выкинуть пользователя на страницу авторизации. Проще всего это сделать удалив файл сессии.

А насчет БД, ну этой хз)) То что теперь при каждом запросе надо создавать объект БД (PDO) - это выйдет дороговато. К тому же не все запросы вообще проходят класс "модель" с подклассом "БД" - в проекте есть "легкие" контроллеры, возвращающие сразу одной или два значений.
(Добавление)
Contr пишет:
session_write_close
за это спасибо
15. LIME - 07 Июля, 2014 - 20:01:17 - перейти к сообщению
чтение файла vs создание объекта
что быстрее?
нормальные люди давно не пользуются встроенными сессиями
а пояснять уже мне нечего
тем более не мои мысли просили пояснить
грустно это как-то

 

Powered by ExBB FM 1.0 RC1