Vales
Новичок
Приветствую господа !
Будем очень признательны в помощи для разрешения следующей проблемы:
Мы пытаемся наладить скрипт для прослушки портов, предназначенный для
обслуживания GPS-трекеров. Данный скрипт (текст скрипта приведен ниже)
по замыслу должен быть многозадачным. В принципе так и есть, но он работает
корректно при небольшом количестве подключенных трекеров (8-10). Если трекеров
больше, то некоторые входящие процессы (или запросы) начинают зависать и естественно скрипт
перестает принимать другие запросы.
Если посмотреть через консоль, то это выглядит так:
то приходится перезапускать его заново. А если из браузера, то убивается указанный процесс и
скрипт работает дальше, но недолго. И все трекера просто не успевают отбиваться.
В данный момент нам надо обслужить около 100 трекеров.
Будем очень признательны за подсказки, в каком направлении копать.
ЗЫ. Злопыхателей, со словами, "мол, вы чайники-кофейники, мануалы читать надо" просим не растрачивать
попусту слова. Мы итак знаем, что мы "чайники" и мануалы читали. Не помогло
собсно сам код скрипта:
Будем очень признательны в помощи для разрешения следующей проблемы:
Мы пытаемся наладить скрипт для прослушки портов, предназначенный для
обслуживания GPS-трекеров. Данный скрипт (текст скрипта приведен ниже)
по замыслу должен быть многозадачным. В принципе так и есть, но он работает
корректно при небольшом количестве подключенных трекеров (8-10). Если трекеров
больше, то некоторые входящие процессы (или запросы) начинают зависать и естественно скрипт
перестает принимать другие запросы.
Если посмотреть через консоль, то это выглядит так:
или так/$ lsof -i:8801
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php 2179 root 4u IPv4 48358122 0t0 TCP u15830258.onlinehome-server.com:8801->2.72.173.130:xinupageserver (CLOSE_WAIT)
php 2179 root 5u IPv4 46930255 0t0 TCP u15830258.onlinehome-server.com:8801 (LISTEN)
в этой ситуации помогает только kill -9 2179. При этом если скрипт прослушки запущен консольно,/$ lsof -i:8801
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php 2179 root 4u IPv4 48358122 0t0 TCP u15830258.onlinehome-server.com:8801->2.72.173.130:xinupageserver (ESTABLISHED)
php 2179 root 5u IPv4 46930255 0t0 TCP u15830258.onlinehome-server.com:8801 (LISTEN)
то приходится перезапускать его заново. А если из браузера, то убивается указанный процесс и
скрипт работает дальше, но недолго. И все трекера просто не успевают отбиваться.
В данный момент нам надо обслужить около 100 трекеров.
Будем очень признательны за подсказки, в каком направлении копать.
ЗЫ. Злопыхателей, со словами, "мол, вы чайники-кофейники, мануалы читать надо" просим не растрачивать
попусту слова. Мы итак знаем, что мы "чайники" и мануалы читали. Не помогло
собсно сам код скрипта:
PHP:
error_reporting(1);
set_time_limit(0);
ini_set("max_execution_time","0");
ini_set('error_log',"1");
ini_set("memory_limit","9999M");
ignore_user_abort(1);
ob_implicit_flush();
require('mylib.php');
/*
цепляем библиотеки
*/
$day_log = "/";
$dl = fopen($day_log."daylog.log", "a+");
fputs($dl, "\n*************************************\n Server is started\n");
$address = "192.168.0.1";
$port = 8801;
fputs($dl,"Create socket ... ");
if (($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
fputs($dl,'socket_create() failed: '.socket_strerror(socket_last_error())."\n");
fclose($dl);
} else { fputs($dl, "OK\n"); }
fputs($dl,"Socket set option SO_REUSEADDR ... ");
if(!socket_set_option($socket,SOL_SOCKET,SO_REUSEADDR,1))
{
if(is_resource($socket)) socket_close($socket);
fputs($dl,'socket_set_option() failed: '.socket_strerror(socket_last_error())."\n");
fclose($dl);
}
else { fputs($dl, "OK\n"); }
if(!socket_set_nonblock($socket))
{
if(is_resource($socket)) socket_close($socket);
}
fputs($dl,"Bind socket ... ");
if(!socket_bind($socket, $address, $port))
{
if(is_resource($socket)) socket_close($socket);
fputs($dl,'Unable to bind socket: '.socket_strerror(socket_last_error())."\n");
fclose($dl);
}
else { fputs($dl, "OK\n"); }
fputs($dl,"Listen socket ... ");
if(!socket_listen($socket))
{
if(is_resource($socket)) socket_close($socket);
fputs($dl,'Unable to listen socket: '.socket_strerror(socket_last_error())."\n");
fclose($dl);
die(socket_strerror(socket_last_error($socket)));
}
else { fputs($dl, "OK\n"); }
$abort = false;
while(!$abort) {
$clientID = uniqid("client_");
$client = socket_accept($socket);
if (($client) < 0 || $client == FALSE )
{
if(is_resource($client)) socket_close($client);
continue;
}
else
{
$clients[$clientID] = new client($client, $clientID);
if($clients[$clientID]->rs)
{
fputs($dl, $clients[$clientID]->rs->paramID.'( process ID:'.$clientID.") -- OK -- \n");
}
unset($clients[$clientID]);
}
if(is_resource($client)) socket_close($client);
}
fclose($dl);
socket_close($socket);
class client {
var $connection;
var $buffer = '';
var $rs = NULL;
function client($connection, $cid) {
$this->connection = $connection;
$input = socket_read($this->connection, 1024);
if(!$input) return NULL;
$protocol = Tcommander::defineType($input);
switch($protocol)
{
case '1':
$command = Tcommander::redviewInit($input);
/*
тут мы распознаем протокол, парсим его и пишем результат в базу
*/
break;
} // sw
$this->disconnect();
return $this->rs = $command;
}
function disconnect() {
if(is_resource($this->connection))
socket_close($this->connection);
}
function send($str) {
socket_write($this->connection,$str);
}
}