最近使用Libcurl访问unix socket,在代码里像这样设置opt:
1 2 |
curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/config/get_by_domain?domain=user"); curl_easy_setopt(curl, CURLOPT_UNIX_SOCKET_PATH, "/data/dogx/dogx.sock"); |
通过CURLOPT_UNIX_SOCKET_PATH来设置unix socket的路径,域名用localhost占位即可,实际上libcurl会忽略它。
一开始上线发现调用都失败,很快就怀疑到libcurl版本太低,发现CURLOPT_UNIX_SOCKET_PATH在低版本中并不支持(官方文档):
1 2 3 |
AVAILABILITY Since 7.40.0. |
在这种情况下,相当于curl_easy_setopt并没有实现对CURLOPT_UNIX_SOCKET_PATH选项的支持,所以这个调用相当于无效,最终会请求到localhost,也就是127.0.0.1的TCP地址。
我们可以通过yum来升级或者下载libcurl最新源码编译升级。
像libcurl这种著名的开源项目,其导出的API接口都是非常稳定的,老接口的定义是不会变化的,变化的只是接口实现而已,所以直接升级libcurl.so并不会影响现有二进制正常调用libcurl,这就是动态库的优势。
按照动态库的原理,libcurl支持unix socket,也只不过是在curl_easy_setopt的实现里额外支持了选项CURLOPT_UNIX_SOCKET_PATH而已,就实现了新功能的拓展。
另外,运维同学在升级libcurl后发现还是没有生效,这需要我们通过ldd命令查看我们的二进制具体链接的libcurl.so路径:
1 2 |
[root@10-10-25-125 php]# ldd /usr/local/bin/php7/lib/php/extensions/no-debug-non-zts-20160303/dogx.so | grep libcurl libcurl.so.4 => /usr/lib64/libcurl.so.4 (0x00007f44561f4000) |
如果你升级的libcurl.so不是在这个路径,那么你应该拷贝它到链接的路径里去。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~
