用 find 命令扫描常见路径:find /usr /opt /home/linuxbrew /home/homebrew 2>/dev/null -name 'php' -type f -executable -exec sh -c 'echo "{}: $({} -v | head -n1)"' \;,可发现所有可执行 php 二进制文件及其版本,覆盖系统级、homebrew 及用户级安装,规避 which/whereis 的 path 依赖和非可执行项干扰。

如何用 shell 命令快速列出所有已安装的 PHP 可执行文件路径
Linux/macOS 终端里没有全局“PHP 版本管理器”时,php -v 只能显示当前 $PATH 中第一个 php 的版本。要真正摸清系统里藏了多少个 PHP,得主动扫描常见安装路径。
实操建议:直接运行这行命令(支持 bash/zsh):
find /usr /opt /home/linuxbrew /home/homebrew 2>/dev/null -name 'php' -type f -executable -exec sh -c 'echo "{}: $(\"{}\" -v | head -n1)"' \;
-
/usr和/opt覆盖绝大多数系统级或第三方包管理安装路径(如 apt、yum、Homebrew、MacPorts) -
/home/linuxbrew和/home/homebrew是 Linux/macOS 上 Homebrew 的典型用户级安装根目录(尤其 WSL 或非默认安装) -
2>/dev/null屏蔽权限拒绝提示,避免干扰结果 -
-executable确保只匹配真正可执行的二进制文件,跳过符号链接或残留脚本
为什么不用 which 或 whereis 查所有 PHP
which php 只返回 $PATH 中首个匹配项;whereis php 会混入 man 页面、源码路径等无关结果,且不检查可执行性。
更关键的是:某些 PHP 安装(比如通过 phpenv、asdf 或手动编译到 /usr/local/php-8.2)根本不会把路径加进 $PATH,但二进制文件真实存在——这类版本只能靠文件系统扫描发现。
- 如果你用
asdf,它的 PHP 实际在~/.asdf/installs/php/,这个路径不在上面 find 命令默认范围内,需额外加上:~/.asdf/installs/php - macOS 用户若用 MacPorts,还要补上
/opt/local - 扫描结果中重复出现同一路径(比如多个软链接指向同一个
php),属正常现象,不必删减
输出结果里怎么识别“有效版本”而非误报
扫描会找到所有叫 php 的可执行文件,但不是每个都能成功运行 -v。常见无效情况包括:
- 损坏的二进制(执行时报
Segmentation fault或cannot execute binary file) - 被剥离符号表或依赖缺失的交叉编译版(尤其 Docker 容器内)
- 某些调试构建的
php不带 CLI SAPI,php -v会静默失败
改进办法:加一层校验,只保留能稳定输出版本号的条目:
find /usr /opt 2>/dev/null -name 'php' -type f -executable -exec sh -c 'if output=$("$(echo {})" -v 2>/dev/null | head -n1) && [ -n "$output" ]; then echo "{}: $output"; fi' \;
Windows 用户怎么办(WSL 除外)
原生命令行无 find,但 PowerShell 可替代:
Get-ChildItem -Path 'C:\xampp\php', 'C:\php', 'C:\Program Files\php', "${env:USERPROFILE}\AppData\Local\Programs\php" -Filter 'php.exe' -Recurse -ErrorAction SilentlyContinue | ForEach-Object { try { & $_.FullName '-v' 2>$null | Select-Object -First 1 | ForEach-Object { "$($_.FullName): $($_)" } } catch {} }
- 路径列表覆盖 XAMPP、WampServer、手动解压、Windows 包管理器(如 Scoop 的
scoop install php默认位置) -
2>$null和try/catch是必须的——Windows 下很多php.exe缺少依赖 DLL,直接崩溃,不捕获会中断整个扫描 - PowerShell 默认不加载
php.ini,所以php -v输出可能不含扩展信息,但版本号本身是可靠的
真正麻烦的不是找不全,而是某些 PHP 构建根本不提供 CLI SAPI(比如纯嵌入式或 Web Server API-only 版本),它们连 -v 都不响应——这种得靠文件名后缀(如 php-cgi.exe)、数字签名或 file 命令查 ELF/PE 结构来辅助判断,已经超出“一行命令”范畴了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











