2012-12-07 3 views
6

[정확히] 300 초 (5 분)에 대한 활동이없는 개인 대화방을 모니터링하는 데 사용되는 백엔드 모듈 (PHP로 작성)을 구축 중입니다. 그럴 경우 스크립트는 데이터베이스를 업데이트합니다 (최대 사용자 수를 특정 숫자로 설정). 나는 now()와 마지막으로 보낸 메시지의 시간 차이에 의해 유휴 시간 범위를 모니터링하고있다. 크론 내 모니터링 스크립트 (PHP-CLI를 통해) 실행 작업 매 분 60 초 설정 : 내가 무슨 짓을PHP가 데이터베이스의 변경 사항을 지속적으로 확인하는 가장 좋은 방법은 무엇입니까?


. 즉시 삼백초 후 유휴 시간을 최대 사용자를 설정하는 조건을 흥정 할 수없는

$expire_time = time() + 60; 

//this loop will run for 60 seconds 
while(time() < $expire_time) 
{ 
    $idle_time = get_all_chatrooms_idle_time(); 
    foreach($idle_time as $s_time) 
    { 
    if($s_time >= 300) 
    { 
     update_changes(); 
    } 
    } 
    usleep(500000); 
} 

: 모니터링 스크립트 내부. 그래서 나는 정말로 다음과 같은 충고를 따를 것입니다 : "그것이 실제로 의미가 있더라도"무언가를 실제로 요구할 때까지 아무것도하지 마십시오. "

이유? 활성 및 비활성 대화방의 데이터는 대시 보드에 표시되기 때문에 실시간이어야합니다. 대화방 운영자의 보수는 그것에 달려 있습니다.


왜 모든 대시 보드로드를 확인하지 않습니까? 미안하지만 여전히 불가능합니다.

점검은 서버 측이어야하며 대시 보드는 매초마다 폴링하는 ajax로 업데이트됩니다.

날 수에 몇 가지 대략적인 견적을 드리겠습니다

나는 페이지로 모니터링 코드를 첨부

내가 내 현재의 구현보다 더 많은 리소스를 많이 생각 내 아약스 호출에 의해 요청 된 (잘못 임은 경우에 저를 정정) 사회자를 포함하여 웨이브 소음의

  • 번호 : 채팅방의 ~ 800
  • 번호 : 사용자의 당신은로드/우리가 얻고 트래픽을 상상할 수 있도록 ~ 250
  • 채팅방 운영자의
  • (X) 번호 : ~ 50
  • (x)는 내 상사와 그의 직원 :

(X) - 대시 보드


더 좋은 방법이 볼 수 있습니까? 내가 제대로하고 있니?

+0

잘못된 것처럼 보입니다. CRON 작업에 대해 들어 본 적이 있습니까? 나는 그것을 할 godd 방법은 매 1 분 (또는 그 이하)에 대한 크론 작업을 설정하는 것입니다 생각하십니까? select를 사용하여 간단한 MySQL 스크립트를 실행합니다. – Stranger

+0

가능한 복제본 http://stackoverflow.com/questions/4834829/php-long-polling-with-excessive-database-access –

+0

@ Stranger 내가 그랬어? – yowmamasita

답변

1

이 루프는 잔인합니다. 보통의 서버에서도 1 분에 수천 회씩 실행될 수 있으며 실시간 앱의 경우에도 높은 CPU 사용량을 생성합니다. 카운터를 추가하고 반복 횟수를 확인하십시오. 나는 이것이 모든 AJAX 요청을 처리하는 것보다 더 많은로드를 생성한다고 생각한다.

먼저, 정보가 필요한 입도를 결정하십시오. 세분화 된 세분화 (예 : 3 초마다 데이터베이스를 통해 스윕)를 선택했다고 가정 해 보겠습니다.이 수치는 너무 높을 수 있지만 그다지 잃지 않는다는 것을 보여줍니다. 매초마다 AJAX를 당기는 경우 COULD 크롤링을 계속해야하는 일부 카운터가 한 번 또는 두 번 뒤로 크롤링됩니다. (당신이 정말로 그런 것을 보게 될 지 여부는 카운터의 성격에 달려 있습니다.)

카운터가 초 단위의 데이터 (예 : 경과 된 시간의 합계 또는 $/초 기준)를 기반으로하는 경우 보조 AJAX 풀링은 연속 카운터를 제공하지 않습니다. (때로는 초를 놓치거나 그 두 번째 업데이 트를 두 번, 네트워크 이유로).

선택한 세분성에 관계없이 최종 통계는 아무리 늦게 평가 되더라도 절대 시간 소인을 기반으로하므로 올 Y 른 통계가됩니다.

