特定用户操作发生5分钟后,我需要更改数据库中的一些数据。到目前为止,我已经在我的家庭服务器上编程,我已经使用mysql事件来实现这一目标,它工作得很好。但是我现在托管我的网站的提供商限制使用mysql Events。
现在我必须为mysql Events想出一个替代方案。
我想执行一个php脚本,通过使用exec("php script.php &> /dev/null &")
来改变后台的数据,这实际上是有效的(至少在我的服务器上),但这也受到我的提供商的限制。
现在我真的无计可施了,需要你的帮助——我该怎么做呢?
谢谢!
创造编辑:在我的例子中,Cronjobs没有做到这一点,因为只有在特定的用户操作发生时,我才必须执行脚本。
我将考虑以下内容,因为您在这里标记了PHP
。
在aws ec2上创建一个帐户,从他们的Free-Tier开始,为期一年。这将允许创建您选择的AMI (Amazon Machine Instance)。通常是Linux,但也可以是微软的变体。调整并保存它。由于资源(内存)有限,Linux是通常的选择。它将是一个小型实例类型,免费使用1年。
注:我没有隶属于亚马逊。它也可以很容易地从Azure/微软或谷歌。然而,我从2008年就开始使用ec2了,一个理智的人会得出这样的结论:它们比竞争对手领先好几年。这也许可以解释为什么Openshift和其他公司只是在他们的基础上下注。应该仔细阅读IaaS与PaaS的对比,以了解设置IaaS解决方案的复杂性。这不是一个非技术人员应该推荐给他们的东西。
在PaaS方面,我会选择Openshift。对于这些,有很多话要说。
我选择IaaS,因为我希望在虚拟服务器上安装任何东西,以及我的代码可以监听任何端口和协议的选择。
如果一个人然后有一个ec2或等效的虚拟服务器,一个人能够利用他们选择的编程语言(一个agent
运行在java, c#, python等)一个定时器来调用你的共享主机环境PHP(包括https认证)来触发共享主机event-like
机制。或者,更好的是,让你的mysql实例运行在ec2或RDS上。
考虑上述问题的原因包括
- 在将来可能使用的平台上磨牙
- 它比你衣柜里的旧笔记本电脑的电源故障要好,否则你可以使用
- 您可能最终在云上并希望这些
agents
执行其他任务 通过退出共享主机,您不会受到cron或事件限制。
对于Other Tasks,您会发现Events具有局限性。最大的问题之一是不能从存储程序中调用LOAD DATA INFILE
。我使用代理。你的代理可以0/s启动
试用后,如果仍然在共享主机上,但与更强大的虚拟服务器集成,则可以最终使用微实例。我估计每月12美元,也许更便宜,代理可以24/7在云端运行,指向和做任何事情。不太强大的实例类型,但可能。我不能谈论nano
实例类型的强大或缺乏。
注意代理可以嵌入mysql客户端库(该程序执行Using或Import操作,并且是mysql客户端程序)。在本例中,它直接连接到端口3306。这对于仅适用于aws的解决方案可能工作得很好,但是将数据库服务器暴露给互联网是一种安全风险。如果有疑问,应该查看General Query日志,看看发生了哪些攻击。最佳实践是将您的DB服务器隐藏在防火墙后面,使其不受此影响。这就是为什么像PHP这样的API是非常受欢迎的。因此,没有什么可以阻止您编写一个100行代理,它通过https
向共享主机PHP
执行经过身份验证的POST
,并从那里获取它。
其他选项包括创建SSH隧道。我离题了
通常,处理这类挂起文件数据库项的最佳方法是使用有效时间策略。这种策略的最大优点是:它不依赖于事件、cronjobs或其他任何东西的定时准确性。
你没有说在用户操作五分钟后需要对数据进行什么处理,所以我不得不猜测。
假设操作是从table_a
中删除一行,并在table_b
中插入一行。在这种情况下,将DATETIME
或TIMESTAMP
列effective_until
添加到table_a
,将另一列effective_after
添加到table_b
。
当用户操作发生时,执行类似
的操作 UPDATE table_a
SET effective_until = NOW() + INTERVAL 5 MINUTE
WHERE id='whatever';
和
INSERT INTO table_b (id, data, effective_after)
VALUES (whatever, whatelse, NOW() + INTERVAL 5 MINUTE);
然后,以后,当你使用 table_a
时,你说
SELECT ... FROM table_a WHERE (effective_until <= NOW() OR effective_until IS NULL) ;
当你使用table_b
时,你要输入
SELECT ... FROM table_a WHERE effective_after > NOW();
每天一次,或者每周一次,或者其他什么时候,你可以用这样的方法清除table_a
中死亡的东西。
DELETE FROM table_a WHERE effective_until <= NOW();
技巧是用时间戳标记行,而不是依赖精确计时的操作。更加健壮和可靠。当cronjob整个周末都失败的时候,它还是有弹性的。而且,兼容廉价的托管服务和不合作的数据库,这两种服务世界上都有很多。