Здравствуйте... Создали систему gps мониторинга. Остановились на проблеме приёма данных с 100 навигаторов. Скрипт у нас написан на php. При некоторой работе вылетает за сутки или несколько часов. Поток данных большой. Помогите в какую сторону копать что бы Socket Listen не зависал!!!
Пример кода:
<?php
ini_set('default_socket_timeout', 3000);
sleep(60);
set_time_limit(0);
$address = '0.0.0.0';
$port = 1234;
$Position_related_report_1 = array('GTTOW', 'GTDIS', 'GTIOB', 'GTSPD', 'GTSOS', 'GTRTL', 'GTDOG', 'GTIGL', 'GTHBM');
$Position_related_report_2 = array('GTFRI');
$Position_related_report_3 = array('GTERI');
$Position_related_report_4 = array('GTEPS', 'GTAIS');
$Position_related_report_5 = array('GTLBC');
$Position_related_report_6 = array('GTIDA');
$Position_related_report_7 = array('GTGEO');
$Position_related_report_8 = array('GTGES');
$Event_report_1 = array('GTMPN', 'GTMPF', 'GTBTC');
$Event_report_2 = array('GTSTT');
$Event_report_3 = array('GTANT');
$Event_report_4 = array('GTIGN');
$Event_report_5 = array('GTIGF');
$Event_report_6 = array('GTGSS');
$Device_information_report = array('GTINF');
$General_command_array = array('GTTOW', 'GTDIS', 'GTIOB', 'GTSPD', 'GTSOS', 'GTRTL', 'GTDOG', 'GTIGL', 'GTHBM',
'GTFRI', 'GTERI', 'GTEPS', 'GTAIS', 'GTLBC', 'GTIDA', 'GTGEO', 'GTGES', 'GTMPN',
'GTMPF', 'GTBTC', 'GTSTT', 'GTANT', 'GTIGN', 'GTIGF', 'GTGSS', 'GTINF');
// Create a TCP Stream socket
$sock = socket_create(AF_INET, SOCK_STREAM, 0);//0 or SOL_TCP
echo "PHP Socket Server started at " . $address . " " . $port . "\n";
if ($sock < 0) {
echo "Error: " . socket_strerror(socket_last_error()) . "\r\n";
exit();
} else {
echo "OK \r\n";
}
// Bind the socket to an address/port
$bind = socket_bind($sock, $address, $port);
if ($bind < 0) {
echo "Error: " . socket_strerror(socket_last_error()) . "\r\n";
exit();
} else {
echo "OK \r\n";
}
//разрешаем использовать один порт для нескольких соединений
socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);
//socket_connect($sock, $address, $port) or die("Could not connect to server\n");
// Start listening for connections
echo "Listening socket... ";
/*Цифра 5 здесь означает, что мы разрешим встать в очередь на подключение к этому адресу максимум пяти клиентам.
sudo sysctl -a | grep somaxconn
*/
$listen = socket_listen($sock, 100);//слушаем сокет
if ($listen < 0) {
echo "Error: " . socket_strerror(socket_last_error()) . "\r\n";
exit();
} else {
echo "OK \r\n";
}
while (true) {
echo "Waiting... ";
/* Accept incoming requests and handle them as child processes */
$client = socket_accept($sock);
if ($client === false) {
echo "Error: " . socket_strerror(socket_last_error()) . "\r\n";
usleep(100);
} else {
echo "OK \r\n";
echo "Client \"" . $client . "\" has connected\r\n";
// Read the input from the client – 1024 bytes
try {
$str = socket_read($client, 1024, PHP_BINARY_READ);
echo "socket_read: " . $str . "\n";
} catch (Exception $e) {
socket_close($client);
continue;
}
if ($str == null) {
echo "socket_read: NULL";
socket_close($client);
continue;
}
if ($str === false) {
echo("Couldn't create socket: [" . socket_last_error() . "] " . socket_strerror(socket_last_error()));
} else {
$input = mb_convert_encoding($str, "UTF-8");
echo "received: " . $input . "\n";
$result = explode(',', $input);
$command_array = explode(':', $result[0]);
$command_type = $command_array[0];
$command = $command_array[1];
//Parser
//Обработка данных
}
}
// Close the client (child) socket
socket_close($client);
}
// Close the master sockets
socket_close($sock);