phpEnv 默认不启用 OpenSSL 扩展,需手动在对应版本 php.ini 中开启 extension=openssl 并确认 openssl.so 存在且路径正确;CLI 与 Web 环境配置独立,Web 需额外检查 PHP-FPM/Apache 加载的 php.ini 并重启服务。

phpEnv 默认不启用 OpenSSL 扩展,必须手动在对应 PHP 版本的 php.ini 中开启 extension=openssl 并确保依赖库可用,否则 file_get_contents("https://")、openssl_encrypt() 等会直接失败或静默降级。
确认当前 phpEnv 使用的 php.ini 路径
phpEnv 切换版本后,每个 PHP 实例有独立配置文件,不能只改全局或默认 ini。运行以下命令查准路径:
phpenv which php php -r "echo php_ini_loaded_file();"
常见位置如 ~/.phpenv/versions/8.2.12/etc/php.ini 或 ~/.phpenv/versions/7.4.33/etc/php.ini。若输出为空,说明尚未生成配置 —— 先执行 phpenv rehash 再试。
修改 php.ini 启用 openssl 扩展
打开上一步确认的 php.ini,搜索 extension=openssl:
立即学习“PHP免费学习笔记(深入)”;
- 如果存在且以分号开头(
;extension=openssl),删掉分号 - 如果整行不存在,在
[extensions]段落末尾或文件末尾添加extension=openssl(PHP 7.2+ 无需写.so后缀) - 检查
extension_dir是否指向正确目录,例如extension_dir = "~/.phpenv/versions/8.2.12/lib/php/extensions/no-debug-non-zts-20220829/";该路径下必须存在openssl.so
保存后,**不要重启 Apache/Nginx** —— phpEnv 是 CLI 环境管理器,它不控制 Web 服务进程。你只需确保下次 php 命令生效即可。
验证 openssl.so 文件是否存在且可加载
phpEnv 编译的 PHP 通常自带 openssl.so,但若缺失或架构不匹配,会报 PHP Warning: Unable to load dynamic library 'openssl':
- 运行
ls $(php -r "echo ini_get('extension_dir');")/openssl.so确认文件存在 - 若提示 “No such file”,说明编译时未链接 OpenSSL 开发库:Ubuntu/Debian 需先
sudo apt install libssl-dev,CentOS/RHEL 需sudo yum install openssl-devel - 已安装但 still missing?重新编译该 PHP 版本:
phpenv install --reinstall 8.2.12(前提是系统 OpenSSL 开发包已就位)
验证是否启用成功:
php -m | grep openssl
php -r "var_dump(extension_loaded('openssl'));"两者都应返回 openssl 和 bool(true)。
Web 环境下仍不生效?检查 PHP-FPM 或 Apache 模块是否用了别的 php.ini
phpEnv 管理的是 CLI 的 PHP,但 Web 请求走的是 PHP-FPM 或 libphp 模块,它们可能加载完全不同的 php.ini:
- 在 Web 页面中访问
<?php phpinfo(); ?>,搜索 “Loaded Configuration File” 看实际路径 - 该路径下的
php.ini也必须包含extension=openssl - 改完后需重启对应服务:
sudo systemctl restart php8.2-fpm或sudo systemctl restart apache2
最容易被忽略的一点:phpEnv 自身不干预 Web 服务器的 PHP 加载逻辑,CLI 正常 ≠ Web 正常 —— 两个环境的 php.ini、扩展路径、甚至 OpenSSL 库版本都可能不同。



















