Может ли скрипт PHP определить, был ли сокет закрыт? - PullRequest
4 голосов
/ 17 сентября 2009

Как скрипт PHP может определить, был ли сокет закрыт удаленной стороной?

Ответы [ 3 ]

4 голосов
/ 17 сентября 2009

С socket_read () :

socket_read() returns the data as a string on success, or FALSE on error 
(including if the remote host has closed the connection). The error code can 
be retrieved with socket_last_error(). This code may be passed to 
socket_strerror() to get a textual representation of the error.

Это довольно стандартный подход для определения, закрыт ли сокет в большинстве языков. Я не верю, что PHP предлагает прямое уведомление в стиле событий (кроме, возможно, чего-то в PEAR).

0 голосов
/ 15 марта 2019

Это не прямой ответ на вопрос, но, возможно, ценная заметка. Если вы звоните socket_close($socket); в нескольких местах и ​​хотите проверить, закрыли ли вы ранее сокет или нет, вы можете сделать это с помощью следующего сравнения:

    if (get_resource_type($socket) === 'Unknown') {
        exit;
    }

Я нашел его, сбросив сокет до и после закрытия var_dump($socket);

  • до закрытия resource(5) of type (Socket)
  • после закрытия resource(5) of type (Unknown)

Но это не говорит о том, закрыта ли розетка с другой стороны или нет. В основном, когда соединение установлено, всегда есть две розетки - по одной на каждую сторону. Так что get_resource_type будет проверять только ваш собственный ресурс, а не другую сторону.

0 голосов
/ 17 сентября 2009

fread($socket) возвращает пустую строку мгновенно, без ожидания истечения времени ожидания сокета.

(Нет, это не реальный ответ, но это хакерское решение, которое я использовал в своем коде ATM. Такое поведение также может зависеть от окон.)

...