为了账号安全,请及时绑定邮箱和手机立即绑定

从MySQL触发器调用PHP脚本

从MySQL触发器调用PHP脚本

白衣非少年 2019-06-28 10:52:18
从MySQL触发器调用PHP脚本在将记录插入MySQL数据库表时,如何调用PHP页面/函数?我们无法控制记录插入过程。是否有可以调用PHP脚本的触发机制?
查看完整描述

3 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

我和一个朋友已经想出了如何调用BernardoDamele的sys_valudf,但是这个解决方案并不像我想的那样优雅。以下是我们所做的:

  1. 由于我们使用的是Windows,所以我们必须使用以下方法编译用于Windows的UDF库

    罗兰·布曼指示

    并将它们安装在MySQL服务器上。
  2. 我们创建了一个调用sys_val的存储过程。
  3. 我们创建了一个调用存储过程的触发器。

存储过程代码:

DELIMITER $$
CREATE PROCEDURE udfwrapper_sp(p1   DOUBLE,
 p2   DOUBLE,
 p3 BIGINT)BEGIN
 DECLARE cmd CHAR(255);
 DECLARE result CHAR(255);
 SET cmd = CONCAT('C:/xampp/php/php.exe -f "C:/xampp/htdocs/phpFile.php" ', p1, ' ', p2, ' ', p3);
 SET result = sys_eval(cmd);END$$;

触发代码:

CREATE TRIGGER udfwrapper_trigger AFTER INSERT ON sometable
FOR EACH ROW
CALL udfwrapper_sp(NEW.Column1, NEW.Column2, NEW.Column3);

对于存储过程,我并不感到兴奋,我也不知道它是否会产生额外的开销,但它确实有效。每次向Someetable添加一行时,触发器都会触发。


查看完整回答
反对 回复 2019-06-28
?
大话西游666

TA贡献1817条经验 获得超14个赞

这应该被认为是非常糟糕的编程实践从数据库触发器调用PHP代码。如果你用这样的“疯狂”技巧来解释你想要解决的任务,我们可能会提供一个令人满意的解决方案。


我应该早点加上一些推理,但现在只找到时间去做这件事。感谢@CMC的重要评论。因此,PHP触发器为应用程序添加了以下复杂性:

  • @Johan说,在应用程序中添加了一定程度的安全问题(外部PHP脚本调用、权限设置,可能还有SELinux安装等等)。

  • 给应用程序增加了额外的复杂性(要了解数据库如何工作,现在需要了解SQL和PHP,而不仅仅是SQL),您还必须调试PHP,而不仅仅是SQL。

  • 向应用程序添加额外的故障点(例如,PHP错误配置),这也需要进行诊断(我认为触发器需要保存一些调试代码,这些代码将记录所有不成功的PHP解释器调用及其原因)。

  • 增加性能分析的附加点。每个PHP调用都是昂贵的,因为您需要启动解释器,将脚本编译为字节码,执行它等等。因此,涉及此触发器的每个查询都会执行得更慢。有时很难隔离查询性能问题,因为EXPLAIN没有告诉您查询由于触发例程性能而变慢的任何信息。我也不知道如何将触发时间转储到慢速查询日志中。

  • 为应用程序测试增加了一些问题。SQL可以很容易地测试。但是要测试SQL+PHP触发器,您必须应用一些技巧。


查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 1114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信