Dieze1
Новичок
Здравствуйте, уважаемые гуру.
Пишу PHP-скрипт, который запускаясь в CLI, принимает и парсит сообщения от абонентских устройств. Вот часть кода сервера:
Так вот проблема в том, что по достижении приблизительно 40 открытых соединений, функция socket_read начинает периодически выкидывать ошибки 10053(WSAECONNABORTED) и 10054(WSAECONNRESET), отключая соответствующие открытые сокеты.
Как видно из листинга, уже испробовано увеличение буферов входящих и исходящих данных сокетов, различные варианты тайм-аутов функции socket_select, различные варианты параметра backlog функции socket_listen, уже ковырялся в ОС, подключал сервер напрямую к Интернету (без роутера), перечитал кучу форумов, ничего не помогло...
ОС: Windows Server 2008 R2 x64
PHP: v.5.4
Please, help!!!
Пишу PHP-скрипт, который запускаясь в CLI, принимает и парсит сообщения от абонентских устройств. Вот часть кода сервера:
PHP:
echo date("Y-m-d H:i:s",time()+$GMT*60)." socket_create...";
if (($sock = socket_create (AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo " failed: reason: " . socket_strerror (socket_last_error()) .$breaker;
} else echo " OK".$breaker;
echo "Сокет ".((socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)==false)?"НЕ":"")." настроен на многочисленные соединения ".$breaker;
echo "Сокет ".((socket_set_option($sock, SOL_SOCKET, SO_KEEPALIVE, 1)==false)?"НЕ":"")." настроен на поддержание жизни соединений".$breaker;
echo "Сокет ".((socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>10, "usec"=>0))==false)?"НЕ":"")." настроен на таймаут в 10 секунд ".$breaker;
socket_set_option($sock, SOL_SOCKET, SO_RCVBUF,1024*1024);
echo "Буфер входящих данных сокета ".socket_get_option($sock, SOL_SOCKET, SO_RCVBUF).$breaker;
socket_set_option($sock, SOL_SOCKET, SO_SNDBUF,1024*1024);
echo "Буфер исходящих данных сокета ".socket_get_option($sock, SOL_SOCKET, SO_SNDBUF).$breaker;
//socket_set_timeout($sock, 2);
echo "Сокет ".((socket_set_nonblock($sock)==false)?"НЕ":"")." установлен в неблокирующий режим ".$breaker;
// "bind" the socket to the address to "localhost", on port $port
// so this means that all connections on this port are now our resposibility to send/recv data, disconnect, etc..
echo date("Y-m-d H:i:s",time()+$GMT*60)." socket_bind...";
if (($ret = socket_bind ($sock, $adress, $port)) < 0) {
echo " failed: reason: " . socket_strerror (socket_last_error()) .$breaker;
} else echo " OK port $port".$breaker;
echo date("Y-m-d H:i:s",time()+$GMT*60)." socket_listen...";
if (($ret = socket_listen ($sock, SOMAXCONN)) < 0) {
echo " failed: reason: " . socket_strerror (socket_last_error()) .$breaker;
} else echo $ret." OK".$breaker;
echo "максимум соединений: ".SOMAXCONN.$breaker;
$clients = array($sock);
while (true) {
$read = $clients;
$write = array();
$except = array();
$ss=socket_select($read,$write,$except,0,100);
if ($ss===false) echo "socket_select() failed, reason: ".socket_strerror(socket_last_error()) .$breaker; elseif ($ss < 1) continue;
// check if there is a client trying to connect
if (in_array($sock, $read)) {
$clients[] = $newsock = socket_accept($sock);
socket_getpeername($newsock, $ip);
$keysock=array_search($newsock, $clients);
echo date("Y-m-d H:i:s",time()+$GMT*60)."New client connected: {$ip} on socket $keysock; Всего ".count($clients).$breaker;
$key = array_search($sock, $read);
unset($read[$key]);
}
foreach ($read as $read_sock) {
//обработка полученного сообщения
}
}
Как видно из листинга, уже испробовано увеличение буферов входящих и исходящих данных сокетов, различные варианты тайм-аутов функции socket_select, различные варианты параметра backlog функции socket_listen, уже ковырялся в ОС, подключал сервер напрямую к Интернету (без роутера), перечитал кучу форумов, ничего не помогло...
ОС: Windows Server 2008 R2 x64
PHP: v.5.4
Please, help!!!