我有一个使用flash和php开发的游戏网站。 php代码包含4000行,它将作为cron运行。在代码内部,有一个while循环,它将运行无限来检查在套接字中写入的任何数据,并相应地调用不同的函数,并将结果发送回套接字。从闪存中,它将获得结果并将显示。
我面临的问题是,从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 :(得分:5)
你是否从CRON开始永无止境的节目? Cron会根据你指定的时间表启动一个新的实例,你最终会有几个正在运行的程序做同样的事情。这可能是你的问题吗?
答案 1 :(得分:5)
首先,确保你在循环中至少睡一次,以确保你不使用97%的cpu。
其次,我发现的一个技巧是,如果有任何数据库活动,则调用mysql_free_result(或者它等同于其他DBMS')来释放用于存储查询结果的内存。
答案 2 :(得分:2)
我假设您没有每分钟使用cron启动一个新实例,并且每个实例都运行一个无限循环:
XDebug可能是你最好的选择。除此之外,您可以使用memory_get_usage()并在循环的特定点记录内存使用情况。
可能只是因为你的脚本在每个循环结束时累积数据并且没有正确清理它?