web-dev-qa-db-ja.com

W3TCを有効にしたときのTransient APIの問題

私はWordpress 3.5.2でW3 Total Cache 0.9.2.11を使っています。一時的なAPIとw3tcのオブジェクトキャッシュ設定に問題があります。

Memcachedを使用して「オブジェクトキャッシュ」をアクティブにすると(他の設定はデフォルト)、一時APIが機能しなくなります。動作は次のとおりです。set_transient()の後の有効期限内にget_transient()を呼び出すと、nullが返されます。

「オブジェクトキャッシュ」が有効になっているときの動作は一貫しており、無効になっているときは問題なく動作します。ドキュメントはset_transient呼び出しが失敗するかもしれないシナリオを言及しませんでした。

デバッグモードのw3tcオブジェクトキャッシュを試しました。そしてページは1000から2000のオブジェクトキャッシュエントリを表示しました。各エントリの名前はよくわかりませんが、一時的な値はありません。

見落としがあった設定はありますか。この原因は何ですか?

更新: 私はまた、ページを更新するとget_transientが希望の出力を返すことに気付きました。こんなふうになります:

  1. 最初のset_transientget_transientはnullを返します
  2. 2番目のset_transientget_transientは最初の値を返します
  3. 3番目のset_transientget_transientは2番目の値を返します

それで、set_transientが終了するのにより長い時間がかかるように見えます、w3tcがこの呼び出しを非同期にしたかどうかに関する何らかの参照がありますか?そしてもしそうなら、どのように私はそれを回避するのですか?

5
He Shiming

私はこれと同じ問題を抱えていたので、Andyのソリューションを拡張することでそれを修正することができましたが、特にW3TCのオブジェクトキャッシュを使用しないためには、値を強制するだけでした。 APC、Memcached、およびDiskをキャッシュに使用しても同じ結果が得られました。キャッシングは確かにパフォーマンスに役立ちます、そして私が問題を抱えていたコードは私自身(プラグイン)ではないのでインラインでそれを修正することはオプションではありませんでした....フィルタ/アクションを入力してください。 TRANSIENT_KEYをキャッシングを無効にしたいキーに置き換えて、私はそれをうまく動かすことができました。

global $_wp_using_ext_object_cache_prev;
function disable_linked_in_cached($value=null){
    global $_wp_using_ext_object_cache;
    $_wp_using_ext_object_cache_prev = $_wp_using_ext_object_cache;
    $_wp_using_ext_object_cache = false;
    return $value;
}
add_filter( 'pre_set_transient_TRANSIENT_KEY', 'disable_linked_in_cached' );
add_filter( 'pre_transient_TRANSIENT_KEY', 'disable_linked_in_cached' );
add_action( 'delete_transient_TRANSIENT_KEY', 'disable_linked_in_cached' );

function enable_linked_in_cached($value=null){
    global $_wp_using_ext_object_cache;
    $_wp_using_ext_object_cache = $_wp_using_ext_object_cache_prev;
    return $value;
}
add_action( 'set_transient_TRANSIENT_KEY', 'disable_linked_in_cached' );
add_filter( 'transient_TRANSIENT_KEY', 'enable_linked_in_cached' );
add_action( 'deleted_transient_TRANSIENT_KEY', 'disable_linked_in_cached' );
2
doublesharp

現在、W3TCでのオブジェクトキャッシングの最大の問題と解決策を次に示します。 http://wordpress.org/support/topic/self-diagnosed-and-fixed-w3-total-cache-bug-in -faulty-object-caching

2

私はこの正確な問題に遭遇しました、そしてそれは確かにW3キャッシュによるものです。コードの実行中に一時的にオブジェクトキャッシュを無効にする方法を導き出しました。これは私のユースケースではうまくいきました。コードは次のようになります。

// We need to turn off the object cache temporarily while we deal with transients,
// as the W3 Total Cache conflicts with our work
global $_wp_using_ext_object_cache;

$_wp_using_ext_object_cache_previous = $_wp_using_ext_object_cache;
$_wp_using_ext_object_cache = false;

// ...do some work with transients here...

$_wp_using_ext_object_cache = $_wp_using_ext_object_cache_previous;

WordPressは$_wp_using_ext_object_cacheの値をチェックしてオブジェクトキャッシュを使用するべきかどうかを判断します。そのため、作業中は一時的に無効にします。誰かに役立つことを願っています!

1
Andy Adams