我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

苏南大叔给大家讲讲在mac系统里面,php72openssl扩展安装的事情,openssl的故事有些曲折。因为这个opensslphp扩展是不走寻常路的,所以,苏南大叔也没有看清路,掉坑里面了。哈哈~

苏南大叔:mac系统,如何编译php72的openssl扩展? - mac-php-openssl
mac系统,如何编译php72的openssl扩展?(图24-1)

本文测试环境:macphp72

报错截图

openssl也是php的必备扩展,很多地方都是用得到的。比如在php代码中,最常见的file_get_contents,请求https地址的时候,就是严重依赖这个openssl扩展的。

苏南大叔:mac系统,如何编译php72的openssl扩展? - 002
mac系统,如何编译php72的openssl扩展?(图24-2)

成功方案

苏南大叔的最终解决方案是:把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()里面看到。编译成功,并启用之后,就可以看到效果了。

苏南大叔:mac系统,如何编译php72的openssl扩展? - phpinfo-openssl
mac系统,如何编译php72的openssl扩展?(图24-3)

这里的参数,每个人都有每个人自己不同的参数,请根据自己的实际情况设置即可。这个方案是正常启用了openssl,但是在这个方案之前,苏南大叔还经历了下面的几个失败的方案。不排除其中某个步骤是本次成功方案的垫脚石。所以,这里也描述一下,相关的失败方案。

不成功方案里面的经验值

本来计划把这个openssl编译成一个so文件,然后在php.ini中加载的。不过结果是:费了些周折生成了openssl.so文件。但是加载到php后,导致php不能启动,一直报错:“segmentation fault:11” 。下面就是相应的编译情况。

从源码编译openssl

关于openssl的最新源码,可以从这里找到:(两个网址任选其一即可)

苏南大叔:mac系统,如何编译php72的openssl扩展? - 005
mac系统,如何编译php72的openssl扩展?(图24-4)

苏南大叔:mac系统,如何编译php72的openssl扩展? - 040
mac系统,如何编译php72的openssl扩展?(图24-5)

截至到发稿,稳定版是1.0.2n,最新版是1.1.1_pre2。这几个最新版的编译输出还是有较大区别的,主要体现在make install环节,似乎1.1.1这个版本更像是个安装的过程。下面是编译相关命令:

./configure
./config
make
sudo make install

有些奇怪地方就是:./configure之后,还会提示,需要./config一下,没做仔细研究。执行一下命令而已。

苏南大叔:mac系统,如何编译php72的openssl扩展? - 041
mac系统,如何编译php72的openssl扩展?(图24-6)

苏南大叔:mac系统,如何编译php72的openssl扩展? - 042
mac系统,如何编译php72的openssl扩展?(图24-7)

苏南大叔:mac系统,如何编译php72的openssl扩展? - 043
mac系统,如何编译php72的openssl扩展?(图24-8)

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

苏南大叔:mac系统,如何编译php72的openssl扩展? - 012
mac系统,如何编译php72的openssl扩展?(图24-9)

苏南大叔:mac系统,如何编译php72的openssl扩展? - 013
mac系统,如何编译php72的openssl扩展?(图24-10)

苏南大叔:mac系统,如何编译php72的openssl扩展? - 015
mac系统,如何编译php72的openssl扩展?(图24-11)

当然,如果你反复尝试的过程中,可能会需要下面的命令。

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/

苏南大叔:mac系统,如何编译php72的openssl扩展? - 070
mac系统,如何编译php72的openssl扩展?(图24-12)

苏南大叔:mac系统,如何编译php72的openssl扩展? - 071
mac系统,如何编译php72的openssl扩展?(图24-13)

苏南大叔:mac系统,如何编译php72的openssl扩展? - 072
mac系统,如何编译php72的openssl扩展?(图24-14)

单独编译phpopenssl.so扩展

这个过程,依然是不走寻常路。因为在php源码的ext/openssl中,并没有期待的config.m4文件,也就是说,我们并没有办法执行正常的php扩展编译流程。但是存在着一个config0.m4文件,我们尝试把这个文件重命名之后,流程得以继续。

苏南大叔:mac系统,如何编译php72的openssl扩展? - 003
mac系统,如何编译php72的openssl扩展?(图24-15)

编译途中,会碰到提示,不能找到evp.h或者libcrypt之类的提示,会由上述安装openssl的步骤来解决。至于你选择brew安装还是源码安装,就仁者见仁智者见智了。从最终的结果上看,最终生效的:应该是源码安装最新版的1.1.1-pre2版本openssl

苏南大叔:mac系统,如何编译php72的openssl扩展? - 004
mac系统,如何编译php72的openssl扩展?(图24-16)

苏南大叔:mac系统,如何编译php72的openssl扩展? - 031
mac系统,如何编译php72的openssl扩展?(图24-17)

cd /ext/openssl
mv config0.m4 config.m4
phpize
./configure
make
sudo make install

苏南大叔:mac系统,如何编译php72的openssl扩展? - 009
mac系统,如何编译php72的openssl扩展?(图24-18)

苏南大叔:mac系统,如何编译php72的openssl扩展? - 010
mac系统,如何编译php72的openssl扩展?(图24-19)

过程比较坎坷,但是最终得到了期待的openssl.so文件,用php.ini加载后,就得到了本文开头提及的“segmentation fault:11” 错误提示。这是个悲伤的故事... 如果您有好的建设性意见,欢迎留言给我。回想到config0.m4,既然php官方故意写错这个文件的名字,肯定是有所用意的。也许他们并不建议我们使用这种方式安装openssl.so吧?

苏南大叔:mac系统,如何编译php72的openssl扩展? - 052
mac系统,如何编译php72的openssl扩展?(图24-20)

苏南大叔:mac系统,如何编译php72的openssl扩展? - 053
mac系统,如何编译php72的openssl扩展?(图24-21)

苏南大叔:mac系统,如何编译php72的openssl扩展? - 054
mac系统,如何编译php72的openssl扩展?(图24-22)

苏南大叔:mac系统,如何编译php72的openssl扩展? - 055
mac系统,如何编译php72的openssl扩展?(图24-23)

苏南大叔:mac系统,如何编译php72的openssl扩展? - 056
mac系统,如何编译php72的openssl扩展?(图24-24)

结论

苏南大叔安装php扩展openssl.so的过程,比较崎岖坎坷。最终是把openssl构建到了php内部,而不是通过openssl.so扩展的形式存在。大家可以也试试看,如果您有好的意见,在mac环境下,php72openssl扩展顺利构建成功的话,欢迎留言给苏南大叔哦。谢谢。

更多openssl相关经验文章,请点击这里查看。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php    openssl