我第一次玩MySql Events.这是活动......
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;
Run Code Online (Sandbox Code Playgroud)
sys_exec()对php 的调用似乎不起作用,我无法弄清楚为什么.互联网上没有太多关于此的内容.我知道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();
Run Code Online (Sandbox Code Playgroud)
不要这样做.作为所有其他类型的存储例程(触发器,函数和过程)的MySQL事件不应用于调用外部进程.相反,存储例程的整个点是保持所有数据库处理与外部世界划分.
即使你可以技术性地做到这一点,但这并不意味着它是正确的.您的示例代码是一个很好的例子,它绝对没有意义.你启动一个php只是为了建立一个连接回数据库并插入一行你可以很容易地在事件本身发出插入.
如果您需要定期运行php脚本,请使用专门设计的工具 - 操作系统调度程序cron或您的Windows任务计划程序.
另一方面,如果你所做的所有脚本都在操作数据库中的数据,并且不需要与OS进行任何交互,除了通过构建它的语句(如LOAD DATA或SELECT INTO OUTFILE),只需在事件中正确执行即可.
除了使用sys_execUDF 对数据库实例来说是一个巨大的安全隐患!如果您没有阅读或忘记它,请参阅库文档中的注意事项
在决定是否需要此功能时要非常小心.UDF可供所有数据库用户使用 - 您无法为它们授予EXECUTE权限.由于传递给sys_exec的命令字符串几乎可以完成所有操作,因此暴露该函数会带来非常真实的安全隐患.
即使对于良性使用者,也可能意外地对其造成很大的伤害.调用将以运行MySQL的操作系统用户的权限执行,因此删除MySQL的数据目录完全可行,或者更糟.
该功能适用于需要对操作系统进行扩展控制的专用MySQL应用程序.目前,我们没有针对ftp,email和http的UDF,并且该功能可以用于实现这种功能,以防真正需要(例如,数据仓库暂存区域可能是一个例子).
你被警告了!如果您没有看到危险,请不要试图找到它; 请相信我.
如果您决定在生产环境中使用此库,请确保只能使用AppArmor运行特定命令并限制文件访问.