[TYPO3-core] RFC 17978 -.... 30% performance drop without discussion
Helmut Hummel
helmut.hummel at typo3.org
Tue Feb 5 23:30:46 CET 2013
On 05.02.13 17:18, Tolleiv Nietsch wrote:
Hi!
> Jigal van Hemert schrieb:
>>
>> Note: the RM agreed with this patch and it's only a single step of a
>> larger path.
>>
>
> It's step back actually and a significant one and I wonder why this has
> to be pushed through before actual improvements with the cleaner
> approach can be shown... that's what we have sandbox-repos for.
Let me start with explaining what is wrong with the current situation,
before I will argue, why I would take a slightly different approach to
improve it.
1. ext_tables.php is a PHP file.
Because of that, extension authors put all sorts of plain PHP code in
there to "solve" their problems. The problem with that is, that it
impossible to add a caching layer for that.
2. ext_tables.php does not only to add/ modify TCA
Unlike the name of file suggests, the core itself uses ext_tables.php
for all kind of stuff not related to TCA but also to add/ modify al
sorts of global arrays (TBE_STYLES, PAGES_TYPES, TBE_MODULES, TCA_DESCR,
FILEICONS, and probably more).
3. TCA and especially loadTCA is not designed to work in the frontend
TCA is mainly designed and required for the backend to show correct
input forms for editors. But since TCA also defines relations and
validation, it can be useful for frontend extensions as well. In fact
extbase requires TCA for it's ORM.
One major problem is the way the full TCA for one table is compiled.
It consists of two parts, the control section (TCA[table][ctrl]) and the
columns section (TCA[table][columns])
By default only the control section is defined in ext_tables.php, but in
this section one property (TCA[table][ctrl][dynamicConfigFile]) defines
in which file the colums section is located.
This means, if you want to modify or add colum configuration, in your
extension ext_tables.php, you must first load the default columns
definitions (loadTCA(table)) into memory to not end up with corrupted TCA.
This works quite OK in the backend, because all ext_tables.php are
included for every request.
It does not work in FE because the TCA control section is cached and
once the cache entry is found ext_tables.php files are not included any
more. The consequence is, that even by calling loadTCA(table) you will
not get the TCA column changes or additions from extensions any more,
but only the ones found in the "dynamicConfigFile"
This leads to the next problem:
4. "compressed" TCA in frontend context
If a frontend request does not find a cached TCA, it includes all
ext_tables.php files, leading to a complete TCA columns section in this
request, making every extension relying on it work fine.
Unfortunatly this full TCA is "compressed", which means, that (almost)
the complete colmuns section is thrown away and only the remaining
control section is cached. This is done to "save space"
In the next request to this page, compressed TCA is loaded from cache
making it impossible for (uncached) extensions to get the full TCA. If
this is needed for the extension to work, it will fail during the second
request.
Since it is not realy visible when a cache entry is fetched and when
not, you will end up in debugging hell if you are not aware of this problem.
OK, so far the story of what is wrong. Now what has been done in the
merged change to tackle these problems.
1. Get rid of *all* loadTCA calls.
Forgetting such calls will lead to corrupted TCA, having the call does
not gurantee to have a full TCA (in FE).
Removing them altogether and always have a complete TCA is a good thing!
2. Always load the TCA columns sections after including every ext_tables.php
This adds a performance penalty for every backend request, as now *all*
files with the TCA columns secions are included, even if they are "not
needed" for particular requests.
The problem I have with that is not the performance penalty, but not
deprecating "dynamicConfigFile" at the same time, as this never worked
as expected, is now in fact obsolete but still part of the specification.
Doing so in a second step, is quite easy but we should do this as soon
as possible.
3. Always load ext_tables.php in BE *and* FE
This is what causes the big performance penalty for cached frontend
pages, because even in full cached context *all* ext_tables.php files
(or the one big combined one) are included.
That is what makes me worry the most.
Performance is only one thing that gets worse with this change.
As mentioned above, a lot of things are set up in ext_tables.php (even
by the core) which is not required at all in FE context at all.
Additionally we even encourage developers to put PHP code in there, as
it will now will be reliably executed in backend *and* frontend context.
While this is more consistent, it goes into a wrong direction. We need
to restrict these files to configuration or at least to clearly defined
API calls not loosen up restrictions. If we would release a TYPO3
versions in this state, we would have even more troubles to maintain
backwards compatibility when trying to tighten things up again.
What I would do as followup here, is to cache the *full* TCA after a
first request which included all ext_tables.php and not include
ext_tables.php any more after that in frontend context.
The performance impact will be gone again, we will have a full
consistent TCA in FE and no need for loadTCA.
Of course this is a bit inconsistent as the behaviour differs in BE and
FE context, but this is outweight by the benefits to do so.
Summary, next steps:
====================
Overall the change is good, if we do not leave it like it is.
We need to:
1. Deprecate dynamicConfigFile and remove the usage in the core
2. Cache full TCA in FE
3. Seperate TCA configuration from ext_tables.php and deprecate defining
TCA there
4. Cache full TCA in all contexts
5. Move from PHP to a configuration notation for TCA (with a good
concept of extending/ overriding this configuration)
6. Move all configuration from ext_tables.php to a configuration
notation and deprecate ext_tables.php altogether
I think 1. - 2. are mandatory for TYPO3 6.1 and 3. - 4. absolutely doable.
5. - 6. Should be left for future versions
Kind regards,
Helmut
--
Helmut Hummel
Release Manager TYPO3 6.0
TYPO3 Core Developer, TYPO3 Security Team Member
TYPO3 .... inspiring people to share!
Get involved: typo3.org
More information about the TYPO3-team-core
mailing list