β

libcurl访问unix socket

鱼儿的博客 204 阅读

最近使用Libcurl访问unix socket,在代码里像这样设置opt:

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在低版本中并不支持( 官方文档 ):

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路径:

[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不是在这个路径,那么你应该拷贝它到链接的路径里去。

作者:鱼儿的博客
斯是陋室,惟吾德馨
原文地址:libcurl访问unix socket, 感谢原作者分享。