2009-12-16 90 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