Php показывает 97% загрузки процессора - PullRequest
2 голосов
/ 16 декабря 2009

У меня есть игровой сайт, разработанный с использованием 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();

Ответы [ 3 ]

5 голосов
/ 16 декабря 2009

Во-первых, убедитесь, что вы спите внутри цикла хотя бы один раз, чтобы не использовать 97% ЦП.

Во-вторых, уловка, которую я обнаружил, заключается в том, что если есть какие-либо действия с базой данных, вызвать mysql_free_result (или его эквивалент для других СУБД), чтобы освободить память, используемую для хранения результата запроса.

5 голосов
/ 16 декабря 2009

Вы запускаете бесконечные программы из CRON? Cron запустит новый экземпляр в соответствии с указанным вами расписанием, и вы получите несколько запущенных программ, выполняющих одно и то же действие. Может ли это быть вашей проблемой?

2 голосов
/ 16 декабря 2009

Я предполагаю, что вы не запускаете новый экземпляр, используя cron каждую минуту, и каждый из них запускает бесконечный цикл:

XDebug, вероятно, ваш лучший выбор. Кроме этого, вы можете использовать memory_get_usage () и регистрировать использование памяти в определенных точках вашего цикла.

Может ли быть так, что ваш скрипт накапливает данные и не очищает их должным образом в конце каждого цикла?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...