gpt4 book ai didi

php - MySql 事件调度程序调用 PHP 脚本

转载 作者:行者123 更新时间:2023-11-29 04:00:59 25 4
gpt4 key购买 nike

我是第一次玩 MySql 事件。这是事件...

DELIMITER $$
CREATE EVENT testEvent
ON SCHEDULE EVERY 1 minute STARTS '2014-01-01 03:00:00'
DO BEGIN
/*
INSERT INTO test(text) VALUES ('text');* <- THIS WORKS JUST FINE
*/
SET @exec_var = sys_exec('c:\wamp\bin\php\php5.4.12\php c:\mySite\testit.php');
END $$
DELIMITER;

对 php 的 sys_exec() 调用似乎不起作用,我不明白为什么。互联网上没有太多关于此的内容。我知道 php 脚本有效,因为当我在命令行运行 c:\wamp\bin\php\php5.4.12\php c:\mySite\testit.php 时,我得到了结果。 testit.php 只是执行与事件中注释掉的完全相同的插入。知道为什么 sys_exec() 没有运行我的脚本吗?或者,如果有错误,我将如何记录或查看它们?

(我知道可能存在安全问题和其他我还没有想到的事情。这只是初步的概念证明。但是如果你看到任何我不应该走这条路并使用 PHP 的理由相反,我会对原因感兴趣。这种方式似乎比学习/设置 PHP 守护进程更容易启动和运行。)

谢谢!

这就是 testit.php 脚本中的所有内容...

try
{
$dbh = new PDO("mysql:host=********;dbname=********", ********, ********);
$dbh->setAttribute( PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true );
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
}
catch(PDOException $e) { echo $e->getMessage(); }

$q1 = $dbh->prepare("INSERT INTO test(text) VALUES ('text')");
$q1->execute();

最佳答案

不要这样做。 MySQL 事件与所有其他类型的存储例程(触发器、函数和过程)一样,并不意味着用于调用外部进程。相反,存储例程的全部意义在于保持所有数据库处理与外界隔离。

即使您可以从技术上做到这一点,但这并不意味着这是正确的做法。您的示例代码很好地说明了它绝对没有意义。您启动 php 只是为了连接回数据库并插入一行,您只需在事件本身中发出插入即可轻松完成。

如果您需要定期运行 php 脚本,请使用为此专门设计的工具 - 操作系统调度程序 cron 或在您的情况下为 Windows 任务调度程序。

另一方面,如果您的所有脚本所做的只是操作数据库中的数据,并且除了通过构建语句(如 LOAD DATASELECT INTO)之外不需要与操作系统进行任何交互OUTFILE) 只需在您的事件中正确执行即可。

除了 sys_exec 的使用外,UDF 对您的数据库实例来说是一个巨大的安全隐患!如果您没有阅读或忘记它,请参阅图书馆文档中的注意事项

Be very careful in deciding whether you need this function. UDFs are available to all database users - you cannot grant EXECUTE privileges for them. As the commandstring passed to sys_exec can do pretty much everything, exposing the function poses a very real security hazard.

Even for a benign user, it is possible to accidentally do a lot of damage with it. The call will be executed with the privileges of the os user that runs MySQL, so it is entirely feasible to delete MySQL's data directory, or worse.

The function is intended for specialized MySQL applications where one needs extended control over the operating system. Currently, we do not have UDF's for ftp, email and http, and this function can be used to implement such functionality in case it is really necessary (datawarehouse staging areas could be a case in example).

You have been warned! If you don't see the hazard, please don't try to find it; just trust me on this.

If you do decide to use this library in a production environment, make sure that only specific commands can be run and file access is limited by using AppArmor.

关于php - MySql 事件调度程序调用 PHP 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21106107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com