사용자가 온라인 상태인지 확인하는 가장 쉬운 방법은 무엇입니까? (PHP/MySQL)

StackOverflow https://stackoverflow.com/questions/1051895

  •  20-08-2019
  •  | 
  •  

문제

사용자가 온라인 상태인지 알기 위해 세션을 피기 할 수있는 방법이 있습니까?

IE : 로그온을 사용하고, $ _session 변수를 설정하고, 사용자 시간 아웃 쿠키 쓰레기 수집기는 데이터베이스를 업데이트하여 상태를 오프라인으로 업데이트합니다.

EDIT: 시간이나 날짜가 포함되지 않는 솔루션을 원합니다. 나는 세션이나 비슷한 것을 타기를 원합니다. 누군가가 온라인 상태인지 추측하는 것만으로는 내가 필요로하는 것만으로는 충분하지 않습니다.

도움이 되었습니까?

해결책

시간 존의 차이점을 알아내는 데 귀찮게하지 마십시오. 그것은 필요하지 않습니다.

사용자가 페이지에 액세스 할 때마다 사용자 테이블의 기록에서 필드를 업데이트하십시오. 그런 다음 지난 5 분 이내에 마지막 업데이트 된 시간을 가진 모든 사용자에 대한 쿼리를 수행하십시오. 이보다 더 많은 것은 "오프라인"으로 간주됩니다.

MySQL의 Now () 함수를 통해 서버 타임을 사용하는 경우 시간대 간의 차이를 계산할 수 있습니다.

이것은 현재 온라인으로 얼마나 많은 사용자 수를 추적하는 표준 방법입니다 (의미, 지난 몇 분 안에 활성화).

지속적으로 업데이트되었습니다

페이지에서 페이지마다 점프하지 않을 때에도 여전히 활성화되어 있음을 알고 싶다면 60 초마다 서버를 핑하여 약간의 JavaScript를 포함시켜 여전히 살아 있음을 알려주십시오. 원래 제안과 같은 방식으로 작동하지만 레코드가 적어도 5 분마다 한 번 이상 사이트를 열광적으로 탐색 할 필요없이 레코드를 업데이트합니다.

var stillAlive = setInterval(function () {
    /* XHR back to server
       Example uses jQuery */
    $.get("stillAlive.php");
}, 60000);

다른 팁

(설명 후) 당신이 요구하는 것은 정의상 불가능합니다. HTTP는 연결이없는 프로토콜이므로 사용자가 페이지를 치고 모든 컨텐츠가 서버에서 사용자의 브라우저로 돌아 오자이 둘 사이에 연결되지 않습니다. 누군가는 귀하의 웹 사이트에서 1 초도 채 안되는 "온라인"입니다.

당신이 한 가지 ~할 수 있었다 웹 페이지에 javaScript가 있으면 AJAX가 정보 식별을 포함하여 AJAX 요청을 정기적으로 서버로 다시 요청하고 사용자가 페이지를 떠날 때 다른 AJAX 요청이 포함됩니다. Window.onbeforeunload.

내 방식은 가장 좋은 방법이 아닐 수도 있지만 사용자가 내 사이트에 로그인 할 때 내 사이트와 사용자베이스가 MySQL DB에 있기 때문에

  1. 나는 그들이 온라인이라고 말하기 위해 사용자 테이블을 업데이트합니다.
  2. 온라인 테이블에 삽입하십시오
  3. 그런 다음 현재 시간과 함께 세션을 설정했습니다

그런 다음 모든 페이지로드에서 온라인 시간 세션을 확인합니다. 존재하는 경우 5 분 미만인 경우 5 분이 더 걸리면 5 분이 더 나은 경우 업데이트됩니다. 현재 시간이있는 세션 시간과 시간에 따라 온라인 사용자 테이블을 업데이트합니다.

그런 다음 10-15 분마다 실행되는 Cron 작업이 온라인 테이블에서 사용되는 모든 용도를 삭제하고 온라인 시간이 x 분만 이내에 업데이트 된 경우 사용자 테이블을 오프라인으로 표시합니다.

