Сервер на php не держит больше 20 активных игроков

Рейтинг: 1Ответов: 2Опубликовано: 01.10.2014

Всех, приветствую!

Делаю iframe приложение под Вконтакт. Сервер на php.
Проблема в том, что сервер не держит больше 20 человек, активно отсылающих запросы. Как можно оптимизировать код? Или может быть, я где-то ошибся. Заранее всем отписавшимся спасибо.

Вот краткий код:

    $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    $b = socket_bind($sock, 0, NET_PORT);
    $l = socket_listen($sock);

    while(!$this->stop) {
        $this->waitChange(); // изменим массив изменившихся сокетов
        $this->checkConnect(); // проверим присоединившихся
        $this->readMessages(); // читаем присланные данные
        $this->checkDisconnect(); // проверяем отсоединившихся
    }

    function waitChange()
    {
        $this->changed = array_merge([$this->sock], $this->sockets);
        socket_select($this->changed, $write = NULL, $except = NULL, 0);
    }

    function checkConnect()
    {
        if (!in_array($this->sock, $this->changed)) {
            return;
        }

        $new_sock = socket_accept($this->sock);
        $this->sockets[] = $new_sock;
        unset($this->changed[0]);
    }

    function readMessages()
    {
        foreach ($this->changed as $key => $read_sock) {
            $data = @socket_read($read_sock, 1024, PHP_NORMAL_READ);
            if($data === false) continue;

            $request = json_decode($data);
            if($request === NULL) continue;

            switch($request->method)
            {       
                case "new_player":
            {
            /////// исполняется различный код
                }

            unset($this->changed[$key]);
        }
    }

Ответы

▲ 1Принят

Проблема в том, что на каждое активное соединение будет висеть свой процесс PHP. А это немало памяти, да и иные ограничения могут быть на кол-во одновременно запущенных процессов.

Поэтому php — неудачный выбор технологии. Смотрите, как уже писали, на nodejs.

▲ 2

У вас последовательная обработка соединений - это медленно. Для php есть PhpDaemon, к примеру, который позволяет асинхронно обрабатывать соединения. Но, я думаю, что для этих целей все же лучше nodejs.