2012-10-16 3 views
4

자바 스크립트 (jQuery는 AJAX 용)와 PHP를 기반으로 채팅을 만들고 싶습니다.jQuery와 PHP로 긴 폴링 구현하기

이렇게하는 좋은 방법은 롱 폴링을 사용하는 것이라고 들었습니다.

나는이 아이디어를 이해하지만, 서버 측에서 구현하는 방법을 모른다.

무한 루프는 좋지 않은 생각처럼 들립니다.

+1

PHP를 사용하는 것은 좋은 생각이 아닙니다. nodejs와 같은 것을 사용 해본 적이 있습니까? – ThiefMaster

+1

node.js와 같은 비 차단 항목이 더 이상적 일 것이라고 동의하지만 옵션이 아닌 경우에는 아래에서 내 대답과 같이 PHP에서 구현할 수 있습니다. – doublesharp

+0

대신 웹 소켓을 사용해 보셨습니까? – Xeoncross

답변

7

무한 루프를 만들고 싶지는 않지만 시간 제한을 설정할 수 있습니다. 기본적으로 일종의 데이터를 기다리는 동안 X 초 동안 반복합니다. 그런 일이 발생하지 않으면 클라이언트에 새로운 요청을 시작해야한다는 응답을 보내고 동일한 제한 시간을 갖습니다. 채팅 같은 종류를 구현

$source; // some data source - db, etc 
$data = null; // our return data 
$timeout = 30; // timeout in seconds 
$now = time(); // start time 

// loop for $timeout seconds from $now until we get $data 
while((time() - $now) < $timeout) { 
    // fetch $data 
    $data = $source->getData(); 

    // if we got $data, break the loop 
    if (!empty($data)) break; 

    // wait 1 sec to check for new $data 
    usleep(10000); 
} 

// if there is no $data, tell the client to re-request (arbitrary status message) 
if (empty($data)) $data = array('status'=>'no-data'); 

// send $data response to client 
echo json_encode($data); 
+0

왜 프로세서의 용도가 100 % ** 1) 루프 내부에서 수면 ** - 프로세서는 루프를 한 번 실행 한 다음 잠시 동안 스크립트를 저장 한 다음 다시 돌아옵니다 = 100 % 프로세서 사용량이 없음 LOOP 케이스 (A)의 ** 2) END ** ((시간() - 현재 $) <$ 초과) = ((CURRENT_TIME - TIME_WHEN_THE_SCRIPT_STARTED) TIMEOUT_SET_BY_YOU 루프가 끝날 것입니다 3) END OF LOOP 케이스 B : ** if (! empty ($ data)) break; = 루프가 데이터를 얻는 데 성공하면> => 끝납니다. –

0

, 당신이 사용할 수있는 PHP에서 좋은 아이디어가 아니다 CometChat, Nodjs 및 실시간 데이터 전송을 위해 사용 가능한 API를 사용할 수있는 것보다 당신이 당신의 서버에 스크립트를 설치할 수없는 경우,

Pubnub, Pushemr, Beaconpush 등이 있습니다.

+0

PHP를 사용하지 않는 이유는 무엇입니까? 추론에 대해 자세히 설명해 주시겠습니까? – Gilberg

+0

PHP가 이것 때문에 만들어지지 않았기 때문에 ... PHP는 많은 동시 연결을 처리 할 수 ​​없으며 PHP 서버에서 많은 오버 헤드가 될 것입니다. 올바른 요구 사항에 맞는 적절한 기술 .. "칼은 바늘을 대체 할 수 없습니다" –