ffi/var-dumper
Adds Symfony VarDumper support for PHP FFI types so dd() and dump() render structs, arrays, pointers, and more in a readable form. Includes “unsafe access” detection for risky pointer reads, with an env flag (VAR_DUMPER_FFI_UNSAFE=1) to fully inspect data.
Installation:
composer require ffi/var-dumper
Ensure your project uses PHP 8.1+ and has the PHP FFI extension enabled (ffi in php.ini).
First Use Case: Dump an FFI type directly in your Laravel app:
use FFI;
$ffiType = FFI::new('struct { int id; string name; }');
dump($ffiType); // Inspects and displays the FFI struct
Key Files:
vendor/ffi/var-dumper (autoloaded via Composer).var_dumper.Debugging FFI Interop:
Replace var_dump() with dump() or dd() for FFI types (e.g., C structs, pointers, or arrays):
$ffiStruct = FFI::new('struct { float[3] rgb; }');
dd($ffiStruct); // Dumps with color-coded output (if supported)
Pointer Handling:
Use VAR_DUMBER_FFI_UNSAFE=1 in .env or runtime to inspect unsafe pointers (e.g., raw memory):
putenv('VAR_DUMPER_FFI_UNSAFE=1');
$unsafePtr = FFI::cast('int*', 0x1234);
dump($unsafePtr); // Full memory inspection
Laravel Integration:
AppServiceProvider:
use Symfony\Component\VarDumper\Cloner\Data;
use FFI;
public function boot()
{
Data::addTreeCustomizer(FFI::type('struct { ... }'), function ($data) {
return (string) $data;
});
}
dump($ffiData)->log(); // Uses Laravel’s logging system
Testing: Assert FFI type outputs in PHPUnit:
$this->expectOutputString("struct { ... }");
dump($ffiType);
if (app()->environment('local'))).Symfony\Component\VarDumper\Caster\CasterInterface for domain-specific FFI types.Unsafe Memory:
NULL or dangling) may crash PHP. Use VAR_DUMPER_FFI_UNSAFE=1 cautiously.if ($ffiPtr !== FFI::null()) {
dump($ffiPtr);
}
Circular References:
Data::setMaxItems():
Data::setMaxItems(100); // Prevents stack overflow
Type Mismatches:
char* as int*) may produce garbled output.FFI::type() to enforce correct types:
$correctPtr = FFI::cast('char*', $ffiData);
Environment Variables:
VAR_DUMPER_FFI_UNSAFE must be set before dumping. Use:
putenv('VAR_DUMPER_FFI_UNSAFE=1'); // Runtime override
or add to .env:
VAR_DUMPER_FFI_UNSAFE=1
Enable Verbose Output:
php -d var_dumper.dump_server=1 artisan tinker
Then dump FFI types via HTTP (e.g., curl http://localhost:9912/dump -d '{"data": [...]}').
Check for FFI Extension:
if (!extension_loaded('ffi')) {
throw new RuntimeException('FFI extension required.');
}
Custom Formatters: Override default rendering for specific FFI types:
Data::addTreeCustomizer(FFI::type('my_custom_struct'), function ($data) {
return "Custom: {$data->field}";
});
Integration with Laravel Debugbar:
Add FFI support to laravel-debugbar:
Debugbar::extend('ffi', function ($data) {
return dump($data, 1024, true); // Truncate large dumps
});
Performance Profiling:
Use VAR_DUMPER_FORMAT=cli to disable HTML formatting in CLI:
VAR_DUMPER_FORMAT=cli php artisan tinker
How can I help you explore Laravel packages today?