mysql触发器调用外部脚本,我查找资料后选择使用lib_mysqludf_sys,但是中间出现很多问题,记录下来正确方式分享如下:
使用系统CentOS 7.5 64位
-
首先是获取lib_mysqludf_sys
GitHub:https://github.com/mysqludf/lib_mysqludf_sys
也可在我的CSDN下载https://download.csdn.net/download/shaynerain/10715798
-
把文件上传到服务器
使用方法在lib_mysqludf_sys.html中有介绍,主要就是lib_mysqludf_sys.so,能直接用最好,但是大多数不能直接用,要自己再次编译生成.so
-
编译lib_mysqludf_sys.c文件生成.so
问题1:没有gcc就要先安装gcc
-
yum install gcc
问题2:缺少my_global.h等文件,安装mysql-devel
-
yum install mysql-devel
开始编译
-
gcc -shared -o lib_mysqludf_sys.so lib_mysqludf_sys.c -I /usr/include/mysql -fPIC
此处是我在CentOS 7.5 64位下编译好的文件https://download.csdn.net/download/shaynerain/10715818
-
-
把.so移动到mysql的plugin中
-
mv lib_mysqludf_sys.so /usr/local/mysql/lib/plugin/
-
-
登陆数据库添加功能函数,直接执行sql语句,其他功能可参照html文件中的手册
-
CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME ‘lib_mysqludf_sys.so’;
-
CREATE FUNCTION sys_get RETURNS string SONAME ‘lib_mysqludf_sys.so’;
-
CREATE FUNCTION sys_set RETURNS int SONAME ‘lib_mysqludf_sys.so’;
-
CREATE FUNCTION sys_exec RETURNS int SONAME ‘lib_mysqludf_sys.so’;
-
CREATE FUNCTION sys_eval RETURNS string SONAME ‘lib_mysqludf_sys.so’;
-
-
SQL语句,插入触发器,这样就会调用1.php脚本
-
DROP TRIGGER IF EXISTS `wp_insert`; -
CREATE DEFINER=`root`@`localhost` TRIGGER `wp_insert` AFTER INSERT ON `wp_users` FOR EACH ROW BEGIN SET @xlog_return = (SELECT sys_eval(CONCAT(‘/usr/bin/php -f /home/wwwroot/1.php’)));
-
END
-
带入参数的调用,例如代入正在操作的ID,将上面SET替换成下面这样
-
SET @xlog_return = (SELECT sys_eval(CONCAT(‘/usr/bin/php -f /home/wwwroot/1.php ‘,new.id)));
正在删除的ID
-
SET @xlog_return = (SELECT sys_eval(CONCAT(‘/usr/bin/php -f /home/wwwroot/1.php ‘,old.id)));
这样操作是正常了,但是操作数据库去没有反应,原因是调用触发器,数据库认为该条指令还没结束,也就是还没有真正的插入,所以查询不到该条信息,我们可以使用nohup命令在后台执行脚本,然后在脚本中操作数据库之前加入适当的延时
-
SET @xlog_return = (SELECT sys_eval(CONCAT(‘nohup /usr/bin/php -f /home/wwwroot/1.php ‘,new.ID,‘ >/dev/null 2>&1 &’)));
本文详细介绍了如何在CentOS7.5环境下,通过lib_mysqludf_sys库使MySQL触发器调用外部PHP脚本的方法。从安装依赖、编译生成.so文件到创建并使用自定义函数,再到触发器的设置与参数传递,提供了完整的步骤和解决方案。
961

被折叠的 条评论
为什么被折叠?



