У меня возникла проблема с подключением к telnet-серверу с использованием сокетов PHP. У меня законченный класс telnet, но на моем другом сервере этот класс не работал из-за значения stream_get_meta_data unread_bytes. Изменен ли PHP в версии 5.4? Я не могу найти, что об этом изменении.
Код, который я использую:
$buff = '';
while (!feof($this->socket)) {
$buff .= fread($this->socket, 1024);
$stream_meta_data = stream_get_meta_data($this->socket);
if ($stream_meta_data['unread_bytes'] <= 0)
break;
}
Может ли кто-нибудь помочь мне или сказать мне, что я могу изменить?
Вы четко не указали, что должен делать ваш фрагмент кода:
Но ваш комментарий feof() не работает правильно, указывает, что вы после 2., так как feof()
будет достаточной для 1; ср комментарий от Wez к "Not a bug" unread_bytes всегда 0:
unread_bytes - это количество байтов, оставшихся на уровне буферизации PHP после последнего чтения.
feof() для обнаружения конца файла. Не забывайте, что здесь вы можете использовать неблокирующий режим. PHP 4.3 имеет новую функцию stream_select(), которая ведет себя как socket_select() из расширения сокетов, но работает со всеми файлами, возвращаемыми fopen() и fsockopen(). Вы можете использовать его для проверки, какие файлы готовы для чтения/записи, а также указать тайм-аут.
Если вы потратили все данные из буфера при предыдущем чтении, unread_bytes останется на нуле до тех пор, пока вы не прочитаете фрагмент данных из сети.
Таким образом, unread_bytes не следует использовать для определения того, ожидает ли еще данных; вы должны использовать:
Итак, если вы хотите 2., вы можете использовать stream_select()
или socket_select()
.
unread_bytes: You shouldn't use this value in a script.
feof()
работает для вас?