| |
|
|
| | Такая проблема.
Есть такой игровой демон, который запускается на 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 в процессах) постоянно растут. Ну и при достижении предела демон вырубается. Что это за размер ресурса и как его можно регулировать? Может как-то очищать? | |
| |
|
|
| |
|
|
| |
для: nick1984
(11.07.2007 в 08:06)
| | | покажите | |
| |
|
|
| |
|
|
| |
для: 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:27)
| | | Вообще, что значат SIZE и RES в процессах? Может где заводятся временные файлы, куда складируются какие-то данные, размер которых и есть эти переменные? | |
| |
|
|