×

homebrew openssl自动更新后导致的php5.6启动失败的问题

Falcon 2021-07-03 views:
摘要

正在生成中……

homebrew 更新openssl至1.1了,然后把1.0版本的openssl给自动删除了,导致一些依赖openssl1.0的 app 报错,比如php5.6,在php5.6的php-fpm日志下就有这样的错误信息:

vi /usr/local/var/log/php-fpm56.log
dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib
  Referenced from: /usr/local/opt/php@5.6/sbin/php-fpm
  Reason: image not found
dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib
  Referenced from: /usr/local/opt/php@5.6/sbin/php-fpm
  Reason: image not found

也就是原来的libcrypto.1.0.0.dylib找不到了。

安装openssl 1.0

可以直接下载openssl1.0的ruby文件,然后本地安装,但这样下次homebrew更新时还会自动移除这个版本,很蛋疼,或者使用homebrew在线安装指定版本,我们使用homebrew在线安装,把openssl1.0装回来:

brew install openssl@1.0

耗时较长,主要是需要在本地编译和安装。

安装完成后可以看到本地有两个版本的openssl了

ll /usr/local/opt/ | grep openssl
lrwxr-xr-x    1 falcon  admin    28B Jul  3 12:02 openssl@1.0 -> ../Cellar/openssl@1.0/1.0.2t
lrwxr-xr-x    1 falcon  admin    28B Mar 19 14:17 openssl@1.1 -> ../Cellar/openssl@1.1/1.1.1d

修改依赖路径

将原来的依赖路径修改为新的openssl 1.0的路径,也就是修改php5.6版本的php-fpm运行时要寻找的相关dylib的路径,借助install_name_tool

sudo install_name_tool -change /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib  /usr/local/opt/openssl@1.0/lib/libcrypto.1.0.0.dylib /usr/local/opt/php@5.6/sbin/php-fpm
sudo install_name_tool -change /usr/local/opt/openssl/lib/libssl.1.0.0.dylib  /usr/local/opt/openssl@1.0/lib/libssl.1.0.0.dylib /usr/local/opt/php@5.6/sbin/php-fpm

 使用 otool  就能查看应用依赖库的所在位置。参考之前的文章:《用otool查看应用的动态库》

One more thing

github上有开发者对php5.6 发布了一个修正补丁,但需要从它指定的pull request Formula安装,这意味着你需要重新安装php5.6。否则会得到 Error: invalid option: --with-openssl-1.1-patch错误。重新安装,我当然是不乐意的。

https://github.com/eXolnet/homebrew-deprecated/pull/25

其他

mysql5.7 存在同样的依赖路径,也需要修改如下:

sudo install_name_tool -change /usr/local/opt/openssl/lib/libssl.1.0.0.dylib  /usr/local/opt/openssl@1.0/lib/libssl.1.0.0.dylib /usr/local/Cellar/mysql/5.7.13/bin/mysqld
sudo install_name_tool -change /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib  /usr/local/opt/openssl@1.0/lib/libcrypto.1.0.0.dylib /usr/local/Cellar/mysql/5.7.13/bin/mysqld

为了防止homebrew自以为是地移除openssl1.0,可以修改这个位置的权限,我真是受够了这个沙雕homebrew。这样只要不用sudo 的brew安装就不会移除1.0的版本,好像默认也不能使用sudo。

cd /usr/local/opt
sudo chown -R root:admin openssl@1.0/

 

本文收录于