php - MySQL 和 PHP 中的计时问题

标签 php mysql wordpress

我们想跟踪一个页面加载的页面数,所以我有这个方法来做到这一点:

function track_views($postID) {
    $count_key = 'post_views';
    $count = get_post_meta( $postID, $count_key, true );
    if($count == '') {
        delete_post_meta( $postID, $count_key );
        add_post_meta( $postID, $count_key, '1' );
    } else {
        $count++;
        update_post_meta( $postID, $count_key, $count );
    }
}

我想知道的是,这可能会错过观看次数吗?如果两个用户同时加载页面,或者如果流量很高,获取字段、更新它并重新插入它的时间太少,是否会导致此计数不是 100% 准确?

例如:用户 1 加载页面 - 页面计数为 4,同时将 var 更新为 5,用户 2 加载并获得页面计数 4。将其更新为 5 并重新插入。

^它是这样工作的吗?或者时间真的不会有太大的不同吗?

我们真的不太关心页面加载的次数,所以我们不打算用一个表来填充每次加载的记录(每次加载都插入一条新记录),但我们想知道如果这会对其他页面加载产生竞争问题……和/或是否会产生冲突。

最佳答案

是的,您写的代码存在竞争条件是正确的。

在这种情况下,您通常会做的是直接在数据库中自动更新 View 计数:

UPDATE wp_postmeta
    SET meta_value = meta_value + 1
    WHERE post_id = $postID AND meta_key = 'post_views';

然后如果您确实需要该值(例如将其显示在页面上),您将从数据库中检索新值。

以这种方式完成后,数据库将确保更新是原子的,如果您在请求期间实际上不需要查看计数,则可以少进行一次查询(以获取数据)。

关于php - MySQL 和 PHP 中的计时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34726496/

相关文章:

mysql - 从表中选择 3 天之前的所有条目

php - 我应该使用整数来保存 bool 值吗?

php - 将基于PHP的reCaptcha插入基于jQuery的Shoutbox时遇到很多麻烦

PHP 删除功能损坏

php - 如果某行不存在,如何更新或返回 FALSE?

php - 检查选定的项目列表是否在另一个表中

javascript - 我想更改帖子标题的某些字母的颜色

wordpress - 尝试通过 React Web App 创建 Headless Wordpress 登录

php - 如何在创建广告帐户 facebook marketing api 时使用管理员权限

php - 构建个人 CMS - 类和库