每当记录添加到MySQL表时触发PHP脚本

rm5edbpk  于 2022-12-17  发布在  PHP
关注(0)|答案(1)|浏览(127)

我有一个PHP/MySQL网站,运行在IIS上。有一些独立编译的应用程序(exe)也会向数据库添加记录。我想设置它,以便每当exe向数据库中的某个表添加记录时,它都会触发PHP脚本运行。
不幸的是,编译的应用程序不能修改。所以我不能简单地让exe调用PHP脚本。不知何故,要么MySQL需要在更新时调用脚本,要么PHP必须注意到任何时候添加了记录。
[EDIT补充:我见过一些建议使用MySQL触发器和MySQL插件从MySQL中执行PHP的解决方案,但这些解决方案存在安全和性能问题,我不想处理这些问题。还有一个问题是,此类触发器发生在事务中间,并与触发的PHP脚本同步,这意味着PHP脚本实际上无法看到更改的数据,因为它还不存在(事务尚未完成)。]
我确信我可以做一个计划任务来运行PHP脚本,每隔几分钟检查一次DB表中的新记录;但是我在想有没有什么方法可以更直接干净地做到这一点。安全性当然是加分项。
(NOTE:由于某些原因我不打算详细说明,我仍然在运行MySQL 5.6。希望能尽快得到更新。PHP在8.1上)

jdzmm42g

jdzmm42g1#

有些人建议使用MySQL触发器来调用PHP脚本。这在标准MySQL示例中不受支持,但您可以找到sys_exec()作为UDF的实现,您可以将其作为插件编译到MySQL服务器中。但要注意,如果这导致MySQL服务器崩溃,它将中断所有其他用户会话。我不推荐这样做。
但使用基于触发器的解决方案的最大问题是,触发器在插入行时触发,而不是在提交事务时触发。因此,如果触发器执行PHP脚本,然后脚本试图查看插入的行,但无法看到未提交的数据,则可能会出现意想不到的问题。即使它可以看到这些数据,如果事务随后回滚,那么PHP脚本可能已经对没有人会再看到的数据进行了操作。
此外,触发器是同步执行的。如果您使用sys_exec()调用PHP脚本,触发器将等待PHP脚本完成。这意味着派生触发器的INSERT将等待。如果PHP脚本花费一些时间,这可能会导致很大的吞吐量问题。
所以触发器是解决问题的错误方法。
解决这个问题的一个更好的方法是使用变更数据捕获(CDC)技术,一个开源示例是Debezium
CDC的思想是读取MySQL的二进制日志,根据定义,它只包含提交后的更改,而不是轮询,它更像是一个队列读取器。
CDC读取器也是异步的,它不会阻止INSERT的完成,而是稍后读取二进制日志(可能只是几分之一秒之后,只要事务提交并写入日志)。

相关问题