如何使用PHP
和MySQL
创建“今日精选文章”系统?
每天,当用户第一次访问该网站时,我需要从数据库中随机选择一篇文章,这将在一天内用于每个访问该网站的用户。 这将在没有管理员干预的情况下发生,因此脚本将由访问的用户触发。
据我了解,用户第一次在新的一天访问该页面时,该脚本会随机(或在其他基础上)选择一篇文章,然后在数据库中将其标记,同时解开文章从前一天开始。但是,如果两个用户同时访问同一页面怎么办?这可能意味着会同时标出两篇文章!
你如何应对时区?
答案 0 :(得分:4)
我要做的是:
然后,当访问者访问该网站时,他们的页面视图只从memcached中提取HTML片段并直接在页面中输出。在午夜,HTML片段以原子方式更改,下一个PHP请求将获取新保存的文章。
由于cron作业是选择随机文章的唯一代码,因此它不会与任何其他代码同时运行,因此不需要锁定。
没有运行memcached?习惯它。 Web应用程序架构需要一些明智的,特定于应用程序的缓存,而memcached是最佳解决方案。
关于时区,简短的回答是将UTC用于所有事情。有关更多详细信息,请收听OurSQL Podcast episode 46: It's About Time。
答案 1 :(得分:0)
您需要构建2个数据库。一个有明显的新闻文章,另一个持有该特定日期的文章ID。您可以在加载站点时在PHP中运行检查以检查当前日期以及是否存在文章。如果没有,则该用户是第一个到达该网站的用户,因此找到一篇随机文章,并在白天将这些文章插入到表格中。
我不会为你编写整个脚本,但我会给你几个元素。至于时区,您将使用服务器时间而不是最终用户的计算机时间。这是一种违反安全性的行为,因为它们可能在未来或过去设定了一个日期,而不是写入任何数据。
对于在“同一时间”访问该网站的用户,这是不太可能的。
要从MySQL数据库中按日期选择文章,您可以使用:
$check_sql = "SELECT * FROM todays_article
WHERE date = '" . date("j-n-Y") . "'
LIMIT 1";
$check_qry = mysql_query ($sql);
if (mysql_num_rows ($check_qry) == 1) {
// Do nothing
}
else {
$random_sql = "SELECT article_id FROM articles
ORDER BY RAND() LIMIT 1";
$random_qry = mysql_query ($random_sql);
$random_row = mysql_fetch_assoc($random_qry);
$insert_sql = "INSERT INTO todays_article
('article_id', 'date') VALUES
('" . $random_row["article_id"] . "', '" . date("j-n-Y") . "')";
$insert_qry = mysql_query($insert_sql);
}
这是未经测试的,但它可以让您了解自己想要达到的目标。
答案 2 :(得分:0)
您可以通过使用日期来播放散布文章ID的哈希函数,而无需在任何地方保存任何内容。我不知道我推荐这么做,但无论如何都要考虑替代解决方案。 :)
$id = hexdec(substr(md5(date('Ymd')), 0, 8)) % $number_of_articles;
注意:
date('H')