public function stream_read($count)
 {
     $result = parent::stream_read($count);
     if (is_callable($this->readCallback)) {
         call_user_func($this->readCallback, $count);
     }
     return $result;
 }
 public function stream_read($count)
 {
     $result = parent::stream_read($count);
     $bytesReceived = strlen($result);
     while (strlen($result) > 0 && $bytesReceived < $count && !$this->stream_eof()) {
         $result .= parent::stream_read($count - $bytesReceived);
         $bytesReceived = strlen($result);
     }
     return $result;
 }
 protected function readTill($position)
 {
     $current = ftell($this->source);
     if ($position > $current) {
         $data = parent::stream_read($position - $current);
         $cachePosition = ftell($this->cache);
         fseek($this->cache, $current);
         fwrite($this->cache, $data);
         fseek($this->cache, $cachePosition);
     }
 }