Задать вопрос
@Drengel

Как правильно организовать приём данных с GPS трекера??

Здравствуйте... Создали систему 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);
  • Вопрос задан
  • 2111 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
@maxyc_webber
Web-программист
не совсем в тему может, но вдруг вам поможет socketo.me
у меня на этом движке работают уже несколько месяцев без остановки довольно посещаемые чаты. зависонов не было. могу предположить, что в коде ратчета, где то может находиться решение "для вас антизавис"
Ответ написан
Комментировать
begemot_sun
@begemot_sun
Программист в душе.
Забудьте PHP для демонов как страшный сон, а в особенности для парсинга двоичных протоколов GPS-трекеров.
Ответ написан
@XProx
Кодер
Думаю стоит проверить всё
- время жизни php скрипта
- размер максимально выделяемой ему паямяти
- если запись в базу , то ВРЕМЯ открытого соединения с БД

ПС : я потратил в своё время 4 дня и не нашол, переписал на node js
Ответ написан
@Drengel Автор вопроса
Спустя месяц. Переписал на java. Скрипт работает идеально. 100 трекеров и месяц без глюков.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы