Я создал PHP-скрипт, который подключается к серверу TCP Socket, отправляет идентификацию и получает постоянные обновления. (Он подключается к моему термостату) Однако в настоящее время PHP будет держать сокет открытым, пока он не закроется моим термостатом. Как я могу автоматически закрыть сокет из скрипта PHP через 5 секунд?
<?php
//Port and IP
$service_port = ('5000');
$address = ('10.0.0.14');
// Create a TCP/IP socket.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "<br />";
} else {
echo "OK.<br />";
}
echo "Attempting to connect to '$address' on port '$service_port'...";
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
echo "socket_connect() failed.<br />Reason: ($result) " . socket_strerror(socket_last_error($socket)) . "<br />";
} else {
echo "OK.<br />";
}
$in .= "{ \"action\": \"identify\", \"options\": {\"core\": 0,\"receiver\": 1,\"config\": 0,\"forward\": 0}, \"media\": \"all\"}";
$out = '';
//Send Message
socket_write($socket, $in, strlen($in));//Reply
echo "Reading response:<br /><br />";
while ($out = socket_read($socket, 2048)) {
echo $out."<br /><br />";
}
socket_close($socket);
?>
`
Розетки открыты, пока исключение не происходит. Вы должны установить значение времени ожидания чтения сокета до того, как начнете его читать.
socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));
Если вы этого не сделаете, пока цикл будет ждать сигнала до тех пор, пока не будет навсегда.
Других решений пока нет …