用 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,得主动扫描常见安装路径。
实操建议:直接运行这行命令(支持 bash/zsh):
和
覆盖绝大多数系统级或第三方包管理安装路径(如 apt、yum、Homebrew、MacPorts)
和
是 Linux/macOS 上 Homebrew 的典型用户级安装根目录(尤其 WSL 或非默认安装)
屏蔽权限拒绝提示,避免干扰结果
确保只匹配真正可执行的二进制文件,跳过符号链接或残留脚本
为什么不用 which 或 whereis 查所有 PHP
只返回
中首个匹配项;
会混入 man 页面、源码路径等无关结果,且不检查可执行性。
更关键的是:某些 PHP 安装(比如通过
、
或手动编译到
)根本不会把路径加进
,但二进制文件真实存在——这类版本只能靠文件系统扫描发现。
立即学习
“
PHP免费学习笔记(深入)
”;
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
如果你用
,它的 PHP 实际在
,这个路径不在上面 find 命令默认范围内,需额外加上:
macOS 用户若用 MacPorts,还要补上
扫描结果中重复出现同一路径(比如多个软链接指向同一个
),属正常现象,不必删减
输出结果里怎么识别“有效版本”而非误报
扫描会找到所有叫
的可执行文件,但不是每个都能成功运行
。常见无效情况包括:
损坏的二进制(执行时报
或
)
被剥离符号表或依赖缺失的交叉编译版(尤其 Docker 容器内)
某些调试构建的
不带 CLI SAPI,
会静默失败
改进办法:加一层校验,只保留能稳定输出版本号的条目:
Windows 用户怎么办(WSL 除外)
原生命令行无
,但 PowerShell 可替代:
路径列表覆盖 XAMPP、WampServer、手动解压、Windows 包管理器(如 Scoop 的
默认位置)
和
是必须的——Windows 下很多
缺少依赖 DLL,直接崩溃,不捕获会中断整个扫描
PowerShell 默认不加载
,所以
输出可能不含扩展信息,但版本号本身是可靠的
真正麻烦的不是找不全,而是某些 PHP 构建根本不提供 CLI SAPI(比如纯嵌入式或 Web Server API-only 版本),它们连
都不响应——这种得靠文件名后缀(如
)、数字签名或
命令查 ELF/PE 结构来辅助判断,已经超出“一行命令”范畴了。
php -v$PATHphpfind /usr /opt /home/linuxbrew /home/homebrew 2>/dev/null -name 'php' -type f -executable -exec sh -c 'echo "{}: $(\"{}\" -v | head -n1)"' \;/usr/opt/home/linuxbrew/home/homebrew2>/dev/null-executablewhich php$PATHwhereis phpphpenvasdf/usr/local/php-8.2$PATHasdf~/.asdf/installs/php/~/.asdf/installs/php/opt/localphpphp-vSegmentation faultcannot execute binary filephpphp -vfind /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' \;findGet-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 {} }scoop install php2>$nulltry/catchphp.exephp.iniphp -v-vphp-cgi.exefile