Mac在命令行執行php命令時,如php -v 有錯誤提示:
dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib Referenced from: /usr/local/bin/php Reason: image not found
表面看是缺少了libcrypto.1.0.0文件,mac自帶的openssl是0.9.8,可以命令行查看下:
/usr/bin/openssl version OpenSSL 0.9.8zh 14 Jan 2016
之前已經使用brew安裝了最新的openssl,版本1.1.1g。brew默認安裝目錄是沒有openssl的目錄,都是使用openssl@1.1這樣的目錄,使用命令
brew switch openssl 1.1
建立openssl目錄,使用的是切換后的版本1.1,由於是1.1版本,沒有1.0,使用軟鏈 ln -s 建立文件鏈接到1.1。
照理說這樣是可行的,但依然會提示錯誤:
dyld: Symbol not found: _SSL_library_init
查閱資料,openssl1.1跟1.0變化比較大。這種變化導致部分使用的1.0版本的軟件無法兼容1.1,最新版本的php可能有解決此問題,這個我就沒有去試驗,我使用的是7.1.33版本。
以上載圖來自:https://wiki.openssl.org/index.php/OpenSSL_1.1.0_Changes
這樣就不能使用1.1版本了,brew當前已經去除了openssl1.0的支持,只有1.1版本,mac版本又太低,這個時候只能選擇自己編譯安裝。
下載地址:https://www.openssl.org/source/old/1.0.2/
選擇一個版本下載到本地,開始安裝:
./Configure darwin64-x86_64-cc shared --prefix=/usr/local/
記得要加上shared,幾乎網上資料都沒有說明這點,導致安裝多次都沒有成功。只有加shared參數才會生成dylib文件。
make sudo make install
在/usr/local/目錄下安裝需要管理員權限,所以要加上sudo,也可以選擇另外的目錄,將include, lib和bin等目錄安裝在同一個目錄,后面再另外指定就可以。
安裝完成后,默認的openssl已經是最新安裝的版本了。
which openssl
/usr/local/bin/openssl
到這一步還沒完成,PHP的openssl依賴也需要一並調整。
使用命令查看PHP當前依賴:
otool -L /usr/local/bin/php
修改libcrypto和libssl的路徑:
install_name_tool -change /usr/local/opt/openssl/lib/libcrypto.1.1.dylib /usr/local/lib/libcrypto.1.0.0.dylib /usr/local/bin/php install_name_tool -change /usr/local/opt/openssl/lib/libssl.1.1.dylib /usr/local/lib/libssl.1.0.0.dylib /usr/local/bin/php
這樣,問題解決。