mac系统,如何编译php72的openssl扩展?
发布于 作者:苏南大叔 来源:程序如此灵动~苏南大叔给大家讲讲在mac
系统里面,php72
的openssl
扩展安装的事情,openssl
的故事有些曲折。因为这个openssl
的php
扩展是不走寻常路的,所以,苏南大叔也没有看清路,掉坑里面了。哈哈~
本文测试环境:mac
,php72
。
报错截图
openssl
也是php
的必备扩展,很多地方都是用得到的。比如在php
代码中,最常见的file_get_contents
,请求https
地址的时候,就是严重依赖这个openssl
扩展的。
成功方案
苏南大叔的最终解决方案是:把openssl
编译为php
自身功能,并没有把openssl
加载为so
文件。可以参考苏南大叔的这篇文章:
主要是在php
的编译过程的第二步./configure
后增加了新的参数--with-openssl
。
phpize
./configure --enable-fpm --with-mysql --with-pdo-mysql --with-zlib --with-xmlrpc --enable-zip --enable-soap --with-openssl --with-config-file-path=/etc
make
sudo make install
当然,原版的编译参数,可以从phpinfo()
里面看到。编译成功,并启用之后,就可以看到效果了。
这里的参数,每个人都有每个人自己不同的参数,请根据自己的实际情况设置即可。这个方案是正常启用了openssl
,但是在这个方案之前,苏南大叔还经历了下面的几个失败的方案。不排除其中某个步骤是本次成功方案的垫脚石。所以,这里也描述一下,相关的失败方案。
不成功方案里面的经验值
本来计划把这个openssl
编译成一个so
文件,然后在php.ini
中加载的。不过结果是:费了些周折生成了openssl.so
文件。但是加载到php
后,导致php
不能启动,一直报错:“segmentation fault:11” 。下面就是相应的编译情况。
从源码编译openssl
关于openssl
的最新源码,可以从这里找到:(两个网址任选其一即可)
截至到发稿,稳定版是1.0.2n
,最新版是1.1.1_pre2
。这几个最新版的编译输出还是有较大区别的,主要体现在make install
环节,似乎1.1.1
这个版本更像是个安装的过程。下面是编译相关命令:
./configure
./config
make
sudo make install
有些奇怪地方就是:./configure
之后,还会提示,需要./config
一下,没做仔细研究。执行一下命令而已。
brew
安装openssl
brew
安装openssl
的时候,对于安装php的openssl.so
扩展,网上的教程上都还大量提及另外的一个包叫做openssl-devel
。但是brew
里面无法找到后者这个包,只有前者。网上提示说,如果不安装openssl-devel
,则无法找到libcrypt
。但是,目前在mac
下面,并不是这样的。最新的libcrypt
包含在openssl
之中。
brew
安装openssl
的过程,也有些不走寻常路。下面是相关命令:
brew update
brew install openssl
brew link openssl
brew link openssl --force
当然,如果你反复尝试的过程中,可能会需要下面的命令。
brew uninstall openssl
brew cleanup
尝试brew link openssl
的过程中,如果你看到了错误提示。可能下面的命令是你的替代命令。
ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/
ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/
单独编译php
的openssl.so
扩展
这个过程,依然是不走寻常路。因为在php源码的ext/openssl
中,并没有期待的config.m4
文件,也就是说,我们并没有办法执行正常的php扩展编译流程。但是存在着一个config0.m4
文件,我们尝试把这个文件重命名之后,流程得以继续。
编译途中,会碰到提示,不能找到evp.h
或者libcrypt
之类的提示,会由上述安装openssl
的步骤来解决。至于你选择brew安装还是源码安装,就仁者见仁智者见智了。从最终的结果上看,最终生效的:应该是源码安装最新版的1.1.1-pre2
版本openssl
。
cd /ext/openssl
mv config0.m4 config.m4
phpize
./configure
make
sudo make install
过程比较坎坷,但是最终得到了期待的openssl.so
文件,用php.ini
加载后,就得到了本文开头提及的“segmentation fault:11” 错误提示。这是个悲伤的故事... 如果您有好的建设性意见,欢迎留言给我。回想到config0.m4
,既然php官方故意写错这个文件的名字,肯定是有所用意的。也许他们并不建议我们使用这种方式安装openssl.so
吧?
结论
苏南大叔安装php
扩展openssl.so
的过程,比较崎岖坎坷。最终是把openssl
构建到了php
内部,而不是通过openssl.so
扩展的形式存在。大家可以也试试看,如果您有好的意见,在mac
环境下,php72
的openssl
扩展顺利构建成功的话,欢迎留言给苏南大叔哦。谢谢。
更多openssl相关经验文章,请点击这里查看。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
感谢,解决了我mac php5.6本地环境的openssl编译