(в таком случае правда непонятно, зачем вообще куда-то писать, где отлавливается факт звонка - оттуда и слать сразу пуш)
$fp = fopen ("path_to_file","a");//открытие
flock ($fp,LOCK_EX);//блокировка файла
ftruncate ($fp,0);//УДАЛЯЕМ СОДЕРЖИМОЕ ФАЙЛА
fputs($fp ,"$data\r\n");//работа с файлом
fflush ($fp);//очищение файлового буфера и запись в файл
flock ($fp,LOCK_UN);//снятие блокировки
fclose ($fp);//закрытие
RabbitMq, memecache, Redis, Laravel...
> есть цикл в server sent events, он проверяет каждые 500мс
Почему сами лезете к апи ? Калбаки есть ?
> Ясно что не в БД,
Нет файлы хуже .
используем WebPush https://fcm.googleapis.com/fcm/send
id email login hash_pass(bcrypt от пароля)
1 ll@i.ru vasya s2rg22eg
2 ii@i.ru petya de45uymn
id userid(=id из табл users) type(0-session,1-account) token timestamp
1 1 0 sessionToken
2 1 1 password_hash(accountToken)
function randomStr(length) {...}; // форм. случ. строки
$sessionToken = random(30); // В БД попадает в чистом виде
$accountToken = random(30); // В БД попадает password_hash($accountToken)
setcookie('token', $userID . ":" . $accountToken) // $userID здесь и далее просто порядковый номер из таблицы users (колонка ID)
$_SESSION['userID'] = $userID;
$_SESSION['session_token'] = $userID . ":" . $sessionToken . ":" . $accountToken;
$_SESSION['ip'] = $userIP; // текущий IP
$_SESSION['UA'] = $userUA; // текущий UserAgent
if (isset($_SESSION['session_token'])) {
// делим составной токен на 3 части (через двоеточие) и раскидываем по переменным
// $userIDfromSession, $sessionTokenFromSession, $accountTokenFromSession;
if ($_SESSION['ip'] != $userIP && $_SESSION['UA'] != $userUA) {
// заставляем авторизоваться (т.е. если сменился одновременно IP и UserAgent)
}
// достаём токены из БД через $userIDfromSession, получаем переменные: $sessionTokenFromBD, $accountTokenHashFromBD
if ($sessionTokenFromSession == sessionTokenFromBD) { // проверка сессионного токена
if (password_verify($accountTokenFromSession, $accountTokenHashFromBD)) { // проверка аккаунтского токена
// успешно авторизован (тут правда ещё проверка на срок login_time)
} else {
// заставляем авторизоваться (если сменился аккаунтский токен: logout, сброс пароля и т.д.)
}
} else { // если сессионный не подходит
// вот здесь я не знаю нужно ли пытаться восстановить авторизацию по аккаунтскому токену из той же сессии или
// из куки, если он не подходит или просрочен, или вообще сразу заставить авторизоваться...
}
} elseif(isset($_COOKIE['token'])) {
if (password_verify($_COOKIE['token'], $accountTokenHashFromBD)) {
// успешно авторизован (тут правда ещё проверка на срок login_time)
// и заполняем сессионные данные
}
} else {
// заставлям авторизоваться
}
UPDATE `sessions` SET token=$NewHashaccountToken WHERE userid=$userID and type=1;
Вряд ли внутри одной сессии поменяется и браузер, и IP одновременно.
Поэтому, при ОДНОВРЕМЕННОЙ смене: IP и User-Agent (всё - относительно текущей сессии) - можно смело обрывать все сессии пользователя и заставить его перелогиниться.
При успешном логине генерируются две случайные строки. Первая записывается в стандартную PHP сессию и будет current_session. Вторая записывается пользователю в куку session, а хеш этой строки будет long_session.
Про set_error_handler знаю, но не вижу смысла писать свой обработчик, когда мне нужно отловить ошибки только при выполнении одной единственной функции, хоть и большой. Хочу засунуть просто функцию в try catch, и если что-то пойдёт в ней не так, я об этом узнал.
Да, у меня php 7.2.
А что, у вас работает?
Здесь - phptester.net- тоже не работает. Там 7.0 (т.е. должно якобы работать).