charcoal-dev/buffers
Laravel/PHP package providing buffer utilities for handling and transforming data streams in memory. Useful for queueing, chunking, and processing data efficiently with a simple API, supporting common buffer operations for custom workflows.
Installation:
composer require charcoal-dev/buffers
No additional configuration is required for basic usage.
First Use Case: Create a buffer from a string or byte array:
use Charcoal\Buffers\Buffer;
// From a string
$buffer = Buffer::fromString('Hello, Charcoal!');
// From a byte array
$buffer = Buffer::fromBytes([0x48, 0x65, 0x6C, 0x6C, 0x6F]);
Key Classes:
Buffer: Core class for immutable byte buffers.MutableBuffer: For in-place modifications (if needed).BufferCollection: For managing multiple buffers.Where to Look First:
src/Buffer.php for core methods.tests/ for usage examples.// Convert to/from common formats
$buffer = Buffer::fromString('data');
$hex = $buffer->toHex(); // "64617461"
$base64 = $buffer->toBase64(); // "ZGF0YQ=="
// Concatenate buffers
$buffer1 = Buffer::fromString('hello');
$buffer2 = Buffer::fromString('world');
$combined = $buffer1->concat($buffer2); // "helloworld"
// Slice buffers
$slice = $buffer->slice(0, 5); // First 5 bytes
// Use with Charcoal's HTTP layer
$responseBody = Buffer::fromString($rawResponse);
$json = json_decode($responseBody->toString(), true);
// Stream buffers in responses
return response()->stream(function () use ($buffer) {
echo $buffer->toString();
});
// Avoid string conversion overhead
$buffer = Buffer::fromBytes([...]);
$processed = $buffer->map(fn($byte) => $byte + 1); // Increment each byte
// Release memory explicitly (if needed)
$buffer->release();
Laravel Service Providers: Bind the buffer classes for dependency injection:
$this->app->bind(Buffer::class, fn() => new Buffer());
Request/Response Handling: Use buffers for binary payloads (e.g., file downloads, WebSocket messages):
return response()->make($buffer->toBytes(), 200, [
'Content-Type' => 'application/octet-stream',
]);
Caching: Serialize buffers for caching:
Cache::put('buffer_key', $buffer->toBytes(), $minutes);
$buffer = Buffer::fromBytes(Cache::get('buffer_key'));
Event Payloads: Use buffers for binary event payloads in Laravel Echo/Pusher:
broadcast(new BinaryEvent($buffer->toBytes()));
Immutability:
Buffer is immutable. Use MutableBuffer for in-place modifications or create new buffers via methods like slice(), map(), etc.// Bad: Trying to modify directly
$buffer->offsetSet(0, 0xAA); // Throws Error
// Good:
$newBuffer = $buffer->withByte(0, 0xAA);
Memory Leaks:
release() for large buffers or rely on PHP’s garbage collection:
$largeBuffer = Buffer::fromBytes($hugeArray);
// ... use $largeBuffer ...
$largeBuffer->release(); // Explicit cleanup
String vs. Bytes:
toString() and fromString() handle encoding/decoding. Ensure consistency:
// May throw EncodingError if bytes aren't valid UTF-8
$buffer->toString();
toBytes() for raw binary data or specify encoding:
$buffer->toString('ISO-8859-1');
Thread Safety:
Inspect Buffers:
$buffer->dump(); // Pretty-print bytes/hex/string
$buffer->hexDump(); // Detailed hex view
Validate Input:
isValid() to check if bytes form a valid string:
if (!$buffer->isValid()) {
throw new \InvalidArgumentException('Invalid UTF-8 bytes');
}
Performance Profiling:
Buffer vs. native PHP strings/arrays for hot paths:
$time = microtime(true);
$buffer->map(fn($byte) => $byte * 2);
$elapsed = microtime(true) - $time;
Custom Encodings:
Extend Buffer to support custom encodings:
class CustomBuffer extends Buffer {
public function toCustomEncoding(): string {
// Implement custom logic
}
}
Buffer Factories: Create domain-specific factories:
class ImageBufferFactory {
public static function fromImage(string $path): Buffer {
return Buffer::fromBytes(file_get_contents($path));
}
}
Event Listeners: Listen for buffer events (if the package emits them):
Buffer::listen('created', function ($buffer) {
Log::debug("Buffer created with size: {$buffer->length()}");
});
Testing Helpers: Add custom assertions for testing:
$this->assertBufferEquals($expectedBuffer, $actualBuffer);
Default Encoding: The package defaults to UTF-8 for string operations. Override globally:
Buffer::setDefaultEncoding('ISO-8859-1');
Chunk Size:
For large buffers, operations like toHex() may chunk data. Adjust if needed:
$buffer->toHex(16); // Custom chunk size
Environment-Specific Behavior: Use Laravel’s config to customize buffer behavior:
// config/buffers.php
return [
'default_encoding' => env('BUFFER_ENCODING', 'UTF-8'),
'max_buffer_size' => env('MAX_BUFFER_SIZE', 1024 * 1024), // 1MB
];
How can I help you explore Laravel packages today?