소켓에 다소 특이한 문제가 있습니다. 설정의 기초는 PHP로 작성된 포크 소켓 서버입니다. (나는 알고있다, PHP, 우우, 등, 등)이의fgets()는 socket_select 뒤에 빈 문자열을 반환합니다.
아주 기본적인 코드 샘플은
$controlSockets = stream_socket_pair();
$pid = pcntl_fork();
if($pid == -1)
throw new Exception("Fork error");
else if($pid) {
fclose($controlSockets[0]);
while(true) {
$read = array($controlSockets[1]);
$write = array();
$except = array();
// Sleep for half a second if there's nothing to read
while(stream_select($read, $write, $except, 0, 500000) > 0) {
$r = fgets($controlSockets[1]);
echo "'$r'\n read from socket."; // This outputs ''
}
// Re-set the read array as stream_select alters the array
$read = array($controlSockets[1]);
}
} else {
fclose($controlSockets[1]);
// do some work ...
sleep(5);
// end of work ...
$result = 'blah';
fputs($controlSockets[0], $result);
exit;
}
이제 문제는 ... 것이 그 소켓이 읽기에 포함 된 경우에도 컬렉션, 그러나 그것은 내 지식에 일어날 일은해서는 안된다, feof에 도달하지 않았거나 실제로 내용이있는 빈 문자열을 리턴한다. 처음 5 초 동안 실행되지 않습니다.
보내지는 실제 콘텐츠는 도착해도 괜찮습니다.
무슨 일인지에 대한 단서가 있습니까?
(위의 코드입니다 의사이며, 실제 샘플이 작동하지만, 무슨 일인지 일반적인 생각인지 전혀 생각) 점의
내 좋은 방법은 문제가 실제 코드가 소켓에 예제 코드가하는 같은 방법을 쓰지 않는 것입니다. (PIPE_BUF 바이트 미만의 단일 쓰기.) 예제 코드에서 동일한 문제가 발생하는지 확인하십시오. 그렇지 않으면 실제 문제를 식별하는 데 도움이되지 않습니다. –
사실 충분합니다. 일반적인 전송 크기는 13b 이상에서 (이론적으로) 무한대 사이입니다. –