phpenv install 默认不启用 OpenSSL,需通过 PHP_BUILD_CONFIGURE_OPTS 指定 --with-openssl 路径并确保系统已装对应开发库(如 macOS 的 brew install openssl),安装后用 php -m | grep openssl 验证;已安装版本无法事后启用,必须重新编译。

phpenv 本身不控制 OpenSSL 是否启用,它只管理 PHP 二进制版本;OpenSSL 支持必须在每个 PHP 版本编译或配置时单独启用。 直接用 phpenv install 装出来的 PHP 默认可能没开 OpenSSL,尤其在 macOS 或自定义编译场景下——这不是 phpenv 的 bug,而是 PHP 编译链的默认行为。
phpenv install 时如何强制启用 OpenSSL
phpenv 默认调用 php-build 编译 PHP,而 OpenSSL 支持依赖系统级开发库和 configure 参数。若跳过这步,装出来的 PHP 运行 php -m | grep openssl 会无输出。
- 先确保系统已装 OpenSSL 开发包:
Ubuntu/Debian 执行sudo apt install libssl-dev;
macOS(Homebrew)执行brew install openssl,并记下路径(如/opt/homebrew/opt/openssl) - 设置环境变量再安装,例如安装 PHP 8.3.13:
export PHP_BUILD_CONFIGURE_OPTS="--with-openssl=/opt/homebrew/opt/openssl"phpenv install 8.3.13 - 安装完成后验证:
phpenv local 8.3.13php -m | grep openssl—— 有输出才算成功 - 若仍失败,检查 configure 日志:
tail ~/.phpenv/cache/php-8.3.13/build.log,确认是否出现checking for OpenSSL support... yes
已安装的 PHP 版本补开 OpenSSL(不重装)
如果已经用 phpenv install 装好某个版本但没开 OpenSSL,不能“事后开启”,必须重新编译。但可复用已有源码缓存,加快流程:
- 找到对应版本缓存目录:
ls ~/.phpenv/cache/ | grep 8.3.13 - 进入缓存解压后的源码目录(如
~/.phpenv/cache/php-8.3.13) - 清理旧构建:
make clean - 重新 configure + make(带上
--with-openssl):./configure --prefix=$HOME/.phpenv/versions/8.3.13 --with-openssl=/opt/homebrew/opt/openssl ...其他原有参数...make && make install - 注意:务必保留原 configure 的所有关键选项(如
--with-curl、--enable-mbstring),否则可能丢失其他扩展
本地 HTTPS 环境必须绕过 PHP 内置服务器
php -S 不支持 HTTPS,这是 PHP 官方明确限制,phpenv 无法改变。想用 https://localhost 调试,只能靠反向代理或 Web 服务器:
立即学习“PHP免费学习笔记(深入)”;
- 推荐用
mkcert生成可信证书:mkcert -install(一次)→mkcert localhost 127.0.0.1 ::1(生成localhost+2.pem和localhost+2-key.pem) - 用 Nginx 反向代理到
php -S:
在 Nginxserver块中配ssl_certificate和ssl_certificate_key,再用proxy_pass http://127.0.0.1:8000转发到 PHP 内置服务 - Apache 用户注意:
SSLCertificateFile必须是 PEM 格式(含私钥+证书),不能直接用.crt+.key分离文件——mkcert 输出的*-key.pem是私钥,*.pem是证书,刚好匹配 - 证书路径权限很重要:
localhost+2-key.pem必须chmod 600,否则 Apache/Nginx 启动会失败并报错SSL_CTX_use_PrivateKey_file failed
最容易被忽略的是:macOS 上 Homebrew 安装的 OpenSSL 路径与系统默认不一致,--with-openssl 不指定就大概率编译失败;而 Windows 下 php-openssl.dll 依赖的 libcrypto-1_1-x64.dll 若不在 PATH 或 Apache bin 目录,即使 extension=php_openssl.dll 生效,openssl_encrypt() 仍会抛出 “Unable to load dynamic library” 错误。



















