我们想跟踪一个页面加载的页面数,所以我有这个方法来做到这一点:
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/