Я создаю сокет следующим образом:
$fp = fsockopen("tcp://".$ip, $port, $errno, $errstr);
stream_set_timeout($fp, 1); // timeout is one second
stream_set_blocking($fp, 1); // block until data is available
Однако, когда я читаю, я всегда получаю тайм-аут, даже после чтения данных:
while(true) {
$result = fgets($fp, 4096);
if(empty($result)) {
break;
}
else {
echo $result;
}
}
Я думаю, что мой метод чтения неправильный, потому что я не совсем понимаю, как php-сокеты работают в фоновом режиме. Мое намерение — читать до тех пор, пока данных больше не будет, или сдаться, если я пытался читать данные в течение определенного периода времени, но данные не стали доступны.
В различных примерах PHP-сокетов я видел использование while (! Feof ($ fp)) для остановки цикла чтения, но, насколько я понимаю, другой конец никогда не отправит маркер eof. Они только отправляют сообщения с разделителями новой строки.
Есть идеи?
Благодарю.
Задача ещё не решена.
Других решений пока нет …