За последние 24 часа нас посетили 30929 программистов и 1446 роботов. Сейчас ищут 860 программистов ...

Время жизни собственных данных в бд. Работа со временем в PHP.

Тема в разделе "PHP для новичков", создана пользователем askanim, 22 июн 2016.

  1. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Ребята у меня в связи с тем, что я пишу собственную библиотеку, есть вопросы по работе со временем в php не конкретно по каким либо функциям, я вроде покурил мануал, и тут скорее вопрос существенно о том как это лучше реализовать, ну и собственно задача которую я реализовываю.

    Я делаю общий модуль, аутентификации в библиотеки в связи с ним создаю сессии.

    Решил чтобы обеспечить лучшую защиту, я создаю при входе и регистрации сессию, но я сделал отдельно глобальную функцию

    Она вот, я её ещё пишу. Это так черновой набросок. Но структура будет примерно такая

    Что я решил сделать, я решил при открытии сессии, и и записывании в глобальный массив
    PHP:
    1. $_SESSION['Какой то ключ'] = $value
    Так же создавать под неё строчку в БД в таблице CFSSession.

    Таблица будет иметь такой вид.
    PHP:
    1. $this->int('id', '11');// integer primory A-I
    2.         $this->varchar('cfe_name', '30'); // Имя - это ключ Сессии, либо ключ к собственным глобальным переменным, или кукам
    3.         $this->varchar('cfe_type', '25'); // Тип - или Сессия, или куки, либо это строка собственная переменная
    4.         $this->varchar('cfe_hash', '255'); // Зашифрованный ключ сессии Будет рендомное уникальное число шифрованое в bCrypt
    5.         $this->timestamp('cfe_created_date'); // И дата Создания Этой переменной
    6.         $this->save();
    На этом не всё, будет создана ещё одна таблица для связки строки сессии, либо кука с id пользователя которая будет иметь следующий вид
    PHP:
    1.         $this->integer('user_id', '11');// integer (просто уникальный) несёт ключ к id пользователя
    2.         $this->integer('cfe_id', '11'); // Ключ к строчке с сессие, или куку, или собственной переменной глобальной.
    3.         $this->timeDate('cfe_timeDeathe', '4'); // Несёт в себе значение времени смерти этой строки
    4.         $this->save();
    Что я хочу сделать, я хочу чтобы при задании в столбце, этой таблицы, времени Смерти - cfe_timeDeathe.
    Указывалось время жизни текущей строки в бд. И когда оно истечёт, нафиг удалить эту строку.

    Вот это мне нужно для дальнейшей реализации. Пока ума не приложу как мне, в php запустить это чтобы она потом фоново стёрлась, без курла.

    Ниже примерный набросок, просто моего класса, за всё это отвечающий. Он ещё в разработке и это так на скорую руку просто структуру написал, где что писать. И там ещё дописываю. Но пока застопорился именно на удалении по времени жизни.
    PHP:
    1. <?php
    2. /**
    3. * Created by PhpStorm.
    4. * User: askanim
    5. * Date: 22.06.2016
    6. * Time: 11:59
    7. */
    8.  
    9. namespace System\Gabriel;
    10.  
    11.  
    12. use System\Http\Model\Model;
    13.  
    14. class CFESession
    15. {
    16.  
    17.     static private $currentToken = [];
    18.     static private $DB;
    19.  
    20.     public static function start () {
    21.         /*
    22.          * Стартует сессию
    23.          *
    24.          *
    25.          * */
    26.  
    27.         start_session();
    28.  
    29.         static::$DB = new Model();
    30.  
    31.     }
    32.  
    33.     public static function cfeSession ($value, $string) {
    34.  
    35.         /*
    36.          * Добавляет новую сессию
    37.          * и записывает её в массив текущих переменных
    38.          * $this->currentToken
    39.          * */
    40.         $_SESSION[$string] = $value;
    41.  
    42.         static::$currentToken[$string] = $value;
    43.     }
    44.     public static function getSession ($string) {
    45.         /*
    46.          * Получение сессии
    47.          *
    48.          * */
    49.         if (!empty($_SESSION[$string]))
    50.             return $_SESSION[$string];
    51.         else
    52.             return 'Не опознанная сессия '.$string;
    53.  
    54.     }
    55.     public function getCurrentToken ($string) {
    56.         /*
    57.          * Возвращает токен;
    58.          * $this->currentToken;
    59.          * Указаный в $string;
    60.          *
    61.          *
    62.          * */
    63.         return $this->currentToken[$string];
    64.     }
    65. }
     
    #1 askanim, 22 июн 2016
    Последнее редактирование: 22 июн 2016
  2. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Копал, копал. Накопал.
    Докопался до shell command

    И выяснил что в php, есть возможность отправлять shell команды веб серверу. И что не обязательно мне блин прописывать вручную команды в линукс. Если мне нужно например curl запустить... Знал бы раньше не написал что не нужно использовать curl.

    В этой теме с shell и работы с curl ещё новичёк. Если кто может подсказать. Подскажите направление размышлений, по какому лучше пойти и какую команду лучше использовать, для запуска курла, а то в php есть команда exece() есть system, а есть и passthru.

    ммм....
     
  3. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Посмотри в сторону memcache или redis. Там можно будет раздать время жизни ключа и он автоматом потрётся по истечению срока годности.
    Про всякие вызовы системных команд: так лучше не делать. По умолчанию половина этих функций отключена в целях безопасности.
    Ну и в конце концов, ты можешь делая выборку указывать срок жизни в условиях выборки, и фильтровать тем самым кортежи с истекшим сроком. А потом кроном раз в месяц/сутки/час чистить СУБД от мусора.
     
    artoodetoo нравится это.
  4. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Почему отключена ?) Это же на уровне сервера будет происходить внутри машина, Там даже ни каких внешних сподвигов на это не будет. Всё будет происходить внутри скрипта, у меня при регистрации будет создаваться стркоа в бд, которая удалить через там например 1 час. И когда она удалится, при следующей загрузке страницы пойдёт запрос к бд, есть там эта строчка или нет, если нет, то гуд бай. Закрываем тек сессию, и прощаемся с пользователем который в сети, если же, он при авторизации, указал запомнить меня, то строчка в бд становится вечной пока он не сделает выход, из своего личного кабинета например.
     
    #4 askanim, 22 июн 2016
    Последнее редактирование: 22 июн 2016
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Отключены в целях безопасности. Чтоб дырявый код рукожопого программиста не позволил через эти дыры выполнять шел-команды от имени эффективного пользователя.
    Если уверен в безопасности своих действий - можешь включить.

    Ну ок. Рассмотри вариант с полем срока годности и фильтру по нему при запросе.
     
    artoodetoo нравится это.
  6. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Идея в принципе хорошая, но, запуск крона так же через шел я буду осуществлять, ибо я хочу, чтобы моя библиотека, использовалась без лазания в командную строку веб - сервера... А то на ларавеле меня этот курл убил нафиг. Берёт и дёргает каждую секунду, сервак, гоняет даже в пустую. Для того чтобы типа команды работали...

    Может конечно, это и по борабану серверу. Но мне как то не нравится что у меня например где то в коде что там не понятно зачем просто так дёргается, если мне нужен этот курл, только на определённые задачи...

    Я просто не хочу чтобы у меня угнали сессию и пытаюсь как то обезопаситься чтобы если и угонят сессию, то она веса иметь не будет. Она разово будет проверяться и заносится в БД, и я не буду хеш хранить в сессии, я буду хранить id в сессии тек пользователя и делать $_POST запрос на стороне сервере к той таблице где у меня хранится User_id, и если там есть запись, то значит это пользователь как бы типа в сети, если нет иди нахрен, и если да она там есть, то делаем запрос к хешу, и сравниваем с хешем пользователя в бд в одной базе, и в другой если всё ок то всё ок)
     
    #6 askanim, 22 июн 2016
    Последнее редактирование: 22 июн 2016
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Запуск крона через шел это вызов из шела бинарника пхп. А я про отключение возможности из бэкэндов веб-сервера (мод_пхп, фпм, сиджиай) выполнять шел-команды. Две разные ситуации. Последняя опасна, поэтому ограничена. Если есть доступ к крону - вообще ж проблем никаких не будет с уборкой мусора.
     
  8. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    ну так то да, надо заюзать и тот и другой вариант и посмотреть результаты стрельбы. :)