static variable как буфер чтения в переменной?

AnrDaemon

Продвинутый новичок
Есть класс - обёртка над сокетом.
Из сокета происходит чтение в буфер, потом из буфера разбирается поток на составляющие его элементы. Поток нерегулярный, реальное чтение происходит порциями от одного байта до многих килобайт за раз. Данные в сокет пихаются порциями по размеру буфера (собственно, для этого внутренний буфер, чтобы выкачивать системные буфера и не тормозить приём).
Будет какой-то смысл от использования в процедуре статической переменной под буфер?
PHP:
  protected function _fetch()
  {
    static $_buff = '';

    $_buff = @fread($this->handle, $this->buffSize);
    if(false === $_buff)
    {
      throw new StreamReaderException("Unable to read from resource. Read error encountered.", 1);
    }
    $this->_buffer .= $_buff;

    return strlen($_buff);
  }
(Специально для Вурдалака - это не веб-сайт, это демон… рассчитанный на часы работы.)
 

С.

Продвинутый новичок
Нет никакого смысла в ней, если не использовать ее статические особенности.
А если и есть смысл, то примерно такой же, который требует замены двойных кавычек на одинарные в "Unable to read from resource. Read error encountered."
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Ну, если ты уверен на 101%, что у тебя во все моменты времени существует только один буфер, и в него никто не будет писать... но даже тогда не стоит делать так.
 

fixxxer

К.О.
Партнер клуба
Надо понимать, что этот буфер у тебя будет один для всех инстансов класса. Учитывая, что handle является членом класса, это выглядит архистранно. Что мешает сделать $this->buffer?

UPD: прочитал внимательнее, вообще нифига не понял. $this->buffer у тебя есть, этому $_buff ты сразу же присваиваешь значение, зачем там вообще этот статик? Если ты надеешься таким образом сэкономить на выделениях памяти - нет, не сэкономишь, в любом случае будут копирования в zval.
 

Вурдалак

Продвинутый новичок
Да вы ничего тут не понимаете, бездари, тут демон и часы работы, почти хайлоадъ.
 

AnrDaemon

Продвинутый новичок
прочитал внимательнее, вообще нифига не понял. $this->buffer у тебя есть, этому $_buff ты сразу же присваиваешь значение, зачем там вообще этот статик?
Мне надо знать, сколько реально прочитано за один раз. (Если ничего - "нет новых данных" - это может быть воспринято как "попробуйте позже", либо как "конец работы" - зависит от того, с каким сокетом и что именно делается.)
Если сразу писать в буфер класса…а PHP ведь хранит длину строки отдельно, да? Иначе binary-safe не выйдет.
 

Вурдалак

Продвинутый новичок
Опять какой-то поток сознания.

Тебе задали вопрос:
PHP:
static $_buff = '';
— зачем нужна эта строчка? Если её убрать, то ровным счётом тут ничего не изменится.

Если сразу писать в буфер класса…а PHP ведь хранит длину строки отдельно, да? Иначе binary-safe не выйдет.
Подучи PHP, например. В PHP строки бинарные, не какие-нибудь null terminated, так что это означает, что да, длина строки хранится отдельно.
 
Сверху