After upgrading to EE 2.9.0, we saw some error messages in the template logs that indicated that there were cache misses from CE Tweet when there shouldn’t be:
(0.686731 / 20.42MB) *** CE Tweet debug: The cache file "EE_SYSTEM_DIR/expressionengine/cache/ce_tweet/p_73b09fbfe3c702171f6068ad60f3976d" does not exist.
Upon further investigation, we saw that the ‘cache/ce_tweet’ directory contained over 50,000 files due to cache misses creating new cache files (that were never used). I confirmed this in my local development environment and tracked it down to the line that creates the filename for the cache file:
// ce_tweet/mod.ce_tweet.php //the parsed cache filename $cache_parsed = 'p_' . md5( $this->EE->TMPL->tagchunk . $unique );
From inspecting the value of `$this->EE->TMPL->tagchunk` I was able to see that, in some circumstances, ExpressioneEngine would inject an annotation into the tag chunk. So a simple tag like:
{exp:ce_tweet:user_timeline screen_name="SCREEN_NAME"} {if count == '1'}first{if:else}other{/if} {/exp:ce_tweet:user_timeline}
Results in output like:
{exp:ce_tweet:user_timeline screen_name="SCREEN_NAME"} {!-- ra:0000000010183f6f000000015c2737a4 --}{if count == '1'}first{if:else}other{/if} {/exp:ce_tweet:user_timeline}
Causing the hashed filename to change on every request. I found references to other people having problems with this new feature, but was unable to track down a global solution. In the end, I resorted to stripping the annotations from the tag chunk prior to hashing:
diff --git a/third_party/ce_tweet/mod.ce_tweet.php b/third_party/ce_tweet/mod.ce_tweet.php index c0f08f1..9bfc7f2 100755 --- a/third_party/ce_tweet/mod.ce_tweet.php +++ b/third_party/ce_tweet/mod.ce_tweet.php @@ -783,11 +783,14 @@ class Ce_tweet { unset( $settings ); + // remove annotation from tagchunk (if present) + $tagchunk = preg_replace('/\{!-- ra:(\w+) --\}/', '', $this->EE->TMPL->tagchunk); + //the raw cache filename $cache_raw = 'r_' . md5( $unique ); //the parsed cache filename - $cache_parsed = 'p_' . md5( $this->EE->TMPL->tagchunk . $unique ); + $cache_parsed = 'p_' . md5( $tagchunk . $unique ); //the cache base $cache_base = str_replace( array( '\\', '/', ), DIRECTORY_SEPARATOR, $this->remove_duplicate_slashes( APPPATH . 'cache/ce_tweet/' ) );
Is there a better solution to avoid this undesired behavior?
Thanks.
|