PSL - Crown 5.0
PSL 5.0 - nicknamed Crown - is the biggest release of the PHP Standard Library to date, introducing 10 new components, a complete networking stack rewrite, and significant performance improvements across the board.
Requires PHP 8.4+.
Crypto
Full-featured cryptography built on libsodium: symmetric and asymmetric encryption, digital signatures, AEAD, key derivation (KDF, HKDF), key exchange, and stream ciphers, all with a type-safe, hard-to-misuse API.
use Psl\Crypto\Symmetric;
$key = Symmetric\generate_key();
$ciphertext = Symmetric\seal('Hello, World!', $key);
$plaintext = Symmetric\open($ciphertext, $key);
// 'Hello, World!'use Psl\Crypto\Signing;
$keyPair = Signing\generate_key_pair();
$signature = Signing\sign('This message is authentic.', $keyPair->secretKey);
$valid = Signing\verify($signature, 'This message is authentic.', $keyPair->publicKey);
// trueBinary
Structured binary data parsing and encoding with a fluent Reader/Writer API. Read and write integers, floats, and strings in any byte order. Ideal for building protocol parsers and working with binary formats.
use Psl\Binary\{Reader, Writer, Endianness};
$data = new Writer(endianness: Endianness::Big)
->u8(1) // version
->u16(0x0042) // type
->u32(5) // payload length
->bytes('Hello') // payload
->toString();
$reader = new Reader($data, Endianness::Big);
$version = $reader->u8(); // 1
$type = $reader->u16(); // 0x0042
$length = $reader->u32(); // 5
$payload = $reader->bytes($length); // 'Hello'Networking Stack Rewrite
The Network, TCP, TLS, UDP, Unix, CIDR, and Socks components were rewritten from scratch with connection pooling, retry logic, socket pairs, and first-class TLS support.
use Psl\TCP;
$listener = TCP\listen('127.0.0.1');
$connection = $listener->accept();
$data = $connection->readAll();
$connection->writeAll($data);use Psl\TLS;
$tls = TLS\connect('example.com', 443);
$tls->writeAll("GET / HTTP/1.0\r\nHost: example.com\r\n\r\n");
$tls->shutdown();
$response = $tls->readAll();use Psl\CIDR;
$block = new CIDR\Block('192.168.1.0/24');
$block->contains('192.168.1.100'); // true
$block->contains('192.168.2.1'); // falseProcess
Async process management with non-blocking I/O, inspired by Rust's Command API. A safer, higher-level replacement for proc_open and friends. Psl\Shell\execute is now powered by it under the hood.
use Psl\Process\Command;
$output = Command::create('echo')
->withArguments(['Hello', 'from', 'process'])
->output();
if ($output->status->isSuccessful()) {
$output->stdout; // 'Hello from process'
}Terminal & Ansi
A full terminal UI framework: buffered rendering, layouts, widgets, keyboard/mouse event handling, and ANSI styling. Build rich interactive TUI applications entirely in PHP.
use Psl\Async;
use Psl\Terminal;
use Psl\Terminal\{Event, Widget};
Async\main(static function (): int {
$app = Terminal\Application::create(new MyState(), title: 'My App');
$app->on(Event\Key::class, static function (Event\Key $event) use ($app): void {
if ($event->is('ctrl+c')) {
$app->stop();
}
});
return $app->run(static function (Terminal\Frame $frame, MyState $state): void {
Widget\Paragraph::new([
Widget\Line::new([Widget\Span::raw('Hello, World!')]),
])->render($frame->rect(), $frame->buffer());
});
});Here's a system monitor UI demo built entirely with Psl\Terminal (source):
You can even build fully functional terminal games (source):
DateTime Additions
New Period and Interval types for representing and manipulating durations and time spans.
use Psl\DateTime;
$period = DateTime\Period::fromParts(years: 1, months: 6, days: 15);
$period->toIso8601(); // 'P1Y6M15D'
$start = DateTime\DateTime::fromParts(DateTime\Timezone::UTC, 2024, 3, 15);
$end = DateTime\DateTime::fromParts(DateTime\Timezone::UTC, 2025, 7, 20);
$between = DateTime\Period::between($start, $end);
// 1 year(s), 4 month(s), 5 day(s)Performance
Optimizations across Vec, Dict, Str, Iter, Type, and more components. Benchmarks show up to 100% improvement in certain functions.
Documentation
A new documentation website is available at psl.carthage.software.
Breaking Changes
- PHP 8.4 is now the minimum required version
- Complete networking stack rewrite (
Network,TCP,Unix) Psl\Env\temp_dir()now always returns a canonicalized pathFilesystem\create_temporary_file()now canonicalizes the temporary directory path- Migrated to PHPUnit 13
Bug Fixes
Vec\range()now uses strict comparison for float precision
Documentation: https://psl.carthage.software/
Full Changelog: 4.3.0...5.0.0

