2016-05-13 74 views
9

我知道这是非常不推荐的,调用从触发的网址在MySQL

我知道它是与性能,速度快等优点, 一个问题,但它是一个整合,他们只在做通过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

Calling a php file by using mysql trigger

非常感谢您的一切!

+0

如果你只是需要POST /任何方法,你可以通过一些异步代理来做到这一点,触发器使用像'sys_exec()'这样的不太有害的UDF。 –

+0

你必须为此使用UDF。如果你不需要结果(或者如果你可以稍后添加它),你应该使用异步方法。例如。在触发器中,只需将url添加到待办事项表并让事件稍后处理(或直接调用udf,即立即返回,而不是在执行后返回) - 否则触发器必须包含错误处理和/或可能等待如果连接关闭,则超时 - 所有可能的情况下都会锁定您的数据。 – Solarflare

+0

事实上,第一个链接是从2012年没有任何区别。过去15年没有任何变化。用它。 – e4c5

回答

12

要触发外部动作,您必须使用UDF - 这是mysql向“外部世界”讲述某些内容的唯一方式。 The only alternative是一个不断调查数据库的外部代理 - 这是一个劣质的解决方案。

至于UDF的选择,

  • ,尽量减少对数据库的负载,这也许应该是东西快速完成(注意UDF的同步运行)。
  • 因此,除非安装足够小规模,否则只会通知外部代理。这也最大限度地减少了DB侧的错误处理。
    • 否则,如果你还没有照顾,你可以例如只需产生curl即可。

方式浮现在脑海:

  • 产卵的小程序 - 例如touch代理观看的一些文件。有一个现有的sys_exec,使用system()(有所有适当的考虑)。
  • IPC(信号是最简单的;与他人,你可以传递更多的信息,但它需要更多的设置)

随着sys_exec's source表明,它不是那么难写一个UDF,所以你是不是真的(这可能解释了为什么lib_mysqludf_sys如此有限:如果你需要更好的东西,编写特定于任务的函数就足够简单了)。目前的文档是26.4.2 Adding a New User-Defined Function - MySQL 5.7 Reference Manual

+0

我可能会选择你的答案,因为它有很大的解释和有用的,将只剩下一天,看看别人是否有一个开箱即用的想法,但我不这么认为,非常感谢这真的会有帮助我在很近的将来为很多决定辩护。 – Saikios

+1

投票未决事件表被低估。如果你想触发异步事件,这是一个合理的方法。 – Gili

1

您可以通过触发器中的“sys_exec”命令执行外部脚本。诀窍是以非阻塞方式编写该脚本,因此它产生了异步执行工作的后台进程,并且主进程立即完成。

例如是这样的:

#!/bin/sh 
nohup curl(or wget) http://www.example.com ...other_post_parameters... & 

你需要确保虽然,你不要创建太多的并发进程。这可以在触发器中完成(例如,它可以将最后一次执行时间写入某个表,然后检查是否已经过了一段时间),或者在shell脚本中(它可以创建/删除某个标志文件,该文件可以指示正在运行的过程)。

0

以下是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 否则你会得到一个错误:

Can not open shared library dll – errorcode 193

也需要curl.exe,由sys_eval调用。你需要在这里下载正确的(!一定要同时复制().exe的文件和.CRT从您的PATH的环境变量可达路径),我用c:\windows\system32https://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);