Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: FreeBSD daemon висит в процессах и постоянно растет в размере
 
 автор: nick1984   (11.07.2007 в 08:06)   письмо автору
 
 

Такая проблема.
Есть такой игровой демон, который запускается на FreeBSD и висит в процессах:

while($work) {

 // main cycle work while $work
 $work = 1;

 // process queries
 $ret = $daemon->process();

 // no clients - sleep 20msec
 if((int) count($daemon->_data["s_clients"]) == 0) {
    usleep(20);
 }
}

При работе игры в бесконечном цикле выполняется функция process(), которая считывает инфу с сокетов, ну и выполняет определенные действия.

Беда в том, что размер этого ресурса (SIZE и RES в процессах) постоянно растут. Ну и при достижении предела демон вырубается. Что это за размер ресурса и как его можно регулировать? Может как-то очищать?

   
 
 автор: Sobachka   (11.07.2007 в 08:19)   письмо автору
 
   для: nick1984   (11.07.2007 в 08:06)
 

покажите

process()

   
 
 автор: nick1984   (11.07.2007 в 08:27)   письмо автору
 
   для: Sobachka   (11.07.2007 в 08:19)
 


function process() {
    /* sockets we want to pay attention to */
    $set = array_merge($this->get("s_clients"));
    $set[] = $this->get("s_listen");

    if(is_array($this->_data["s_clients"])) {
        foreach(array_values($this->_data["s_clients"]) as $key => $sock) {
            if($this->get("timeout") > 0
                && time() - (int)$this->_data["cdata"][$sock]["last"] > $this->get("timeout")) {
                $this->send_single($sock, "DROP because timeout: ");
                $this->log("Quit here");
                $this->handle_quit($sock);
            }
        }
    }

    if(isset($set) && socket_select($set, $set_w = NULL, $set_e = NULL, 1, 0) < 10) {
        /* loop through sockets */
        foreach ($set as $key => $sock) {
            /* listening socket has a connection, deal with it */
            if($sock == $this->get("s_listen")) {
                if(!($s_new = socket_accept($this->get("s_listen"))))
                    $this->myerror("socket_accept failed");
                else {
                    /* add socket to client list and announce connection */
                    $this->_data["s_clients"][$s_new] = $s_new;
                    socket_getpeername($s_new, $addr);
                    $this->_data["cdata"][$s_new]["addr"]  = $addr;
                    $this->_data["cdata"][$s_new]["buf"]   = '';
                    $this->log("[connection]: $addr\t".time());
                    $this->handle_connect($s_new);
                }
            } else {
            /* client socket has incoming data */
                $read = $this->read($sock);
                $dfp = fopen("debug.log", "at");
                print_r(socket_get_status($sock));
                fputs($dfp, "read-socket:$read:read-socket\n");
                fputs($dfp, "socket:".serialize(socket_get_status($sock))."\n");
                fclose($dfp);
                $this->log("Read: ".$read);
                if(!$read) {
                if($read != '')
                    $this->myerror("socket_read failed");
                else /* no error, but connection was closed, so tell everyone */ {
                    $this->log("TELL everone ;-)");
                    $this->handle_quit($sock);
                }
            } else {
                /* only want data with a newline */
                $ret = $this->handle_data($sock, $read);
                    if(!empty($ret))
                     $this->send_single($sock, $ret);
                }
            }
        }

        if($this->_data["cdata"][$sock]["quit"]) {
            $this->log("->_data[cdata][sock][quit] ;-)");
            $this->handle_quit($sock);
        }
    }
}

   
 
 автор: nick1984   (11.07.2007 в 08:50)   письмо автору
 
   для: nick1984   (11.07.2007 в 08:27)
 

Вообще, что значат SIZE и RES в процессах? Может где заводятся временные файлы, куда складируются какие-то данные, размер которых и есть эти переменные?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования