2015-01-29 4 views
0

TCP 소켓 서버에 연결하여 ID를 보내고 지속적인 업데이트를받는 PHP 스크립트를 만들었습니다. (그것은 내 온도 조절기에 연결됩니다.) 그러나 현재 PHP는 온도 조절기가 닫힐 때까지 소켓을 열어 둘 것입니다. 5 초 후에 자동으로 PHP 스크립트에서 소켓을 닫을 수 있습니까? 예외가 발생되지 않은 상태5 초 후에 PHP 소켓을 닫으십시오.

<?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); 
?> 

`

답변

1

소켓은 열려있다. 소켓 읽기 시간 초과 값을 읽기 전에 값을 설정해야합니다.

socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0)); 

이 작업을 수행하지 않으면 루프는 신호가 발생할 때까지 기다립니다.

+0

SO_RCVTIMEO를 사용해 보았습니다. 서버가 5 초 동안 아무 것도 보내지 않는 한 작동합니다. 그러나 내가 연결하는 tcp 소켓 서버는 매 초마다 하트 비트를 계속 전송합니다. 그 결과 PHP 런타임 타임 아웃이 만료 될 때까지 소켓을 닫지 않습니다. –