下面的实验以php7.4.29版本为基础,如果你的版本不同,请注意替换某些路径
一、确定PHP的根目录
在macos12版本之后(也可能是11版本),homebrew安装目录发生了改变,请注意。
如果你是brew安装的php,老版本的根目录应该在 /usr/local/homebrew/Cellar/php@7.4/7.4.29
,新版本的目录应该在 /opt/homebrew/Cellar/php@7.4/7.4.29
中,如果是其它方式安装,请自定确定根目录
二、下载PHP源码
通过brew方式安装的 php ,大概率没有 openssl 扩展的源码,具体请查看 php根目录/include/php/ext
中是否有 openssl
目录
如果没有这个目录,需要到 PHP官网下载源码。
通过 php根目录/bin/php --version
命令可以查看自己的php版本号
如果官网没有提供你对应的版本,可以选择差不多的版本,拷贝连接,把版本数字改一下就行。
根据你下载的压缩包格式,自行解压,找到解压出的 ext
目录,里面会有 openssl
目录,将openssl目录拷贝到 php根目录/include/php/ext
中
三、开始安装
进入 php根目录/include/php/ext/openssl
目录
首先需要修改config0.m4
为config.m4
然后执行下面的命令安装
$ `php根目录/bin/phpize
$ ./configure --with-php-config=php根目录/bin/php-config
$ make
$ make install
修改配置文件加入
extension=openssl.so
四、遇到的问题
正常情况下,configure命令执行中大概率会遇到 openssl 相关错误,下面是常见错误解决方式
1、缺少pkg-config
configure: error: The pkg-config script could not be found or is too old. Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.
这种容易解决,只需要 brew install pkg-config
安装即可
2、缺少 openssl 或者 openssl 版本不匹配
No package 'openssl' found
这个问题是最难解决的,造成的原因也很多
首先确定你安装了 openssl
第二确定你当前的openssl版本正确,php7安装openssl需要1.1.1系列版本
这里大概率会遇到,看着安装的是1.1,实际版本却不对应的情况,需要将1.1版本的路径加到环境变量
如果是brew安装的openssl,需要将下面的三行加入
.bash_profile
文件
export PATH="/opt/homebrew/opt/openssl@1.1/bin:$PATH"
export LDFLAGS="-L/opt/homebrew/opt/openssl@1.1/lib"
export CPPFLAGS="-I/opt/homebrew/opt/openssl@1.1/include"
重新加载环境变量
$ source ~/.bash_profile
这里根据你用的 terminal,加入到不同的文件,比如zsh可能用的 .zshrc 文件
直到打印的版本是你安装的1.1.1系列版本
查看 openssl 是否在 pkgconfig 中
$ pkg-config --list-all | grep openssl
或者去目录直接查看
如果是brew安装的pkgconfig,目录应该是 /opt/homebrew/lib/pkgconfig
如果没有 openssl.pc 则需要手动连接
ln -s /opt/homebrew/Cellar/openssl\@1.1/1.1.1n/lib/pkgconfig/openssl.pc /opt/homebrew/lib/pkgconfig/
到这里重新执行 configure命令,应该可以解决这个问题
3、缺少libssl
Package 'libssl', required by 'openssl', not found
需要在环境变量中声明 openssl lib/include 的路径
加入环境变量
export OPENSSL_LIBS="-L/usr/local/Cellar/openssl@1.1/1.1.1d/lib"
export OPENSSL_CFLAGS="-I/usr/local/Cellar/openssl@1.1/1.1.1d/include"