2011-04-13 5 views
0

사용자가 브라우저를 종료하거나 페이지에서 벗어나면 mysql 데이터베이스를 업데이트하는 방법을 아는 사람이 있습니까? 나는 1로 설정된 값을 가지고 있고 그러한 이벤트에서 0으로 설정하기를 원합니다. 나는 몇 주 동안 이걸 가지고 벽에 머리를 치고 있었고 어떤 도움이라도 대단히 감사 할 것입니다. 감사합니다. PHP를 사용하고 있습니다. 나는 몸을 하역 할 때 그것을 시도했지만 그것이 내가 원하는 것을하지 않습니다.브라우저에서 데이터베이스 업데이트

+1

'내가 값을 1로 설정을하고 이러한 이벤트 0으로 설정합니다 .' -이 값을 사용하여 온라인/오프라인 사용자를 확인하고 있습니까? – drudge

+2

'onUnload'가 왜 효과가 없습니까? 그건 정확히 당신이 찾고있는 것처럼 들리 네요. – eykanal

+0

@eykanal : 대부분의 브라우저는 언로드 중에 (언로드하기 전에) 경쟁 조건이있는 일부 브라우저에서 아약스 요청을 보낼 수 없습니다 : 창이 닫히기 전에 비동기 아약스 요청이 전송됩니까? 당신은 언로드 중에 (전에) ajax 요청을 보내지 않으려 고합니다. – BalusC

답변

4

하지 마십시오. 브라우저에 의존하여 (beforeunload 이벤트를 통해) 또는 다른 메커니즘을 통해 알림을 보내기 만하면됩니다. 브라우저가 충돌하거나 사용자가 컴퓨터를 절전/최대 절전 모드로 전환하면 어떻게됩니까?

PING과 같은 다른 옵션을 고려해 볼 수 있습니다! 브라우저가 Ajax를 통해 1 분마다 호출 할 수있는 방법으로 그가 살아 있다고 말합니다. 당신이해야 할 일은 1:30 분 이상 ("last_seen TIMESTAMP 또는 뭔가 전화") 이상 "살아있는"항목을 검색하고 "살아"0으로 설정하는 MySQL 프로 시저를 만드는 것입니다.이 절차는 수 무작위 요청 (PHP 세션 정리 메커니즘과 거의 비슷 함)에서 호출되었습니다.

이렇게하면 PING을 얻을 수 있기 때문에 사용자가 계속있을 것입니다. 주기적으로 요청하고 사용자가 멈 추면 안전하게 PING하지 않을 것이라고 말할 수 있습니다. 더 이상 (가벼운 지연을 일으키지 만 받아 들일 수는 있지만). 이것은 또한 사용자 보안을 보장합니다.

0

PHP는 페이지가 ACCESSED 일 때만 내용을 변경할 수 있습니다. PHP 관점에서 볼 때, 스크립트가 종료 되 자마자 트랜잭션이 끝났으며 더 이상 그 페이지와 관련이 없습니다.

이 작업을 수행 할 수있는 유일한 방법

스크립트가 실행 열린 연결을 유지하고, 같은 것을 사용한다 :

<?php 

    function shutdown() 
    { 
    // here you change the value on your db... 
    } 

    register_shutdown_function('shutdown'); 

// send the data to client 
    echo "anything"; 
    flush(); 
    // sleep for a lot of time... 99999 seconds... 
    sleep(99999); 
?> 
+0

일부 웹 호스팅은 PHP 프로세스를 몇 초 후에 (1과 1의 25와 같이) "종료"하므로 실용적이지 않습니다. 또한 소수의 사용자에게는 문제가되지 않지만 홍수로 인한 공격도 차단됩니다. –