사용자가 온라인 상태인지 확인하는 가장 쉬운 방법은 무엇입니까? (PHP/MYSQL)
사용자가 온라인 상태인지 확인하기 위해 세션을 업어볼 수 있는 방법이 있습니까?
즉, 로그온 사용, $_SESS 변수 설정, 사용자 시간 초과 - cookie Garbage collector가 데이터베이스를 업데이트하여 오프라인 상태로 업데이트합니다.
EDIT:시간이나 날짜가 포함되지 않는 해결책을 원합니다.저는 세션에서 타는 것이나 비슷한 것을 원합니다.누군가가 온라인 상태인지 추측하는 것은 제가 필요로 하는 것에 충분하지 않습니다.
시간대 간의 차이를 굳이 파악할 필요는 없습니다.
사용자가 페이지에 액세스할 때마다 Users 테이블의 레코드에 있는 마지막 ActiveTime 필드를 설정/업데이트합니다.그런 다음 마지막 활성 시간이 지난 5분 이내인 모든 사용자에 대해 를 수행합니다.이 이상의 것은 "오프라인"으로 간주될 수 있습니다.
MySQL의 기능을 통해 서버 시간을 사용하면 시간대를 처리할 필요가 없습니다.이것은 현재 온라인 상태인 사용자 수를 추적하는 표준 방법입니다(즉, 최근 x분 이내에 활성화됨).
지속적으로 업데이트됨
페이지에서 페이지로 이동하지 않을 때에도 여전히 활성 상태임을 알고 싶다면 60초마다 서버에 약간의 자바스크립트를 포함시킬 수 있습니다.원래 제안과 동일하게 작동하지만 사용자가 5분에 한 번 이상 사이트를 검색할 필요 없이 기록을 업데이트할 수 있습니다.
2009년 코드 원본 코드
var stillAlive = setInterval(function () {
/* XHR back to server
Example uses jQuery */
$.get("stillAlive.php");
}, 60000);
업데이트된 2022 코드
오늘날에는 페치와 약속을 이용하여 이러한 호출을 보다 정확하게 발행할 수 있습니다.페치는 jQuery를 사용하는 이전의 XHR 접근 방식을 대체할 것입니다.가져오기는 약속을 반환합니다. 이 약속은 다음을 통해 사용됩니다.await키워드) 다음 통화의 타이밍을 연기합니다. 번 ostillAlive.php완료되었으며 응답이 검색되었습니다. 60초 후에 다음 ping을 설정합니다.
(async function ping () {
// Asynchronously call stillAlive.php
await fetch( "stillAlive.php" );
// Issue this call again in 60 seconds
setTimeout( ping, 60_000 );
}());
(명확화 후) 당신이 요구하는 것은 정의상 불가능합니다.HTTP는 연결이 없는 프로토콜이므로 사용자가 페이지를 누르고 모든 콘텐츠가 서버에서 사용자의 브라우저로 돌아오자마자 둘 사이에 연결이 없습니다.누군가가 당신의 웹사이트와 1초도 안 되는 "온라인" 상태입니다.
당신이 할 수 있는 한 가지 방법은 웹 페이지의 자바스크립트가 정기적으로 서버에 AJAX 요청을 하게 하는 것인데, 여기에는 정보를 식별하는 것과 사용자가 페이지를 떠날 때 window.on을 사용하여 다른 AJAX 요청을 실행하는 것이 포함됩니다.
나의 방법은 최선의 방법이 아닐 수도 있지만 나의 사이트와 사용자 기반은 모두 mysql DB에 있기 때문에 사용자가 내 사이트에 로그인하면,
- 사용자 테이블을 업데이트하여 온라인 상태임을 알립니다.
- 온라인 테이블에 삽입
- 그럼 현재 시간으로 세션을 설정했습니다.
그런 다음 온라인 시간 세션을 확인하는 모든 페이지 로드에서 해당 세션이 존재하는 경우 해당 세션이 얼마나 오래되었는지 확인하고, 5분 미만인 경우 아무 작업도 하지 않으며, 5분 미만인 경우 세션 시간을 현재 시간으로 다시 업데이트하고 온라인 사용자 테이블도 해당 시간으로 업데이트합니다.
그러면 온라인 시간이 X분 이내에 업데이트된 경우 온라인 테이블에서 모든 용도를 삭제하고 사용자 테이블을 오프라인으로 표시하는 cron 작업을 10-15분마다 실행합니다.
당신의 "온라인 사용자" 비교 논리가 시간대를 고려하지 않는 것처럼 들립니다.이러한 방식으로 시간대를 다룰 경우 모든 시간을 GMT에 저장하고 표시하기 직전에 사용자를 위해 현지 시간으로 변환할 것을 강력히 권장합니다.이렇게 하면 비교 작업이 매우 간단해집니다.
여기 시간대에 대한 좋은 SO 스레드가 있습니다.
한 가지 조언해 드리고 싶은 것은 memcached 또는 mysql 힙 또는 redis와 같은 정보를 메모리에 저장하는 것입니다.그렇지 않으면 데이터베이스가 많이 타격을 받을 것이기 때문입니다.
시간대를 테이블에 저장하고 이를 계산에 사용하여 페이지를 보는 사용자의 현지 시간과 비교하여 사용자의 현지 시간을 찾습니다.
편집:
모든 시간을 서버 시간으로 저장하고 모든 계산을 서버 시간에만 상대적으로 하는 것이 좋습니다.
상황에 따라 "ip" 및 "마지막 업데이트 시간" 열로 "whos-online" 테이블을 별도로 작성하고 사용자가 페이지를 로드할 때마다 이 테이블을 쿼리/업데이트하는 것이 더 나을 수 있습니다.
온 페이지 로드 쿼리에는 다음이 포함될 수 있습니다.
- ip를 기반으로 현재 사용자의 "who-online" 테이블을 업데이트/삽입합니다.
- 만료된 행을 삭제합니다(cronjob을 사용하여 주기적으로 수행할 수도 있음).
- "활성" 사용자 수를 셉니다.
이 기법을 사용할 경우의 이점은 다음과 같습니다.
- 사용자가 로그인하지 않은 경우에도 계속 카운트/추적 중입니다.
- 사용자 수에 따라 이 테이블을 조회하는 것이 더 빠를 수 있습니다.
참고: 이를 사용할 경우 페이지 뷰가 테이블에 행을 생성하므로 사용자 에이전트에 따라 봇을 무시하거나 인기 있는 봇(Firefox, IE, 사파리, 오페라 등)만 셀 수 있습니다.
이를 위해 구현한 솔루션은 인증된 사용자가 페이지 로드할 때마다 "user_{userid} is online" => true와 같은 memcache 변수를 설정/reset하여 5분 내에 만료하는 것입니다. 그런 다음 사용자 정보에 접속하면 캐시에 var가 있는지 확인합니다. 사용자 기반의 크기에 따라 온라인에 있는 모든 사용자의 목록을 가져오려면 모든 사용자에 대해 "user{userid}_isonline" 키 배열과 함께 memcache get multi call을 사용할 수 있습니다.
물론, 이것은 사용자가 얼마나 자주 당신의 사이트의 페이지를 바꾸느냐에 달려있습니다.온라인에서 사용자를 보다 정확하게 표현하기 위해서는 memcache var를 재설정하는 작은 간격(30초 정도)으로 실행되는 페이지에 ajax xmlhtt prequest call을 구현하고 memcache var를 더 적은 시간(가능한 브라우저 문제를 고려하기 위해 1분)에 만료시킬 수 있습니다.이것은 완전히 정확한 것은 아니지만, http가 서버에 영구적으로 연결되어 있지 않기 때문에 할 수 있는 일이 상당히 제한되어 있습니다.
온라인 상태인 사용자에 대한 두 번째 표현이 필요한 경우 페이지에 재버 서버에 연결하는 플래시 앱을 로드한 다음 해당 사용자가 서버에 로그인되어 있는지 확인하면 됩니다.
데이터베이스에서 두 날짜 간의 차이를 몇 분 안에 확인한 후 온라인/오프라인 상태를 설정하는 방법을 소개합니다.
$query = 'SELECT * FROM Users';
$result = mysqli_query($mysqli, $query);
foreach($result as $user){
// date from the database
$dbLastActivity = date("d-m-Y h:i:s a", strtotime($user['lastOnline']));
// date now
$now = date("d-m-Y h:i:s a", $date);
// calculate the difference
$difference = strtotime($now) - strtotime($dbLastActivity);
$difference_in_minutes = $difference / 60;
// check if difference is greater than five minutes
if($difference_in_minutes < 5){
// set online status
$updateStatus = 'UPDATE Users SET Status="online" WHERE lastOnline="'.$user['lastOnline'].'"';
} else {
// set offline status
$updateStatus = 'UPDATE Users SET Status="offline" WHERE lastOnline="'.$user['lastOnline'].'"';
}
// check if mysqli query was successful
if (!$mysqli->query($updateStatus)){
printf("Error Message %s\n", $mysqli->error);
}
}
사용할 수도 있습니다.onunloadtag... 본문에서 더 자세한 내용은 여기(https://www.w3schools.com/jsref/event_onunload.asp)
이렇게 하면 사용자가 오프라인 상태가 될 때까지 4-5분 정도 기다릴 필요가 없습니다.
하지만 사용자의 브라우저가 충돌할 경우에도 ajax 업데이트 방법을 사용해야 합니다...
편집: @Quentin님께서 댓글로 지적하신 것처럼 요청을 보낼 수는 없겠지만 할 수 있는 방법이 있습니다...이 기사에서 더 자세히 설명합니다.
그래서 기본적으로 sendBeacon()을 사용하고 있습니다. 여기 예가 있습니다.
window.addEventListener("unload", function logData() {
navigator.sendBeacon("/log", analyticsData);
});
참고: 사용자가 의존해야 하는 유일한 방법이 아니며 중복성을 위해 구현해야 한다는 점을 명심해야 합니다.
언급URL : https://stackoverflow.com/questions/1051895/whats-the-easiest-way-to-determine-if-a-user-is-online-php-mysql
'codememo' 카테고리의 다른 글
| XMLHtpRequest가 헤더를 추가하지 않음 - "X-Requested-With: XMLHtpRequest" (0) | 2023.10.15 |
|---|---|
| 크롬이 렌더링되지 않음크롬이 렌더링되지 않음태그, FF가 합니다. (0) | 2023.10.15 |
| Angular의 기본 예제 및 Best PracticeJS Java EE 웹 앱 (0) | 2023.10.10 |
| MySQL에 유니코드를 저장하는 방법? (0) | 2023.10.10 |
| Angular-ui bootstrap datepicker에서 week column and button 제거 (0) | 2023.10.10 |