2012-12-22 2 views
1

나는 혜성을 PHP로 사용하는 웹 사이트를 만들었습니다. 오래 동안 나는 약간의 연구를하고 자습서를 찾았으므로 많은 양의 자원을 사용한다는 점을 제외하면 서버에 특별한 요구 사항을 구현하는 것이 매우 쉬운 것처럼 보인다. 이제는 스크립트에서 90 %의 CPU 리소스를 먹고 있다는 알림을 받았습니다. (스크립트를 껐지 만 지금은 내 질문에 대해 가장 잘 사용해야합니다.) node.js에 대해서도 읽었을뿐 읽고 서버에 대한 몇 가지 요구 사항을 필요로하는 어떤 좋은 쉽게이 상황에서 솔루션을 구현하자 내가이 혜성 스크립트에서 2000 사용자 매일을 말한다면 php 혜성 : CPU 리소스를 먹는 것

이 그 VPS 또는 전용 서버와 괜찮을까요

편집???

/*CLOSE THE SESSION WITH USER DATA*/ 
session_write_close(); 

// set time expire unlimited 
set_time_limit(0); 

$OldPostID  = isset($_REQUEST['OldPostID']) ? intval($_REQUEST['OldPostID']) : 0; 

$result_set_query_1 = $MClass->MyPostings($PageOwner); 

if (mysql_num_rows($result_set_query_1)) 
{ 
    $o = 0; 
    while ($r = @mysql_fetch_array($result_set_query_1)) 
    { 
     $PID = $r['PID']; 
    } 
} 

$NewPostID = $PID; 

while ($NewPostID <= $OldPostID)  
{ 
    usleep(10000); // sleep 10ms to unload the CPU 
    clearstatcache(); 

    $result_set_query_2 = $MClass->MyPostings($PageOwner); 

    if (mysql_num_rows($result_set_query_2)) 
    { 
     $o = 0; 
     while ($rs = @mysql_fetch_array($result_set_query_2)) 
     { 
      $PID = $rs['PID']; 
     } 
    } 

    $NewPostID = $PID; 
} 

// return a json array 
$result_set_posts = $MClass->GetAllMyPostings($PageOwner, $OldPostID, 0); 

} 

답변

1

혜성 자체는 스크립트가 아니라면 많은 자원을 사용하지 않습니다. Node.js 서버의 자바 스크립트에서 보이는 CPU 집약 스크립트를 다시 작성하는 경우 동일한 방법으로 수행 할 가능성이 큽니다.

"푸시 (push)"시스템을 함께 사용하는 것은 일반적으로 예를 들어 Heroku에서 무료로 클라우드 인스턴스를 설정하거나 셸에 대한 액세스 권한이있는 전용/VPS 서버를 설정하는 것과 관련됩니다.

그리고 Node.Js는 비교적 미성숙 한 "푸시 (push)"기술 구현이지만 새롭습니다. 노드를 실행하려면 노드 .Js 서버를 설치해야합니다. 설치 준비가되어있는 호스트는 거의 없지만 몇 가지 간단한 쉘 명령을 통해 쉽게 설치할 수 있습니다.

위 시나리오에서 볼 수 있듯이 한 사용자에 대해서만 이미 90 %의 CPU로 실행 중이기 때문에 일부 사용자는 동시에 앱을 사용할 수 있습니다. 사용자가 각 세션 동안 짧은 시간 동안 앱을 사용한다면 하루에 2,000 명의 사용자가 동시에 얼마나 많은 사용자를 사용하는지에 따라 가능합니다. 아마도.

+0

감사합니다. 방금 혜성에 사용하는 코드로 질문을 업데이트했습니다. 무제한 사용 set_time_limit. 이 코드 조각에 문제가 있는지 확실하지 않습니다. 고마워요 – 99Points

+0

@ 99 포인트 괜찮아요 -하지만 여전히 많이 말하지 않습니다! CPU는 어디로 가고 있습니까? MYSQL 쿼리입니까? 쿼리가 인덱스를 검색하고 있습니까, 아니면 검색 중입니까? 10 개의 행 또는 1 천만 개의 행이있는 SQL DB? 배짱이 드러내지 않으면 말하기가 어려울 것입니다. 그러나, 아래의 nanosleep 아이디어를 시도하고 SQL 때문에 SQL 결과가 제한적으로 시도하십시오. – FredTheWebGuy

+0

그리고 IO는 SQL 사용과 직접 관련이있는 IO 외에도 스크립트의 속도 저하의 가장 큰 원인이기 때문에 SQL을 가능성으로 언급하고 있습니다. – FredTheWebGuy

1

일반 세션이 1 시간 정도되지 않는 한 사용자/일은 약간의 수치입니다. 표준 PHP 배포는 불가능합니다. 각 요청은 다른 프로세스로 처리되기 때문에 서버 푸시 시나리오에서 sed를 사용합니다.

전용 서버를 구입하지 않으려는 경우 반복 폴링으로 폴백을 시도 할 수 있습니다 (30 초 지연이 허용되는 경우). 그러나 이것이 CPU 사용에 실제로 도움이된다면 실제 탐색 패턴에 따라 달라 지므로 단지 시도에 불과합니다.

그렇지 않으면 전용 하드웨어를 구입할 수 있다면 더 편한 언어를 사용하십시오. Node.js라는 이름을 사용했기 때문에 Javascript로 코드를 작성한 다음 Node를 배우는 것이 어려운 작업이 아닐 수도 있습니다. Python (Twisted), Java, Scala, 그리고 능숙한 언어로 된 대안이 있습니다. 언어를 선택하고 그에 따라 프레임 워크를 선택하십시오.

0

PHP 서버 스크립트는 종종 루프에서 서버 로직을 실행하여 매우 중요합니다. bcakground 스크립트를 사용하여 simmilar 문제가 발생했을 때 루프 끝 부분에 time_nanosleep(0, 10000000);을 추가했을 때 연중 무휴 CPU 사용률이 90 %에서 1 % 미만으로 떨어졌습니다.이 방법은 절대 안전한 방법은 아니지만 저에게는 효과적입니다.