Yesterday I encountered yet another unusual TYPO3 problem. An external web site had to link to pages on a TYPO3 site providing various parameters for an extension on one page. The extension is cacheable because it does certain network queries and it will be slow to do them for each request. So extension uses cHash for proper caching.
The problem was that the external site could not create cHash. cHash creation is not trivial and involves using site–specific encryption key. So the external site could not ptovide cHash and displayed content was wrong: it was like the page was called without any parameter.
What could I do?
There were several choices:
I decided on the last choice. Plugin will be cacheable only if cHash exists in the URL. But how do I do it? When plugin is cached, it is not called. So there is no way to check cHash for each request from the plugin.
Fortunately my experience with TYPO3 gave me the answer in 30 seconds. I will use conditions. Here is how it looks like:
plugin.tx_myext_pi1 = USER
[globalVar = GP:cHash = ]
plugin.tx_myext_pi1 = USER_INT
[global]
So when user clicks normal links, cHash is present and plugin is cached. When request comes from the external server, plugin is not cached because cHash is missing.
Why did I use this approach and not this:
plugin.tx_myext_pi1 = USER
[globalVar = GP:cHash = ]
config.no_cache = 1
[global]
The answer is simple. The page contains also many other elements. They still could be cached. This improves performance. no_cache is always bad. So I do not use it and do not recommend anyone to use it. Always try to find the other way. It usually exists.
The problem was that the external site could not create cHash. cHash creation is not trivial and involves using site–specific encryption key. So the external site could not ptovide cHash and displayed content was wrong: it was like the page was called without any parameter.
What could I do?
There were several choices:
- make external site send proper cHash. Difficult and not secure to let others know the encryption key
- make plugin non–cached. Bad because affects performance
- make plugin cacheable in general but non–cached only if cHash is missing
I decided on the last choice. Plugin will be cacheable only if cHash exists in the URL. But how do I do it? When plugin is cached, it is not called. So there is no way to check cHash for each request from the plugin.
Fortunately my experience with TYPO3 gave me the answer in 30 seconds. I will use conditions. Here is how it looks like:
plugin.tx_myext_pi1 = USER
[globalVar = GP:cHash = ]
plugin.tx_myext_pi1 = USER_INT
[global]
So when user clicks normal links, cHash is present and plugin is cached. When request comes from the external server, plugin is not cached because cHash is missing.
Why did I use this approach and not this:
plugin.tx_myext_pi1 = USER
[globalVar = GP:cHash = ]
config.no_cache = 1
[global]
The answer is simple. The page contains also many other elements. They still could be cached. This improves performance. no_cache is always bad. So I do not use it and do not recommend anyone to use it. Always try to find the other way. It usually exists.
0 comments:
Post a Comment