通过执行本机操作系统的命令(如 curl)通过 MySQL 调用 HTTP GET 请求
Posted
技术标签:
【中文标题】通过执行本机操作系统的命令(如 curl)通过 MySQL 调用 HTTP GET 请求【英文标题】:Invoking an HTTP GET request through MySQL by executing native operating system's commands like curl 【发布时间】:2015-04-24 07:31:11 【问题描述】:我正在使用在 32 位 Microsoft Windows XP(专业版 2002 Service Pack 3)上运行的 mysql 5.6.11。我安装了 MySQL sys_exec
UDF。因为我在 32 位 Windows 上运行,所以我使用了这个 lib_mysqludf_sys.dll(放在 C:\Program Files\MySQL\MySQL Server 5.6\lib\plugin\
下,因为它是默认安装)。
之后,执行以下命令(登录到已创建的数据库后)。
mysql> CREATE FUNCTION sys_exec RETURNS INT SONAME 'lib_mysqludf_sys.dll';
Query OK, 0 rows affected (0.02 sec)
我已经创建了一个 PL/SQL 存储过程,如下所示。
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `country_push`()
BEGIN
SET @result=sys_exec('curl http://localhost:8080/ContextPath/push-update-country');
END
此过程应该由数据库触发器调用(已充分完成),因此,当执行此存储过程时,它应该在所述 URL 上引发 HTTP GET 请求,但不会在 URL 上引发 HTTP GET 请求通过某个事件的触发器。
在命令行手动执行过程也成功,如下。
mysql> CALL country_push();
Query OK, 0 rows affected (0.08 sec)
sys_exec()
函数返回1
如下这是一个成功标志。
mysql> SELECT sys_exec('curl http://localhost:8080/ContextPath/push-update-country')
AS result;
+--------+
| result |
+--------+
| 1 |
+--------+
1 row in set (0.06 sec)
GlassFish (4.1) 应用程序服务器上已经运行了一个 Java Servlet,它应该按如下方式监听这个 HTTP GET 请求。
@WebServlet(name = "PushCountry", urlPatterns = "/push-update-country")
public class PushCountry extends HttpServlet
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
System.out.println("PushCountry called.");
doGet()
方法中的System.out.println("PushCountry called.");
行在服务器终端上没有任何结果(因为它没有被执行/调用),当上述 MySQL 的东西付诸实践时。
使用 MySQL 执行此操作是否不切实际,是否还有其他我可能遗漏的东西,或者它是旧的 EOL 恐龙:Windows XP?
我使用的共享动态链接库可能不合适。请澄清,如果这种情况超出了我的范围。
编辑:
进入时,
mysql> SELECT sys_eval('id');
MySQL 终止/崩溃并报告 following 错误报告。
关闭此对话框后,MySQL 会留下以下错误消息。
ERROR 2013 (HY000): 查询期间丢失与 MySQL 服务器的连接
它无法重新连接,直到/除非系统本身重新启动。
也许,我稍后会考虑重新安装操作系统本身。
【问题讨论】:
sys_exec() 函数返回 1 如下,这是一个成功标志。 你确定吗?返回值似乎是进程的退出状态,任何非零都意味着错误——不是成功。如果您使用sys_eval()
函数,您会得到什么响应?也许是有用的错误消息?
回复SELECT sys_eval('id');
有错误。突然出现一个弹窗提示:mysqld.exe has encountered a problem and needs to close. We are sorry for the inconvenience.
关闭此对话框时,在命令行上提示此消息ERROR 2013 (HY000): Lost connection to MySQL server during query
。 MySQL 永远停止工作,直到系统本身重新启动。
哎呀,服务器崩溃...好吧,这不是我想到的那种错误消息。
【参考方案1】:
似乎 'id' 是 Windows 下不存在的 Linux 命令... 无论如何,我在返回数字但没有启动进程的 Windows 下也遇到了 sys_exec() 的问题。 有关信息,它在 linux 下运行良好。
【讨论】:
欢迎来到 ***。你介意稍微扩展你的答案来解释它是如何解决问题的吗? 对lib_mysqludf_sys.dll
不够确定,但它在 Windows 上不可靠。以上是关于通过执行本机操作系统的命令(如 curl)通过 MySQL 调用 HTTP GET 请求的主要内容,如果未能解决你的问题,请参考以下文章