<?php
/**
* Implements a read/write buffer.
*/
class Buffer {
protected $eof = false;
protected $indexRead = 0;
protected $indexWrite = 0;
protected $buffer = [];
public function write($bytes) {
if ($bytes === null) {
$this->eof = true;
} else {
$this->buffer[$this->indexWrite++] = $bytes;
}
}
public function read($length = 4096) {
if (!$this->buffer) {
return $this->eof ? null : '';
}
$output = '';
$outputLength = 0;
while ($this->indexRead < $this->indexWrite) {
$chunk = $this->buffer[$this->indexRead];
$chunkLength = \strlen($chunk);
if ($outputLength + $chunkLength == $length) {
unset($this->buffer[$this->indexRead++]);
$output .= $chunk;
return $output;
}
if ($outputLength + $chunkLength > $length) {
$slice = $length - $outputLength;
$this->buffer[$this->indexRead] = \substr($chunk, $slice);
$output .= \substr($chunk, 0, $slice);
return $output;
}
unset($this->buffer[$this->indexRead++]);
$output .= $chunk;
$outputLength += $chunkLength;
}
return $output;
}
}
$b = new Buffer();
$b->write('ABCDEFGHIJ');
$b->write('KLMNOPQRSTUVWXYZ');
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
echo 'Writing more...' . PHP_EOL;
$b->write('01234567890');
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
echo 'EOF...' . PHP_EOL;
$b->write(null);
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
- Output for 7.0.0 - 7.0.20, 7.1.0 - 7.1.20, 7.2.6 - 7.2.33, 7.3.16 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.28, 8.2.0 - 8.2.18, 8.3.0 - 8.3.4, 8.3.6
- string(3) "ABC"
string(3) "DEF"
string(3) "GHI"
string(3) "JKL"
string(3) "MNO"
string(3) "PQR"
string(3) "STU"
string(3) "VWX"
string(2) "YZ"
string(0) ""
string(0) ""
string(0) ""
string(0) ""
string(0) ""
string(0) ""
string(0) ""
string(0) ""
Writing more...
string(3) "012"
string(3) "345"
string(3) "678"
string(2) "90"
string(0) ""
EOF...
NULL
NULL
NULL
- Output for 8.3.5
- Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
string(3) "ABC"
string(3) "DEF"
string(3) "GHI"
string(3) "JKL"
string(3) "MNO"
string(3) "PQR"
string(3) "STU"
string(3) "VWX"
string(2) "YZ"
string(0) ""
string(0) ""
string(0) ""
string(0) ""
string(0) ""
string(0) ""
string(0) ""
string(0) ""
Writing more...
string(3) "012"
string(3) "345"
string(3) "678"
string(2) "90"
string(0) ""
EOF...
NULL
NULL
NULL
preferences:
158.73 ms | 402 KiB | 172 Q