14.4.0
libvips becomes a first-class WebP conversion backend, either in-process via jcupitt/vips 2.x + PHP ext-ffi (typically 2–3× faster than MagickConverter at equivalent quality, substantially less memory) or as the vips CLI binary through the existing ExternalConverter. Both routes preserve animated GIFs as animated WebP.
New features
- libvips (native) backend. A new
VipsConvertercalling libvips in-process viajcupitt/vips(2.x) + PHPext-ffi. Pick libvips (native) in the converter dropdown. Parameters are space-separatedkey=valuepairs per mime type (e.g.image/jpeg::Q=85 smart_subsample=true effort=4|…) passed straight to libvips'swebpsave— see the option reference for the full list. - Animated GIFs survive as animated WebP.
VipsConverterloads all frames automatically (n=-1) and emits multi-frame WebP whenmixed=trueis set. ThevipsCLI binary viaExternalConverteralso preserves animation when the GIF entry uses%s[n=-1]on the source argument. webp:diagnosereports libvips availability. Distinguishes ext-ffi missing / disabled /preloadmode,jcupitt/vipsnot installed, and libvips shared library unreachable viaVips\Config::version(). Warns on PHP 8.3+ ifzend.max_allowed_stack_size=-1is not set (jcupitt/vips runs FFI callbacks off the main thread).
Upgrade notes
- No schema changes, no upgrade wizard, no BC concerns. Default backend stays
MagickConverter— existing installs are unaffected until you opt in. - To use the native backend, install
libvips-toolson the host (Debian/Ubuntu pulls inlibvips42/libvips42t64as a dependency), enable PHP'sext-ffiwithffi.enable=truein php.ini (notpreload— jcupitt/vips does not support preloading),composer require jcupitt/vips, and set the converter to libvips (native) in the extension configuration. On PHP 8.3+ also setzend.max_allowed_stack_size=-1. Full recipe in the README's Using libvips natively section.