1

我有一个 Wordpress 驱动的站点,在该站点上使用 wp-super-cache,因此我被迫通过 ajax 而不是内联 PHP 跟踪视图。以下是通过 ajax 调用的我的 PHP 文件的内容。顺便说一句,代码并不是真正的 Wordpress 特定的,但为了稍微解释一下,它会像更新wp_postmeta表格一样更新表格update_post_meta()。它使用 mysqli,并进行2 个sql 查询

  1. 确保要更新的 postid 有效。
  2. 增加观看次数。

我的问题是,这段代码是否存在一些性能问题,它会以某种方式更好吗?

代码摘录:

  #...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;

新代码:

这就是我最终使用的,只用一个替换了两个调用:

UPDATE wp_postmeta SET meta_value = meta_value + 1 WHERE post_id = '" . $post_id . "' AND meta_key = 'views';

笔记!这使得返回响应过时了,因为我没有返回当前的视图计数。但另一方面,我保存了一个查询。

4

2 回答 2

1

对我来说看起来很好。我唯一想说的是,如果这是一个后台任务,那么在生产环境中获取视图计数响应是没有用的(除非发生了一些我不知道的事情)。

因此,鉴于这些信息,没有理由事先验证 postid。您可以将第一个 sql 语句与 $views 计算一起删除,然后只使用更新语句(如果它不是有效的 id,那么它根本不会更新任何东西)。如果您在创建帖子时未设置此“视图”元键,则查看INSERT... ON DUPLICATE KEY而不是更新

如果您真的想保留您的 json 响应,那么我看不到任何真正可以做出的改进。

于 2013-01-04T15:31:44.310 回答
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

将消除活泼。

于 2013-01-04T15:29:56.967 回答