PVM is a lightweight PHP Version Manager for Windows. Install, switch, and manage multiple PHP versions — plus extensions and ini settings — all from PowerShell, no dependencies required.
No reviews yetBe the first to leave a review for PVM
Maker
📌
I built PVM (PHP Version Manager) because switching PHP versions on Windows has always been a clunky, manual process. Most tools are either Linux/macOS-focused or too heavy for quick, developer-friendly usage. I wanted something lightweight, fast, and native to Windows — no WSL, no complicated setups, just a simple PowerShell tool that works out of the box.
What’s new and unique is that PVM doesn’t just switch PHP versions — it also manages extensions, php.ini settings, and paths in a way that feels tailored for Windows developers. You can install, enable/disable extensions, and tweak php.ini without digging into folders or restarting services. It’s also designed to be easy to extend, so anyone can add their own commands.
I’m most proud that this launch is completely self-contained and dependency-free — no installers, no background services. Just drop it in, and you’re managing multiple PHP versions in minutes. It’s fast, it’s developer-focused, and it finally gives Windows PHP devs the smooth workflow they’ve been missing.
Hey PHP people
PVM v2.5.0 is here!
https://github.com/usepvm/pvm/releases/tag/v2.5.0
New Features
Install PHP and extensions by OS architecture (x86/x64)
Filter PHP versions and installs by build type (NTS/TS)
Profile management command to save and load predefined configurations
Get-OrUpdateCache helper for cleaner cache management
Xdebug: arch/buildtype metadata, sorting, compiler version display, and alpha version support
Include NTS versions in PHP listing and install commands
Improvements
Refactored install, uninstall, use, and list commands for clarity
Extension fetching now handles multi-page categories and caches heavy requests
Smarter arch and buildtype resolution with dedicated helpers (Resolve-Arch, Resolve-BuildType)
Cache validity check with Can-Use-Cache
Improved test coverage across router, common, install, list, current, ini, and use modules
Bug Fixes
Fixed arch and buildtype filtering logic
Fixed HTTPS request issues on Windows 10 (fallback to HTTP)
Fixed dynamic property assignment and null object handling
Fixed various typos and function naming inconsistencies
Corrected extension existence check to prioritize ./ext directory before ini file
Hey PHP people
PVM v2.6.0 is here!
https://github.com/usepvm/pvm/releases/tag/v2.6.0
What's New
pvm aliases command — user-editable aliases persisted in JSON
pvm cache command — manage cache files
pvm repair command — recreate missing PVM dirs and files
pvm profile clear sub-command
pvm install latest — install latest PHP version
Colon-style nested command syntax (pvm ini:get, pvm ini:set, etc.)
pvm info now consolidates PVM status and paths
Improvements
Config refactored into unified $Global:PVMConfig nested hashtable
Extensions and settings helpers unified with Get-All-* / Get-Matching-* pattern
Start-PVM dispatch pipeline refactored; Resolve-FlagCommand as single source of truth for flag mapping
Resolve-Alias with comprehensive alias map and JSON persistence
Setup-PVM decomposed into New-PVM-Directories / New-PVM-Files
NTS build type support across install, list, and use commands
Pester test architecture standardized across all modules
Expanded documentation and examples.
Bug Fixes
Shallow copy bug in test config setup
PSCustomObject vs OrderedDictionary deserialization after JSON alias persistence
-match vs -contains fix on array flag resolution
ini-only extension detection fix
Added -NoProfile to pvm.bat and subprocess
Hey PHP people
PVM v2.7.0 is here!
https://github.com/usepvm/pvm/releases/tag/v2.7.0
🔊 Sound Notifications
Added optional sound notifications for command completion, test results, and failures
Added the SOUNDS_DISABLED environment flag to toggle notifications
Added --mute to temporarily disable sounds for individual test and run commands
Sounds are automatically disabled in subprocess mode
📜 Test Scripts
Added the new run command for executing reusable project scripts, similar to npm or Composer scripts
Added support for custom files in the run command
Scripts can be defined and customized through storage/data/templates/scripts.json
Added visual feedback with a spinner during script execution
⚡ Background Jobs & Performance
Added background jobs for long-running operations such as PHP version and extension data fetching
Added Show-SpinnerWhileJob for visual feedback during long-running operations
Improved job serialization and data handling
Improved responsiveness during network-bound operations
🔧 Improvements
🧹 PowerShell Naming Convention
Renamed functions to use approved PowerShell verbs and the Verb-Noun convention
Refactored related helpers and wrappers for improved consistency
Improved code consistency and maintainability
⚙️ Configuration & Data Handling
Added Copy-ObjectDeep for proper deep-copy operations
Added filtering of invalid arguments and flags
Improved extension search with description property checking
Improved caching for PHP versions and extension data, including cache validation and duplicate-file handling
🧪 Testing & Quality
Expanded test coverage for new features and refactored components
Improved compatibility across Windows PowerShell 5.1 and PowerShell 7+
Added support for testing against multiple Pester versions, including Pester 5.7 and 6
Improved test execution across different PowerShell/Pester combinations
Added tests for setFakePaths, sound notifications, wrappers, and new helpers
Improved test data validation with Test-HasData
Added total test count reporting
✨ User Experience
Refactored the help section and improved help output
Improved color selection and output formatting
Sorted extensions list before printing
Enhanced info command with environment and PVM configuration data
🐛 Bug Fixes
Fixed PVMConfig values being unintentionally overridden through shallow copies
Improved error handling for run scripts
Fixed argument handling for older PowerShell versions
Fixed child processes not being terminated when the parent process exits
📝 Documentation
Updated documentation for the new run command and test scripts
Added documentation for sound notifications and configuration
Updated profile examples and configuration files
Improved command help and usage information