2012-02-20 3 views
3

PHP에서 채팅 상자를 만들었습니다. 유일한 문제는 자동으로 다시로드되지 않는다는 것입니다. PHP로 다시로드 할 수있는 방법이 있습니까? 아니면 AJAX를 사용할 수 있도록 모든 것을 옮겨야합니까? 또한 내 사용자 중 한 명이 온라인 상태입니다. 나는 그들이 키를 누르거나 지난 3 분 동안 클릭하고 페이지를 떠날 때 오프라인으로 설정하면 오프라인 상태가되도록 설정했습니다. 그들은 Firefox 9.0을 사용하고 있습니다. onunload를 사용했기 때문입니까? 해결책은 무엇입니까?PHP reload chat-box?

답변

4

meta refresh 태그를 사용할 수 있습니다.이 태그는 PHP에서 생성 될 수 있지만 실제로 PHP 관련 기능은 아닙니다.

<meta http-equiv="refresh" content="600"> 

이렇게하면 600 초 후에 콘텐츠가 새로 고침됩니다. 응용 프로그램 요구에 따라이 시간을 더 정확하게 조절할 수 있습니다.

아마 Ajax는 사용자 비활성을 확인하는 데 선호되는 방법입니다. 여기에 체크 사용자 활동에 유사한 게시물입니다 - How can I detect with JavaScript/jQuery if the user is currently active on the page?

UPDATE 파이어 폭스에서 사용자의 종료를 처리하는 방법의 두 번째 질문에 관해서는

, 그 당신은 onunload이 일치하지 않을 수 있다는 것을 말한 것처럼. 이것은 아약스의 사용이 다시 빛나는 곳입니다. 앱이 클라이언트에서 아약스 업데이트를받지 못하는 경우 정리 작업을 수행하여 비활성으로 표시 할 수 있습니다.

우리는 ASP.Net MVC 응용 프로그램에서 비슷한 상황이있었습니다. 응용 프로그램 변수를 사용하여 최근 활동 및 사용자 상태를 저장했습니다. PHP 예제는 found here 일 수 있습니다.

희망이 도움이됩니다.

+0

예, AJAX를 사용하여 누군가를 오프라인으로 표시했습니다.페이지를 떠날 때와 같은 기능을 사용하지 않기 때문에이 기능은 Firefox 9.0에서 작동하지 않는 것 같습니다 – CoffeeRain

+0

@shanabus, 두 가지 질문이 있습니다. 두 번째 질문도 있습니다. – Alexander

+0

@ Alexander, 나는이 질문의 두 번째 부분을 다루었다고 생각한다. 감사! – shanabus

2

일부 JavaScript를 추가하면 전체 페이지를 자동으로 새로 고칠 수 있지만 AJAX를 사용하면 최종 사용자에게 훨씬 유리합니다.

+0

그는 또한 jQuery를 사용하고 일부 컨테이너 스크립트 get.php에로드 할 수 있습니다. 위의 솔루션과 채팅을 썼다. – Kobra

+1

"AJAX를 페이지를 다시로드하지 않고 일부 데이터를 가져 오십시오"라는 포괄적 인 용어로 사용하고 있습니다. –

2

페이스 북의 방식은 클라이언트 "Alice"가 약 1 분 동안 열려있는 새 메시지 요청 대기 중입니다. 다른 클라이언트 "Bob"이 Alice에게 메시지를 쓰면 서버는 Alice의 보류중인 요청을 완료 할 수 있습니다. 그런 다음 Alice는 즉시 새 메시지를 가져오고 새로운 보류중인 요청을 엽니 다.

약 1 분 후에 보류중인 요청을 시간 초과하거나 브라우저에서 처리해야합니다. 브라우저마다 다른 시간 제한 설정이 있으므로 작은 것을 사용하십시오. 시간 초과 후 새로운 보류중인 요청을 열면 아무 것도 놓치지 않습니다. 클라이언트가 이벤트 $의 이드의 메시지 NR의 $의 MNR을 기다리고,이 만들 보류중인 요청을 호출 ( listen.php

define('WAIT_MAX', 55); // wait max 55 sec 
define('WAIT_INT', 1); // wait 1 sec per call 

$start = time(); 
while ($start + WAIT_MAX > time()) 
{ 
    // check if an event occured 
    $res = mysql_query('SELECT * FROM event WHERE `eid`="'.$eid.'" AND `mnr`="'.$mnr.'"'); 

    if (mysql_num_rows($res) > 0) 
    { 
     // event occured 
     $row = mysql_fetch_assoc($res); 
     $msg = $row['msg']; 

     echo "<event eid=\"$eid\" mnr=\"$mnr\" msg=\"$msg\" />\n"; 
     die(); 
     //die('event occured: '.$msg."<br>\nNext mnr=".($mnr+1)); 
     //break; 
    } 
    else 
    { 
     // no event occured 
     mysql_free_result($res); 
     sleep(WAIT_INT); 
    } 
} 
die(WAIT_MAX . ' seconds passed and no event occured.'); 

밥은 자사의 메시지를 보냅니다 :

내가 함께 놀러 몇 가지 코드를 얻었다. $의 MSG를

if (isset($_GET['msg'])) 
    $msg = $_GET['msg']; 
else 
    $msg = 'no message given, just firing the event.'; 

mysql_query('INSERT INTO `event` (`eid`, `mnr`, `msg`) VALUES ("'.$eid.'", "'.$mnr.'", "'.$msg.'")'); 

일부 init.php을 제공 yell.php하면 작동하도록 :

$eid = -1; 
$mnr = -1; 

if (isset($_GET['eid']) && isset($_GET['mnr'])) 
{ 
    $eid = max(0, (int)$_GET['eid']); 
    $mnr = max(0, (int)$_GET['mnr']); 
} 
elseif (isset($_GET['eid'])) 
{ 
    $eid = max(0, (int)$_GET['eid']); 
    $mnr = 1; 
} 
else 
    die('no eid given'); 

이 코드를 원하는대로 사용하고 수정하십시오.