我有一个Wordpress驱动的网站,我使用wp-super-cache,因此我被迫跟踪ajax而不是内联PHP的视图。以下是我的PHP文件的内容,它通过ajax调用。代码不是特定于Wordpress的btw,但为了解释一下,它更新了wp_postmeta
表,就像update_post_meta()
一样。它使用mysqli,并使 2 sql查询
我的问题是,此代码是否存在某些性能问题,是否会以某种方式更好?
代码摘录:
#...ajax stuff
$json_array = array();
$json_array["category_id"] = (int)$cat_id;
$json_array["post_id"] = (int)$post_id;
// get secure database credentials
require("/server/abspath/dbinfo.inc");
$db_details = new dbCreds;
$mysqli = new mysqli(
$db_details->get("dbhost"),
$db_details->get("dbuser"),
$db_details->get("dbpw"),
$db_details->get("db")
);
# test if valid post
# sql call no1
$valid_post_sql = "SELECT ABS(meta_value) FROM wp_postmeta "
. "WHERE (post_id = '" . $post_id . "' AND meta_key = 'views')";
$current_view_count = @$mysqli->query($valid_post_sql)->fetch_array();
$valid_post_sql_result = $current_view_count ? true : false;
if ( $valid_post_sql_result == false ) {
die("4");
}
# set new view-count
$views = isset($current_view_count[0]) && (int)$current_view_count[0] >= 0
? ((int)$current_view_count[0]+1) : 0;
# if not an admin or no views recorded yet
if ( !$is_admin || $views == 0 ) {
# sql call no2
$increment_imgviews_sql = "UPDATE wp_postmeta SET meta_value = "
. "meta_value + 1 WHERE (post_id = '" . $post_id
. "' AND meta_key = 'views')";
$mysqli->query($increment_imgviews_sql);
}
$json_array["views"] = $views;
return $json_array;
新代码:
这是我最终使用的,用这一个替换2个电话:
UPDATE wp_postmeta SET meta_value = meta_value + 1 WHERE post_id = '" . $post_id . "' AND meta_key = 'views';
注意!这使返回响应过时,因为我没有得到返回的当前视图计数。但另一方面,我保存了一个查询。
答案 0 :(得分:1)
你不能使用INSERT ... ON DUPLICATE KEY
结构而不是检索/更新/存储吗?现在你的代码相当活泼,可能会失去命中率。像
INSERT INTO wp_postmeta (meta_value, meta_key, post_id) VALUES (...)
ON DUPLICATE KEY UPDATE meta_value=meta_value+1
会消除这种怜悯。
答案 1 :(得分:1)
看起来对我很好。我唯一想说的是,如果这是一个后台任务,那么获取视图计数响应在生产环境中是没有用的(除非事情发生我不知道)。
所以鉴于这些信息,没有理由事先验证postid。您可以删除第一个sql语句以及$ views计算,并使用update语句(如果它不是有效的id,那么它根本不会更新任何东西)。如果您在创建帖子时未设置此“视图”元键,请查看INSERT... ON DUPLICATE KEY
而不是更新
如果你真的想保留你的json响应,那么我看不到任何真正可以做出的改进。