PHP unread_bytes работает в PHP 5.3, но не в PHP 5.4

0

У меня возникла проблема с подключением к 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;
        }

Может ли кто-нибудь помочь мне или сказать мне, что я могу изменить?

  • 0
    Добро пожаловать в 2014, PHP 5.3 больше не поддерживается, PHP 5.4 почти не поддерживается, все и их родители предлагают вам перейти на PHP 5.6 или хотя бы PHP 5.5. По состоянию на документацию: unread_bytes: You shouldn't use this value in a script.
  • 0
    Ну, это внутренний буфер ... Так что ... нет никаких гарантий относительно того, что на самом деле осталось для чтения. Разве единственное feof() работает для вас?
Показать ещё 3 комментария
Теги:
sockets
telnet

1 ответ

0

Вы четко не указали, что должен делать ваш фрагмент кода:

  1. читать байты до тех пор, пока соединение сокета не будет отключено, или
  2. читать байты, доступные на данный момент, в реальном соединении.

Но ваш комментарий feof() не работает правильно, указывает, что вы после 2., так как feof() будет достаточной для 1; ср комментарий от Wez к "Not a bug" unread_bytes всегда 0:

unread_bytes - это количество байтов, оставшихся на уровне буферизации PHP после последнего чтения.
Если вы потратили все данные из буфера при предыдущем чтении, unread_bytes останется на нуле до тех пор, пока вы не прочитаете фрагмент данных из сети.
Таким образом, unread_bytes не следует использовать для определения того, ожидает ли еще данных; вы должны использовать:

feof() для обнаружения конца файла. Не забывайте, что здесь вы можете использовать неблокирующий режим. PHP 4.3 имеет новую функцию stream_select(), которая ведет себя как socket_select() из расширения сокетов, но работает со всеми файлами, возвращаемыми fopen() и fsockopen(). Вы можете использовать его для проверки, какие файлы готовы для чтения/записи, а также указать тайм-аут.

Итак, если вы хотите 2., вы можете использовать stream_select() или socket_select().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню