Repository navigation
Stdlib: ext/fileinfo — finfo_open/finfo_file/mime detection (ext/fileinfo parity) #3366
Copy link
Copy link
Closed
Labels
area:vmVirtual machineVirtual machineenhancementNew feature or requestNew feature or requestimplementation-readySpec complete: repro, php-src ref, done-when — safe for workers to claimSpec complete: repro, php-src ref, done-when — safe for workers to claimphase-4:stdlibPhase 4 – stdlib for web appsPhase 4 – stdlib for web apps
Description
Category
stdlib
Problem
MIME/type detection via finfo_open(), finfo_file(), finfo_buffer(), and finfo_close() is missing. Upload validators and deploy tooling use fileinfo to sniff content types without trusting extensions.
Verified Jun 2026:
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh
php bin/vm.php -r "var_export(function_exists(\"finfo_open\")); echo \"\n\";"
php -r "var_export(function_exists(\"finfo_open\")); echo \"\n\";"
'
# VM: false
# Zend (with ext/fileinfo): truephp-src reference
- php/php-src
ext/fileinfo/fileinfo.c—php_finfo_open,php_finfo_file,php_finfo_buffer - php/php-src
ext/fileinfo/php_fileinfo.h - php/php-src
ext/fileinfo/libmagic/— bundled libmagic (php-src ships its own; we may link systemlibmagic)
Repro — finfo_file (phase 1)
<?php
$f = finfo_open(FILEINFO_MIME_TYPE);
if ($f === false) {
fwrite(STDERR, "finfo_open failed\n");
exit(1);
}
echo finfo_file($f, __FILE__), "\n";
finfo_close($f);./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && php bin/vm.php repro.php'
php repro.php # Zend: text/x-php or text/plain| Runtime | Result |
|---|---|
| Zend | MIME string for .php file |
| VM today | Call to undefined function finfo_open() |
Repro — finfo_buffer (phase 1b)
<?php
$f = finfo_open(FILEINFO_MIME_TYPE);
echo finfo_buffer($f, "<?php echo 1;"), "\n";
finfo_close($f);Constants (register in phase 1)
From php-src ext/fileinfo/fileinfo.stub.php — at minimum:
FILEINFO_NONE, FILEINFO_MIME_TYPE, FILEINFO_MIME, FILEINFO_MIME_ENCODING, FILEINFO_RAW
Scope (this repo)
| Module | Path |
|---|---|
| Extension | ext/fileinfo/ (new module) or ext/standard/finfo.php delegating to system libmagic |
| Build | document libmagic pkg-config dep; optional NO_FILEINFO for minimal self-host builds |
| VM | resource/object handle wrapping magic_t |
| JIT/AOT | VM-only v1; document deferral in capability matrix |
| Tests | test/compliance/cases/stdlib/finfo_mime.phpt, finfo_buffer.phpt |
| Matrix | script/capability-matrix.php |
Prefer thin C ABI (libmagic calls only) over reimplementing magic rules in PHP.
Done when
-
finfo_file()repro MIME matches Zend on same host for local.phpfile -
finfo_buffer()returns MIME for in-memory PHP snippet -
FILEINFO_MIME_TYPEconstant defined - Invalid path →
false+ warning like Zend -
./script/ci-fast.sh --filter finfogreen (or@requireslibmagic) - Capability matrix documents VM-only if JIT deferred
Related
- Stdlib: getimagesize() / getimagesizefromstring() — image metadata (ext/standard/image.c parity) #3271 —
getimagesize()(dimensions; not libmagic MIME) - Epic: Self-host critical path — compiler compiles itself (M3→M5) #1492 — self-host may gate on optional libmagic
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area:vmVirtual machineVirtual machineenhancementNew feature or requestNew feature or requestimplementation-readySpec complete: repro, php-src ref, done-when — safe for workers to claimSpec complete: repro, php-src ref, done-when — safe for workers to claimphase-4:stdlibPhase 4 – stdlib for web appsPhase 4 – stdlib for web apps
Activity
PurHur commentedon Jul 15, 2026
claim: PHP Compiler STD Lib Advanced — batch (issues #3366 finfo; follow-ups SessionHandler + PharData #6490 / socket_create_pair #6563 after merge)
Implementing ext/fileinfo (finfo_open/file/buffer/close/set_flags + finfo class + FILEINFO_* constants) PHP-in-PHP via VmMime sniff; VM-first, no new C runtime.
Stdlib: add ext/fileinfo finfo_* MIME sniff (#3366) (#19239)
PurHur commentedon Jul 15, 2026
Merged via #19239
Verification
PHP-in-PHP
ext/fileinfoviaVmMimesniff; VM-only (JIT deferred). Next batch items: #6490 PharData, #6563 socket_create_pair.PurHur commentedon Jul 15, 2026
Batch progress: #3366 merged (PR #19239); #6490 PharData merged (PR #19245). Filed follow-ups for SessionHandler + finfo FILEINFO_NONE depth; #6563 socket_create_pair handed off (needs socket_write/read).
Stdlib: wire finfo_file()/finfo::file() JIT/AOT via NestedJIT helper (#…
Stdlib: wire finfo_file()/finfo::file() JIT/AOT via NestedJIT helper (#…