평범한 카운터를 구현하는 데 이차원 AJAX 폴링을 사용하는 경우 클라이언트 측에서 계산을 수행해야합니다 (예 : 두 번째 증가 값인 revenue: <span data-inc="25">14432</span> 및 JS로 계산) . AJAX 만 구현하여 카운터 중지/재설정 조건을 모니터링합니다. 그런 다음 알림이 얼마나 늦을 지 (예 : 10 초) 확인한 다음 카운터가 최대치를 초과 할 때만 결정하면됩니다. 10 초가 예상 값으로 떨어졌습니다. 이 경우 DB 정리를 훨씬 더 자주 (예 : 간격의 절반) 실행하지 않아야합니다. 예를 들어 사이클에서 3 초간 수면을 취하면로드가 크게 감소합니다.

비트 단위의 읽기 속도를 높이고 (또한 객실 당 만료 규칙을 추가로 허용하는) 색인을 사용하여 모든 채팅방의 만료 시간 기록을 데이터베이스에 저장 (기록 또는 고정) 할 수 있다면 쉽게 선택할 수 있습니다.

+1

PHP는이를 위해 사용할 수 있습니다 예를 들어 이미 작성된 BL 코드에 쉽게 액세스 할 수 있습니다. 서비스 (실시간 추적을위한 서비스)로 계속 실행하는 데 문제가 있습니다. 최소한이 스크립트에 대한 런타임 제한을 없앨 수있는 시스템에서 다음과 같이 설정할 수 있습니다. 다음 가능한 이벤트가 발생할 때까지 sleep() 논리를 작성하십시오. 다음 만료 또는 가능한 최소 만기].런타임-제한과 함께 생활해야하는 경우 당신은 아직도 당신이 (한 분 후 종료 스크립트 분마다를 cron과) 지금 사용하는 방식을 사용할 수 있습니다 그냥 잠을 추가()! –

+0

는 정말 죄송하지만 코드는 내가 추가하는 것을 잊었다 (500000)를 usleep 있습니다. 500ms 수면은 대부분의 고객에게 서버의 평균 대기 시간을 기준으로합니다. 그래서 ... loop : 초당 최대 2 call, ajax poll : 60 명의 시청자가 있다면 초당 60 call. – yowmamasita

+1

좋아, 그걸로 옳은 길을 걷고있어. 검사 대기 시간을 줄이기위한 클라이언트 측 계산에 대한 제안이 여전히 적용됩니다. 독립적으로, 다음 가능한 이벤트까지 수면에 대한 가능성도 적용 : 당신의 선택은 다음 만료 (현재 열려있는 채팅방이없는 경우, 큰 값을) X 초 후에이라고 말한다면, 시스템의 최소 만료 시간 (심지어 가능한 방의 수를 세는 것)이 Y 초이면 검사를 다시 수행 할 필요없이 min (X, Y)를 자면됩니다. 다음, 가능성이 과정을 확인하고, 300 초에 update_max_users에서는 setTimeout –

1

저는 의견 당 node.js과 같은 기술을 사용하는 것이 좋습니다.이 기술은 응용 프로그램을 빌드하기위한 비동기 플랫폼 인 I/O를 짝수 구동합니다. 대화방이 외부 응용 프로그램 인 경우 쉽게 소켓을 열고 대화방을 청취하고, 로그인하고, 사용자의 활동을 확인하고, 특정 이벤트를 수신 할 수 있습니다. (socket.io와) Node.js를위한

+0

채팅 메시지에 입력 기능 update_max_users()의 사항 clearTimeout (나는이 권리를?하고있는 중이 야) 새로운 X를,() 결정 – yowmamasita

1
#!/usr/bin/php 
<?php 

if(file_exists('/tmp/chatrooms_cron.lock')) { 
    die('There is already a script running.'); 
} 

file_put_contents('/tmp/chatrooms_cron.lock', 1); // Storing pid would be better 

// Run loop forever 
while(true) 
{ 
    $idle_time = get_all_chatrooms_idle_time(); 

    foreach($idle_time as $s_time) 
    { 
    if($s_time >= 300) 
    { 
     update_changes(); 
    } 
    } 

    sleep(60); 
} 

팁 :

나는 그것의 좋은 직장에서 Node.js를 사용해 왔습니다! 실시간으로 브라우저가 ie5/ie6까지 작동합니다. 이것은 node.js에서 내부적으로 수행 될 수 있습니다.

setInterval(function() { 
    // Fetch and update peers 
}, 300000); 
관련 문제