Mac本地PHP切换cURL至OpenSSL失败求助:仍用SecureTransport
我之前也碰到过一模一样的情况——编译PHP时明明指定了brew的curl,但运行时还是绑定系统自带的SecureTransport版本。问题出在动态链接库的加载优先级:PHP编译时找到了brew curl的头文件(所以Used Library里的Compiled版本是对的),但运行时系统默认加载了/usr/lib下的旧curl库。
下面是几个亲测有效的解决方法,按推荐程度排序:
方法一:修改PHP二进制的动态链接路径(最彻底)
这个方法直接修改PHP可执行文件的依赖库路径,不需要依赖环境变量:
先找到你的PHP二进制文件路径:
which php通常会输出
/usr/local/bin/php或者/usr/bin/php(如果是brew安装的PHP)。用
install_name_tool替换依赖的curl库:install_name_tool -change /usr/lib/libcurl.4.dylib $(brew --prefix curl)/lib/libcurl.4.dylib $(which php)验证结果:
php -i | grep -A 2 "libcurl"现在应该能看到Linked版本变成brew安装的7.59.0,且SSL版本显示OpenSSL。
方法二:通过环境变量指定库加载路径
如果不想修改二进制文件,可以通过设置DYLD_LIBRARY_PATH让系统优先加载brew的curl库:
针对CLI PHP
编辑你的shell配置文件(~/.bash_profile、~/.zshrc或者~/.profile),添加:
export DYLD_LIBRARY_PATH="$(brew --prefix curl)/lib:$DYLD_LIBRARY_PATH"
然后执行source ~/.zshrc(对应你的shell)或者重启终端,再验证即可。
针对Apache的PHP模块
在Apache的配置文件(比如/etc/apache2/httpd.conf或者/usr/local/etc/httpd/httpd.conf)中添加:
SetEnv DYLD_LIBRARY_PATH $(brew --prefix curl)/lib
然后重启Apache:
sudo apachectl restart
方法三:重新编译PHP时强制指定链接路径
如果上面的方法都不想用,也可以重新编译PHP,在configure阶段就把brew curl的库路径硬编码进去:
./configure \ --with-curl=$(brew --prefix curl) \ LDFLAGS="-L$(brew --prefix curl)/lib -Wl,-rpath,$(brew --prefix curl)/lib" # 然后执行 make && make install
这里的-Wl,-rpath参数会把brew curl的库路径添加到PHP的运行时链接路径中,确保优先加载。
额外检查
确保brew的curl已经正确安装并link:
brew link curl --force
(如果提示冲突,可以用brew link curl --force --overwrite,不过这个会替换系统默认的curl命令,如果你不需要的话,可以跳过,上面的方法已经足够让PHP单独使用brew的curl)
内容的提问来源于stack exchange,提问作者Kevinleary.net

