2009-12-16 89 views
2

我有一個使用flash和php開發的遊戲網站。該PHP代碼包含4000行,它將作爲一個cron運行。在代碼中,有一個while循環,它將無限地運行用於檢查任何數據寫入套接字並相應地調用不同的函數,並將結果發送回套接字。從閃光燈,它會得到結果,並將顯示。Php顯示CPU使用率的97%

我面對的問題是,從PHP代碼的某個地方,它正在泄漏內存。由於它非常大,我無法從中發現它。而且它只能作爲cron運行。有沒有什麼工具可以找出內存泄漏?我聽說過xdebug,但我沒有使用。任何其他 ?

check.php(如的cron)

$sock = fsockopen(IP_ADDRESS, PORT, $sock_error_code, $sock_error_string, 10); if (!$sock){ 
     $message = "Server was down, restarting...\n\n"; 
     $last_line = system("php -q gameserver/server.php", $retval);} else { 
     $message = "Server is up..."; 
     $message .= $sock_error_string." (".$sock_error_code.")\n\n";} 

server.php(僅限某些部分)

class gameserver { 
var $server_running = true; 
function gameserver() { 
    global $cfg, $db; 

    $this->max_connections = $cfg["server"]["max-connections"]; 

    $this->start_socket(); 

    echo "Gameserver initialized\n"; 
    while ($this->server_running) { 
     $read = $this->get_socket_list(); 
     $temp = socket_select($read, $null, $null, 0, 15); 
     if (!empty($read)) { 
      $this->read_sockets($read); 
     } 
     $db->reconnection(); 
     $this->update_DB_records(); 
     $this->check_games_progress(); 

     if ($this->soft_shutdown && $this->active_games == 0) { 
      $this->server_running = false; 
      echo "soft shutdown complete\n"; 
     } 
    } 

    $this->stop_socket(); 

    echo "Server shut down\n"; 
}}  $server = new gameserver(); 
+0

發佈你的一些代碼會有幫助;否則,它主要是一個猜謎遊戲。 – 2009-12-16 14:24:25

+1

CPU使用率?內存泄漏?這是什麼? – 2009-12-16 14:25:32

+0

在問題中發佈代碼會稍微有幫助。 – 2009-12-16 15:08:08

回答

5

首先,有兩件事情可以確保您至少在循環中睡眠一次,以確保您不會使用97%的cpu。第二,我發現的一個技巧是,如果有任何數據庫活動,要調用mysql_free_result(或者它與其他DBMS相同)來釋放用於存儲查詢結果的內存。

+0

我在循環中加入了sleep(1),所以現在它不使用97%的CPU。希望這不會導致任何其他瓶頸問題後..謝謝你的答覆.. – binoy 2009-12-17 10:54:54

+0

您可能需要考慮客戶端輪詢您的服務器的頻率,以及您是否可以調整您的睡眠量以進一步減少運行腳本所花費的時間。 – Kazar 2009-12-17 11:10:50

5

你開始從cron永無止境的計劃? Cron將按照您指定的時間表開始一個新實例,並且最終會有幾個正在運行的程序執行相同的操作。難道這是您的問題嗎?

+1

這是完全有意義的......它看起來像* * * * *如果是這樣,您將嘗試每次都用一個無限循環運行該cron! – Lizard 2009-12-16 14:16:19

+0

沒有..我確定它只發生過一次.. plz看看我的代碼 – binoy 2009-12-16 15:41:03

2

我假設你不使用每分鐘的cron啓動一個新的實例,並在各運行一個無限循環:

XDebug的可能是你最好的選擇。除此之外,您可以使用memory_get_usage()並記錄循環中特定點的內存使用情況。

難道只是您的腳本在每個循環的末尾累積數據並沒有正確清理它?

+0

沒有..我確定它只發生過一次...雅,它可能是積累數據的地方,但它是不明智的發現從4000行 – binoy 2009-12-16 15:04:21

+1

那麼,歡迎來到調試世界。 – 2009-12-16 15:09:44

+0

ok ..即使下面的程序顯示97%的CPU使用率的百分比,如果我從命令提示符運行.. <?php $ bool = true; 而($布爾) { } ?> 任何方式經常騰出CPU使用率? – binoy 2009-12-17 09:31:56