amphp/serialization
AMPHP serialization tools for IPC and data storage in concurrent PHP apps. Provides a Serializer interface with JSON, native PHP, and passthrough serializers, plus optional payload compression via a wrapping serializer.
Installation:
composer require amphp/serialization
Ensure your project uses PHP 7.4+ (Laravel 8.x or lower).
First Use Case: Serialize a simple array for IPC (e.g., Unix sockets) with compression:
use Amp\Serialization\CompressingSerializer;
use Amp\Serialization\NativeSerializer;
$serializer = new CompressingSerializer(new NativeSerializer());
$data = ['task' => fn() => 'hello', 'value' => 42];
$serialized = $serializer->serialize($data);
// Send $serialized via IPC (e.g., socket_write)
Where to Look First:
Serializer interface: Core contract for all serializers.CompressingSerializer: Wrap any serializer for payload optimization.JsonSerializer: Laravel-compatible alternative for APIs/caches.NativeSerializer: Use only for trusted internal IPC (closures, resources).IPC Workflows (AMPHP):
$serializer = new CompressingSerializer(new NativeSerializer());
$payload = $serializer->serialize($workerTask);
socket_write($socket, $payload);
$redis = new Amp\Redis\Client();
$serializer = new JsonSerializer(); // Avoid NativeSerializer for Redis
$redis->set('key', $serializer->serialize($data));
Laravel Integration (Limited):
NativeSerializer):
use Amp\Serialization\JsonSerializer;
class MyJob implements ShouldQueue {
public function handle() {
$serializer = new JsonSerializer();
$serialized = $serializer->serialize($this->data);
// Use $serialized for custom storage (not recommended for Laravel queues)
}
}
Cache::put('key', (new JsonSerializer())->serialize($data), $seconds);
Compression Strategy:
$compressedSerializer = new CompressingSerializer(new NativeSerializer());
$compressedData = $compressedSerializer->serialize($largeObject);
$serializer = new CompressingSerializer(
new JsonSerializer() // Fallback to JSON if compression fails
);
try {
$data = $serializer->unserialize($payload);
} catch (SerializationException $e) {
Log::error("Deserialization failed: " . $e->getMessage());
// Fallback to JsonSerializer or rethrow
}
$serializer = new NativeSerializer();
$data = yield $serializer->serialize($fiberData);
json_encode() instead.JsonSerializer for APIs: Ensures compatibility with Laravel’s ecosystem.CompressingSerializer if payloads exceed 1KB (overhead for smaller data).Security Risks:
NativeSerializer is unsafe for untrusted data (e.g., user input, IPC from external sources).
JsonSerializer + manual validation for public-facing data.unserialize() vulnerabilities persist in PHP 7.4+. Avoid for any external data.PHP Version Lock-In:
Laravel Incompatibility:
JsonSerializer for Laravel models or implement custom logic.ShouldQueue expects json_encode() by default. Overriding serialization requires custom job handling.Compression Overhead:
microtime(true) before adopting.No Laravel-Specific Features:
Illuminate\Cache.Illuminate\Bus.Serialization Failures:
SerializationException with no clear cause.try {
$serializer->serialize($data);
} catch (SerializationException $e) {
dd(gettype($data), $data, $e->getMessage());
}
NativeSerializer (expected).JsonSerializer (use JSON_THROW_ON_ERROR).Compression Issues:
PHP 7.4+ Attributes:
#[Override] not recognized in Laravel.JsonSerializer or implement custom attribute handling.Default Serializer:
// Bad: Assumes global state
$data = unserialize($payload);
// Good: Explicit serializer
$serializer = new JsonSerializer();
$data = $serializer->unserialize($payload);
Compression Level:
CompressingSerializer uses default zlib compression (level 6).$compressor = new \Amp\Serialization\CompressingSerializer(
$serializer,
['level' => 9] // Max compression
);
Custom Serializers:
Amp\Serialization\Serializer for domain-specific logic:
class MySerializer implements Serializer {
public function serialize($data): string {
return base64_encode(serialize($data));
}
public function unserialize(string $data) {
return unserialize(base64_decode($data));
}
}
Attribute-Based Serialization:
#[Override] for custom logic (PHP 7.4+):
#[Override]
public function serialize($data): string {
// Custom logic
}
Fallback Chains:
$fallbackSerializer = new CompressingSerializer(
new JsonSerializer(),
new NativeSerializer() // Fallback to native if JSON fails
);
Avoid in Controllers:
json_encode() is optimized for APIs. Use:
return response()->json($data); // Preferred
// Not:
return response((new JsonSerializer())->serialize($data));
Queue Jobs:
// In job constructor
public function __construct(public array $data) {}
// In handle()
$serializer = new JsonSerializer();
$this->data = $serializer->unserialize($this->data);
Cache:
CompressingSerializer:
Cache::put('key', $data, $seconds); // Uses Redis compression if enabled
How can I help you explore Laravel packages today?