我知道这是非常不受推荐的,
我知道这是性能,速度等问题,
但这是为了集成,他们只是通过mysql进行更新(我知道这样做也很疯狂,但我无法改变他们做的事情,而且他们正在大量销售,所以他们不想改变任何东西)。
我只需要发布到一个URL(它可以很简单 http://www.google.com?id=skuid)
我读过这个博客和堆栈,但它们已经超过2年了,想知道是否有使用udf的替代品:
http://open-bi.blogspot.pe/2012/11/call-restful-web-services-from-mysql.html
http://www.mooreds.com/wordpress/archives/1497
使用mysql触发器调用php文件
非常感谢一切!
要触发外部操作,您必须使用UDF - 这是唯一的方法 mysql
告诉“外面的世界”。 唯一的选择 是一个不断轮询DB的外部代理 - 这是一个劣等的解决方案。
至于UDF的选择,
- 为了最大限度地减少数据库上的负载,它应该是快速完成的事情(注意UDF同步运行)。
- 因此,除非安装规模足够小,否则只会通知外部代理事件。这也最大限度地减少了DB端的错误处理。
- 否则,如果你还没有照顾,你可以只是产卵
curl
尽管它值得。
想到的方式:
- 产生一个小程序 - 例如
touch
代理人观看的一些文件。有一个存在的 sys_exec
用的 system()
(考虑到所有因素)。
- IPC(信号是最简单的;与其他人一样,您可以传递其他信息,但需要更多设置)
作为 sys_exec
来源 显示,编写UDF并不是那么难,所以你并不仅限于已有的东西(这可以解释为什么 lib_mysqludf_sys
是如此有限:如果你需要更好的东西,那么编写一个特定于任务的功能就足够了。目前的文档是在 26.4.2添加新的用户定义函数 - MySQL 5.7参考手册。
您可以通过触发器中的“sys_exec”命令执行外部脚本。诀窍是以非阻塞方式编写该脚本,因此它产生异步执行工作的后台进程,主进程立即完成。
例如这样的事情:
#!/bin/sh
nohup curl(or wget) http://www.example.com ...other_post_parameters... &
但是,您需要确保不会创建太多同时进程。这可以在触发器中完成(例如,它可以将最后执行时间写入某个表,然后检查是否已经过了一段时间),或者在shell脚本中(它可以创建/删除一些表示正在运行的程序的标志文件) )。
这是Windows平台上MySQL服务器5.6 64位(!)的解决方案。我在Win10 64bit下测试了它。
我需要一个64位.dll版本的插件,它提供了在shell中运行命令的功能,我在这里找到了一个工作:
http://winadmin.blogspot.nl/2011/06/mysql-sysexec-udf-for-64-bit-windows.html
你也可以在Windows上自己编译,看看:
http://rpbouman.blogspot.nl/2007/09/creating-mysql-udfs-with-microsoft.html
对于MySQL 5.1+,您必须将插件/ dll放在MySQL安装根目录的子目录中 C:\wamp\bin\mysql\mysql5.6.17\lib\plugin
否则你会收到一个错误:
无法打开共享库DLL - 错误代码193
你还需要 curl.exe
被称为 sys_eval
。你需要在这里下载正确的(确保将(!)文件.exe和.crt复制到PATH环境中的可到达路径),我用过 c:\windows\system32
:
https://winampplugins.co.uk/curl/
那么只有你需要的代码是:
--one time setup. run inside your database
CREATE FUNCTION sys_eval RETURNS STRING SONAME ‘lib_mysqludf_sys.dll’;
--example call to an URL
select CONVERT(sys_eval(CONCAT(‘curl https://randomuser.me/api?results=1‘)) USING UTF8MB4);