1

私はwp-super-cacheを使用するWordpress主導のサイトを持っているため、インラインPHPではなくajaxによってビューを追跡する必要があります。以下は、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;

新しいコード:

これは私が最終的に使用したものであり、2つの呼び出しをこの1つの呼び出しに置き換えました。

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

ノート!これにより、現在のビューカウントが返されないため、戻り応答が廃止されます。しかし一方で、私はクエリを保存します。

4

2 に答える 2

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 に答える
1

私には完全に元気に見えます。私が言えるのは、これがバックグラウンドタスクである場合、ビューカウント応答を取得することは本番環境では役に立たないということです(気付かないうちに何かが発生しない限り)。

したがって、その情報を考えると、事前にpostidを検証する理由はありません。$ views計算とともに最初のSQLステートメントを削除し、updateステートメントを使用することができます(有効なIDでない場合は、何も更新されません)。投稿の作成時にこの「ビュー」メタキーを設定しない場合はINSERT... ON DUPLICATE KEY、更新の代わりに確認してください

あなたが本当にあなたのjson応答を維持したいのなら、私は実際に行うことができる改善を見ることができません。

于 2013-01-04T15:31:44.310 に答える