2013-06-26 3 views
0

HTTP 요청을 보낼 때 몇 가지 요청을 차례로 보내야 할 때 Connection: Keep-Alive을 사용하고 싶습니다. 소켓에 데이터가 있는지 어떻게 확인할 수 있습니까? 내 예상 코드 :연결된 소켓에서 데이터를 사용할 수 있는지 여부를 어떻게 확인할 수 있습니까?

$soc = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
    $t = socket_connect($soc, gethostbyname('www.example.com'), 80); 
    if (!$t) { 
     die(socket_strerror(socket_last_error($soc))); 
    } 
    $request = "GET /index.php HTTP/1.1\r\n"; 
    $request .= "Host: www.example.com\r\n"; 
    $request .= "Connection: Keep-Alive\r\n"; 
    $request .= "\r\n"; 
    socket_write($soc, $request); 
    $buffer = ''; 
    $html = ''; 
    while (socket_data_available($soc)/* THIS FUNCTION DOES NOT EXIST*/) { 
     socket_recv($soc, $buffer, 2048, MSG_WAITALL); 
     $html .= $buffer; 
    } 

답변

0

당신이 소켓이 데이터 (그것이 의미하는 것은 무엇이나)를 포함 여부를 확인하는 것이 아니라 HTTP 응답을 읽은 다음 계속 싶지 않은 날 것으로 보인다. 위의 루프를 바꾸면됩니다.

while ($buffer = socket_read($soc, 2048, PHP_NORMAL_READ)) 
{ 
    $html .= $buffer; 
    if ($buffer == "\r") break; 
    if ($buffer == "\n") continue; 
    list($key, $val) = explode(' ', $buffer, 2); 
    if ($key == "Content-Length:") $length = $val; 
} 
$html .= socket_read($soc, 1+$length); 
관련 문제