Выполнять скрипт PHP только на фиксированное время - PullRequest
0 голосов
/ 17 мая 2018

У меня есть функция, которая создает соединение через сокет и прослушивает номер порта для сообщений HL7, отправленных лабораторным компьютером через TCP.

Если лабораторный аппарат ничего не отправляет, моя функция прослушивания продолжает слушать. Есть ли способ указать, что он должен слушать только, скажем, 10 секунд, а затем, если нет сообщений, выдается ошибка?

    $address = '0.0.0.0';
    $port = 5600;

    // Create a TCP Stream socket
    $sock = socket_create(AF_INET, SOCK_STREAM, 0);

    // Bind the socket to an address/port
    $bind = socket_bind($sock, $address, $port);

    // Start listening for connections
    socket_listen($sock);

    $client = socket_accept($sock);

    // Read the input from the client
    $input = socket_read($client, 2024);

    // Strip all white spaces from input
    $segs = explode("|",$input);

    // Close the master sockets
    $close = socket_close($sock);

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Это выглядит как проблема XY .

То, что вы хотите измерить, действует как клиент, скорее подразумевает, что вы можете захотеть сделать больше, чем просто обнаружить открытое соединение TCP вваш сценарий, например, захватить некоторые данные.Кроме того, базовая ОС имеет множество сложных, хорошо протестированных, надежных и настраиваемых механизмов для отслеживания состояния соединений.

Хотя вы могли бы делать то, что предлагает stefo91, и пытаться манипулировать тайм-аутом приема, я не уверенесли это применяется в ожидании начального соединения.Лучшим решением было бы установить сокет на неблокирующую .Не забудьте либо:

  • ввести некоторые вызовы sleep () / usleep () или
  • использовать socket_select ()

если вы не хотите, чтобы ваш сценарий сжигал много ресурсов, и ничего не нужно делать.

Но в зависимости от большого количества информации, о которой вы нам не сообщили, правильным решением может быть запуск одного сценария.как сервер, а второй как монитор.Вторым может быть опрос / анализ выходных данных netstat для проверки соединения.

0 голосов
/ 17 мая 2018

Это решение:

socket_set_option($sock,SOL_SOCKET,SO_RCVTIMEO,array("sec"=>10,"usec"=>0)); // after 10 seconds socket will destroy the connection. Also you can set and uses
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...