2012-12-22 42 views
1

我建立了一個網站,我用彗星與PHP。只要我做了一些研究並找到教程看起來很容易實現,對服務器也沒有特別的要求,除了它會使用大量的資源。現在,我收到託管通知,我的腳本正在吃掉90%的CPU資源:(我把腳本關掉了,但我的問題是現在最好使用什麼?我讀了關於node.js的內容,但也讀了他們會需要一些必要條件有關服務器的任何好,容易在這種情況下實施的解決方案php彗星:吃的CPU資源

那是要確定與VPS或專用服務器,如果讓說,我有每天2000個用戶在這個彗星腳本

編譯的???

/*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

彗星本身並沒有使用大量的資源,除非被指示 - 它是劇本。如果你要在JavaScript中爲Node.js服務器重寫看似CPU密集的腳本,它很可能會以相同的方式執行。

將「推送」系統組合在一起通常包括設置一個雲實例 - 例如,免費的Heroku--或者設置一個專用的/ VPS服務器來訪問shell。

和Node.Js是一個較新的,雖然相對不成熟的實施「推」技術。爲了讓節點運行,你需要安裝一個node.Js服務器。很少有主機安裝準備就緒 - 但可以通過幾個簡單的shell命令輕鬆安裝。

但從上述情況判斷,很少有用戶能夠同時使用您的應用程序,因爲它已經在只有一個用戶的90%的CPU上運行。如果用戶在每次會話中使用該應用程序一段時間,那麼肯定每天有2000個用戶是可行的,取決於多少人同時使用它以及何時使用它。也許。

+0

謝謝。我只是用我用於彗星的代碼更新了問題。我用set_time_limit無限。我不確定這段代碼是否有問題。謝謝 – 99Points

+0

@ 99分這很好 - 但它仍然沒有說太多! CPU在哪裏?它是MYSQL查詢嗎?查詢是搜索索引還是探索性的?具有10行或1000萬行的SQL數據庫?不暴露膽量就很難說清楚。但是,請嘗試下面的nanosleep想法,並嘗試限制SQL結果,如果它是由於SQL。 – FredTheWebGuy

+0

而我只提到SQL是一種可能性,因爲除了IO--它也直接與SQL使用相關,它是造成腳本速度下降的最主要原因。 – FredTheWebGuy

1

2000用戶/日是一個小數字,除非典型的會話是1小時左右標準的PHP部署不能是你的sed在服務器推送場景中,因爲每個請求都使用不同的進程處理。

如果您不想購買專用服務器,您可以嘗試回退到重複輪詢(如果假設延遲30秒是可以接受的)。但是,如果這確實有助於CPU的使用取決於您的實際導航模式,所以這只是一個嘗試。

否則,如果您能買得起專用硬件,只需使用您更熟悉的語言即可。既然你命名爲Node.js,我想你可以用Javascript編碼,那麼學習Node可能不是那麼困難的任務。在Python(Twisted),Java,Scala以及你擅長的任何方面都有其他選擇。只需選擇語言,然後相應地選擇框架。

0

通過在循環中運行服務器邏輯,PHP服務器腳本通常保持活動狀態。 當我將運行24/7 CPU使用率的bcakground腳本的類似問題從超過90%降到低於1%時,我將time_nanosleep(0, 10000000);添加到循環的末尾。這不是萬無一失的方法,但它對我很有用。