2012-01-11 2 views
0

Demo.php 파일 html 파일이 업데이트되면 div 태그를 업데이트 하시겠습니까?

<?php 
function write_back() 
{ 
    echo file_get_contents("sample.html"); 
    sleep(2); 
    write_back(); 
} 
write_back(); 
?> 

내가 매 2 초 아약스 요청에 다시 PHP 스크립트에서 HTML 내용을 울리는 한 날이 오류 Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\omnama\demo.php on line 8

을 결과.

Demo.html 파일

function loadXMLDoc() 
{ 
var xmlhttp; 
    if (window.XMLHttpRequest) 
    {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    } 
    else 
    {// code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
xmlhttp.onreadystatechange=function() 
{ 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
     document.getElementById("myDiv").innerHTML=xmlhttp.responseText; 
    } 
    } 
    xmlhttp.open("GET","demo.php",true); 
    xmlhttp.send(); 
} 

날 내가 뭘하려고 오전 설명해 보자. sample.html 파일을 계속 업데이트하고 있습니다. 현재 로그인 한 사용자의 수 또는 대화 할 수있는 사람의 수를 포함 할 수 있습니다.

새 사용자가 로그인 할 때마다 html 파일이 PHP 파일 개념을 사용하여 사용자 이름으로 업데이트되고이 html 파일이 모든 온라인 사용자에게 업데이트되어야하기 때문에 html 파일을 사용했습니다. <div id="myDiv"> demo.php 파일에 의해 주어진 응답이있는 태그

로그인 한 사람이 있는지 확인하기 위해 매번 MySql을 요청하기 때문에 HTML 파일을 사용했습니다. 왜 html 파일을 사용하려고했는지 심각한 서버 문제가 발생합니다. 매번 파일 내용이 나에게 이러한 오류를 제공합니다.

나는 이것을 할 생각이었습니다. 파일의 마지막 수정 시간을 확인하고 이전 파일과 다른 경우 내용을 반향합니다. 이것이 올바른 방법입니까?

아무도 내가 sample.html을 추적하고 로그인 한 사용자에게 내용을 업데이트하는 방법을 설명 할 수 있습니까? 도움이 필요합니다. 감사합니다.

+0

문제가 생겼을 지 모르지만 자바 스크립트의 setInterval을 사용하여 매 간격마다 새 Ajax 요청을 수행하는 것이 어떻습니까? -http : //www.w3schools.com/jsref/met_win_setinterval.asp - 편집 : 이제 알았습니다. 아래에보다 완벽한 대답을 쓸 것입니다 ... – mobius

+0

@mobius 같은 오류가보고되었습니다. – niko

+0

setInterval 서버 측에서 sleep (2)를 제거하고 브라우저에 넣는 것입니다. 그러나 더 많은 것을위한 나의 완전한 대답을보십시오. – mobius

답변

0

아마도 몇 가지 방법이 있으며 궁극적으로 얼마나 많은 요청/업데이트가 있는지 추측 할 수 있습니다.

그러나 나는 당신이 당신이에 관심이있는 결과를 가져가는 방법을 결정해야합니다 시작 생각

  • 쉬운 솔루션 :. 당신은 setInterval을을 (사용) 및 브라우저가 새를 수행 할 수 XmlHttpRequest (POLL)를 사용하여 미리 정의 된 간격으로 새 사용자 목록을 검색하십시오.

  • 더 복잡한 해결책 : 서버와 브라우저 사이의 연결과 같은 "웹 소켓"을 설정하고 브라우저 사용자의 목록 서버, 롱 폴링 커스텀 구현, 또는 socket.io (http : //socket.io/ - 나는 커다란 팬이다)와 같은 혜성을 설정할 수 있고, 서버가 리스닝 브라우저에게 뭔가를 알리도록 할 수있다. 가치있는 통보가 발생합니다. 서버 측에 지금

:

개인적으로는 데이터베이스 쿼리를 방지하기 위해 HTML 파일에 기록하는 것을 당신의 접근 방식처럼 정말 않습니다. 분명한 방법은 요청시 새로운 사용자를 위해 데이터베이스를 쿼리하고 회신하는 것입니다. 서버에 병목 현상을 일으킬 수있는 사용자가 너무 많습니까? 그렇다면 더 많은 서버를 추가 할 수 있습니까? (mysql이 서비스를 제공하기 위해 복제 되었습니까?) 요청에 타임 스탬프를 추가하면 쿼리의 속도가 빨라질 수 있습니다. (즉, XXX 이후로 변경된 내용을 말해주십시오)

다른 대안이 있습니까? 나는.socket.io를 사용하게되면 전체 온라인 오프라인 상태가 서버 측 소켓 상태로 처리 될 수 있습니다. (socket.io 서버는 어떤 클라이언트가 연결되어 있는지를 안다.)

또 다른 아이디어는 온라인 사용자를 memcached 또는 redis 서버와 같은 메모리 저장소로 유지하는 것입니다. 따라서 각 로그인/로그 아웃시 memcached 서버를 업데이트하고 이에 따라 결과를 검색합니다.

내가 더 많은 시간을 할애하면 더 많은 방법으로 생각할 수 있습니다. 그러나 실제로 필요한 모든 것이 있고 단순한 SQL 쿼리로 작업 할 수 없다면 반드시 확인해야합니다.

+0

감사합니다 mobius 나는 그것에 대해 좀 더 자세한 정보를 주려고합니다. 감사합니다 – niko

+0

@niko 어떤 주제에 대해 더 많은 정보가 필요합니까? – mobius

0

재귀 funciton write_back을 사용하는 것이 좋은 생각이라고 생각하지 않습니다. 2 초 (setTimeout 또는 setInterval) 당 ajax send xmlhttprequest를 사용하면 더 좋을 수도 있습니다. 또는 혜성 기술을 사용할 수 있습니다. 대답 할 첫 번째 질문은 이러한 도움을 바랍니다.

관련 문제