2012-03-15 3 views
1
if(isset($_GET['actionid']) && isset($_GET['profileid'])) 
{ 
     $actionid = $_GET['actionid']; 
     $profileid = $_GET['profileid']; 
     $res = $database->news_poll($profileid,$actionid); 
     $k = 0; 
     while(!$NROW =$res->fetch_array()) 
     { 
      usleep('50000000'); 
      $res = $database->news_poll($profileid,$actionid); 
     } 
     $action = actiontype_encode($NROW,'0',$json,$encode,$database); 
     $data['action'] = $action; 
     echo json_encode($data); 
} 

이것은 새 데이터 서버를 폴링하기위한 스크립트입니다. 하지만 작동하는 브라우저는 내 사이트에서만 작동하지 않습니다. 문제는 특정 브라우저가 새 데이터를 구독 할 때 연결이 열려 있으므로 동일한 서버에 대한 추가 요청을 브라우저에서 만들 수 없다는 것입니다. 어떤 문제가 있다면 설명해주십시오.긴 폴링을 구현할 수 없습니다.

답변

1

할 수있는 방법이 있다면 긴 폴링에 대해서는 NodeJSSocketIO으로 설정하는 것이 좋습니다. 웹 서버는 연결된 모든 사용자에 대해 요청을 열어 둘 필요가 있으며 이는 Apache/PHP가 처리 할 수있는 것 이상입니다.

이것이 가능하지 않다면 3 초마다 정상적인 Ajax 요청을하는 짧은 폴링을 권장합니다. 완벽하지는 않지만 관리가 쉽습니다.

최근에 비슷한 질문에 more details으로 대답했습니다.

언어에 상관없이 2 년 동안의 프로젝트가되기를 원하지 않는 한 긴 폴링 서버 작성을 강력히 권장합니다. 저는 C로 작성된 긴 폴링 서버를 사용하고 Java로 다시 작성한 프로젝트에 참여했습니다.

+0

긴 폴링을 구현해야합니다. 매우 중요하며 짧은 폴링이 아닌 긴 폴링을 사용하여이를 해체해야합니다. 제발 도와주세요. 구현 실제 문제를 지적하십시오. –

0

아파치가 한 번에 하나의 클라이언트로부터 여러 요청을 처리한다는 것이 문제라는 것을 알았습니다. 따라서 새로운 데이터에 대한 백엔드에서 긴 폴링 스크립트에 대한 요청이있을 때 요청은 동일한 브라우저의 다른 요청을 동일한 서버에 정지시킵니다.

이 단점을 극복하려면 node.js 또는 tornado를 사용해야합니다.

관련 문제