"온라인 인 사람"비교 로직이 시간 존을 고려하지 않는 것처럼 들립니다. 이런 식으로 타임 존을 다루는 경우 모든 시간을 GMT에 저장하고 표시하기 직전에 사용자를 위해 현지 시간으로 변환하는 것이 좋습니다. 이것은 비교 작업을 매우 간단하게 만듭니다.

타임 존에 대한 좋은 스레드가 있습니다 여기.

내가 조언 할 것은 Memcached 또는 MySQL 힙 또는 Redis와 같은 이런 종류의 정보를 메모리에 저장하는 것입니다. 그렇지 않으면 데이터베이스가 많이 타격을 받기 때문입니다.

테이블에 시간대를 저장하고 계산에 사용하여 사용자가 페이지를 보는 현지 시간과 비교하여 현지 시간을 찾으십시오.

편집하다:

더 나은 방법은 모든 시간을 서버 시간으로 저장하고 서버 시간에만 상대적으로 모든 계산을 기반으로합니다.

상황에 따라 "IP"및 "마지막 업데이트 된 시간"과 같은 개별 테이블 "Online"을 만들고 사용자가 페이지를로드 할 때 마다이 테이블을 쿼리/업데이트하는 것이 더 좋습니다.

페이지에로드 쿼리에는 포함될 수 있습니다:

  1. IP를 기반으로하는 현재 사용자를위한 "Online"테이블을 업데이트/삽입하십시오.
  2. "만료 된"행을 삭제합니다 (Cronjob을 사용하여 정기적으로 수행 할 수도 있음).
  3. "활성"사용자를 계산하십시오.

이 기술을 사용하는 이점:

  1. 사용자가 로그인하지 않으면 여전히 계산/추적 중입니다.
  2. 보유한 사용자의 양에 따라이 테이블을 쿼리하는 것이 더 빠를 수 있습니다.

참고 : 이것을 사용하는 경우 모든 PageView가 테이블에 행을 생성하므로 userAgent를 기준으로 봇을 무시하거나 인기있는 것 (Firefox, IE, Safari, Opera 등) 만 계산할 수 있음을 고려해야합니다.

내가이를 위해 구현 한 솔루션은 인증 된 사용자가 모든 페이지로드에서 "user_ {userId}와 같은 memcache var를 설정/재설정하는 것입니다.ISONLINE "=> TRUE 및 5 분 안에 만료. 그런 다음 사용자 정보에 액세스 할 때 VAR이 캐시에 있는지 확인하십시오. 사용자 기반의 크기에 따라 모든 사람의 목록을 온라인으로 얻으려면 가능합니다. "사용자 배열과 함께 memcache getmulti 호출을 사용하십시오.{userId} _Online "모든 사용자를위한 키.

물론 이것은 실제로 사용자가 귀하의 사이트에서 페이지를 변경하는 빈도에 달려 있습니다. 온라인 사용자를보다 정확하게 표현하기 위해서는 작은 간격으로 실행되는 페이지에서 AJAX XMLHTTPREQUEST 호출을 구현할 수 있습니다 (30 초 또는 30 초 또는 따라서) Memcache var를 재설정하고 Memcache var가 시간이 짧아집니다 (가능한 브라우저 문제를 설명하기 위해 1 분). 이것은 완전히 정확하지는 않지만 HTTP가 서버와 지속적으로 연결되어 있지 않기 때문에 할 수있는 일에 대해서는 제한적입니다.

온라인 상태 인 사람의 두 번째 표현이 필요한 경우 Jabber 서버에 연결하는 페이지에 플래시 앱을로드 할 수 있습니다. 그러면 특정 사용자가 서버에서 로그인한지 확인하십시오.

당신은 또한 사용할 수 있습니다 onunload 태그 ... 본체에 더 많은 정보 (여기서 더 많은 정보)https://www.w3schools.com/jsref/event_onunload.asp)

이렇게하면 사용자가 오프라인으로 나가기 위해 4-5 분을 기다릴 필요가 없습니다.

그러나 사용자의 브라우저 충돌이 발생하는 경우에도 AJAX 업데이트 메소드를 사용해야합니다 ...

다음은 몇 분 안에 데이터베이스에서 두 날짜의 차이를 얻는 방법에 대한 방법입니다. 그런 다음 차이를 확인하고 온라인/오프라인 상태를 설정하십시오.

$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);
    }
} 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top