每30秒运行一次SQL查询(计数),然后将输出保存到某个文件

时间:2012-04-26 14:31:37

标签: php sql file

我正在开发一个网站,并建立了一个人们可以插入数据(投票)的数据库。我想在标题中保留一个计数器,就像“x”投票一样。但很可能很快就会在网站上出现大量流量。现在我可以使用查询

SELECT COUNT(*) FROM `tblvotes

然后在标题中显示数字,但是每次用户更改页面时,它都会重做查询,所以我在想,也许每30秒一次查询更好(对mysql的负载更少)服务器),但后来我需要将它的输出保存到某个地方(这应该不是那么难;我可以把它写到文本文件?)但是我怎么能让我的网站每隔30秒自动运行查询并放入文件中的数字。我没有SSH到服务器所以我不能crontab它?

如果有什么你可能听不懂的话随便问一下!

5 个答案:

答案 0 :(得分:5)

最简单的方法:将结果写入本地文本文件,检查每个请求的文本文件的文件时间是否小于now()+ 30秒,如果是,则更新文件。要更新,您应该锁定该文件。在更新文件时,满足条件now()+ 30的其他用户应该只读取当前存在的文件以避免竞争条件。 希望有所帮助, 斯蒂芬

答案 1 :(得分:3)

Crontabs只能以最快的速度每分钟运行一次。

我认为有更好的解决方案。您应该创建一个存储统计信息的聚合表。

在voting_table上使用trigger,每次表收到INSERT语句时都可以执行'something'。

聚合表将存储最准确的信息,然后您可以查询以显示计数。

答案 2 :(得分:2)

如果您的服务器允许,更好的解决方案是使用一些缓存机制(例如APC)而不是文件。

答案 3 :(得分:1)

如果可以,您可能需要考虑使用memcached。它允许您为添加到其中的任何数据设置到期时间。

首次执行查询时,编写与结果关联的查询文本的md5。在后续查询中,查找memcached中的数据。如果它已过期,您可以重做sql查询,然后将其重写为memcached。

答案 4 :(得分:0)

好的,所以问题的第一部分基本上是关于将总票数的结果缓存到页面标题中。这是一个非常好的主意 - 这是一个如何实现它的想法......

如果您无法启用crontab(即使没有SSH访问权限,您可以使用您的主机控制面板进行设置),您也可以使用外部第三方cronjob服务。 (Google has many results for this)...

每次你的cronjob运行时,你都可以创建/更新一个只包含一些PHP数组的文件 -

$fileOutput = "<"."?php\n\n";
$fileOutput .= '$'.$arrayName.'=';
$fileOutput .= var_export($yourData,true);
$fileOutput .= ";\n\n?".">";
$handle = fopen(_path_to_cache_file,'w+');
fwrite($handle,$fileOutput);
fclose($handle);

这将为您提供一个PHP文件,您只需include()进入标题标记,然后您就可以访问名为$yourData的{​​{1}}变量。