mysql实现http请求,使用udf自定义函数来实现,lib_mysqludf_http
使用背景:需要使用mysql的事件(Event)来完成自定义的秒级别的定时任务,而触发的任务是php写的接口,接口内实现更复杂的逻辑。而mysql的事件拥有很强大的时间间隔设置,就很好的满足自定义的各种时间,而走不通的一步是,mysq没有默认能请求url连接的方法。于是一番搜索后找到了udf的方式,以及有人用C写好的mysql插件扩展代码lib_mysqludf_http。不过目前整个方案已经改成另外的实现方式了,不过使用mysql能做http请求是一个不错的点。
udf用户自定义函数
它是mysql提供的扩展能力,用户可以根据自己的需求编写函数,扩展功能,在sql查询中直接调用。在实际项目中,同事用C扩展了不少类似excel公式的函数。可以在github上搜索mysqludf找到一些别人写的扩展,看是否有用得到的
用来实现http的代码为 https://github.com/rsandoz/lib_mysqludf_http ,支持 http get, post, put, and delete 。
同事编译后的so文件 : lib_mysqludf_http.so (环境应该是centos 下的mysql5.7的)
github上作者提供了DLL的编译方法,好像没有linux下的,具体的我也不会,需要另外查下。
将编译好后的so文件放在mysql的安装的插件下 lib/plugin,然后进入数据库,在需要创建对应的库里创建需要的函数,我这里只用post的
DROP FUNCTION IF EXISTS http_post;
Create function http_post returns string soname 'lib_mysqludf_http.so';
代码作者里有完整的 四个函数的,他的是DLL,替换对应的插件文件名
DROP FUNCTION IF EXISTS http_get;
DROP FUNCTION IF EXISTS http_post;
DROP FUNCTION IF EXISTS http_put;
DROP FUNCTION IF EXISTS http_delete;
create function http_get returns string soname 'lib_mysqludf_http.dll';
create function http_post returns string soname 'lib_mysqludf_http.dll';
create function http_put returns string soname 'lib_mysqludf_http.dll';
create function http_delete returns string soname 'lib_mysqludf_http.dll';
最好 ldconfig 一下
然后测试一下,是否生效成功
SELECT http_post('https://www.zhangxingju.com', 'test mysql http_post');