Freitag, 11. September 2015

Cmsmadesimple und Smarty

Cmsms verwendet von Anfang an die Templateengine Smarty.
Aber sie verwenden es konzeptionell nicht optimal.

Daher setzt Cmsms seit einiger Zeit eine gehackte Smarty-Version ein und hat jetzt mit Cmsms 2 das Problem mit den Entwicklungen von Smarty nicht mit halten zu können.

Darüber hinaus hat Cmsms offenbar noch nie Experimente mit Smarty gemacht.

Die damalige Powercms Version basierte auf Cmsmadesimple, jedoch habe ich alle die Dinge in die Tonne getreten, welche - was Leistung betraf - hinderlich waren.

Aus dem Archiv habe ich mal einen kleinen Test von damals heraus gewühlt der mir seiner Zeit ein Aha Erlebnis verpasste und der auch heute in der aktuellen Smartyversion so funktioniert.

Damals verwendete ich 3 Miniscripte - t1,t2,t3.

t1
----

PHP t1.php

<?php

include_once('smarty/libs/Smarty.class.php');

$smarty = new Smarty();
$smarty->assign('content',file_get_contents('smarty/libs/Smarty.class.php'));
$smarty->display('t1.tpl');

Template t1.tpl
{$content}

t2
---
PHP t2.php


<?php

include_once('smarty/libs/Smarty.class.php');

$smarty = new Smarty();
$smarty->display('t2.tpl');

Template t2.tpl

{t2}
{$content}

Das Plugin t2

<?php

function smarty_function_t2($params, $template)
{
 $template->assign('content',file_get_contents('smarty/libs/Smarty.class.php'));
    
}

t3

t3.php

<?php

include_once('smarty/libs/Smarty.class.php');

$smarty = new Smarty();
$smarty->display('t3.tpl');

Template t3.tpl

{t3}

Plugin t3

<?php

function smarty_function_t3($params, $template)
{
 echo file_get_contents('smarty/libs/Smarty.class.php');
 
}


Was mich damals interessierte war die Frage wo Smarty am optimalsten ist.
1. Man weist im PHP Script die Variablen dem Smarty zu und gibt sie dann mit dem Template aus
2.Man weist im Template über ein Plugin die Variablen dem Smarty zu und gibt sie dann mit dem Template aus
3. Man gibt die Inhalte über ein Plugin im Template direkt aus.

Die Ergebnisse damals haben mich überrascht.
Und - sie sind heute noch gültig.

Gemessen mit dem Apache Benchmark ab -kc 100 -t 30 

Vorweg gesagt - die optimalste Variante ist t2 - sie bietet unter Last die besten Ergebnisse.

t1


Percentage of the requests served within a certain time (ms)
  50%    144
  66%    159
  75%    176
  80%    188
  90%    230
  95%    293
  98%    373
  99%    419
 100%    757 (longest request)

t2


Percentage of the requests served within a certain time (ms)
  50%    144
  66%    159
  75%    174
  80%    185
  90%    218
  95%    267
  98%    326
  99%    364
 100%    603 (longest request)

t3

Percentage of the requests served within a certain time (ms)
  50%    143
  66%    160
  75%    176
  80%    189
  90%    230
  95%    289
  98%    358
  99%    402
 100%    623 (longest request)
Die Variante t1 - also via PHP treu alle Inhalte holen, an Smarty zuweisen um dann alles via Template auszugeben ist die allerschlechteste Wahl.

Solche Test's habe ich damals laufend gemacht und die damalige Powercms Version war um einiges schneller als Cmsms.

Die Cmsms Entwickler haben so etwas noch nie gemacht und mit ihrem eigenen Hack die schlechteren t1 Ergebnisse sogar noch verschlechtert.
Das Cmsms nicht zum "Stillstand" gekommen ist verdankt man Verbesserungen an anderer Stelle.

Hier in dem kleinen Test geht es nur um eine einzige Variable - noch größer sind die Abstände wenn es - wie bei einem CMS üblich ist - um viel mehr geht.


Mittwoch, 9. September 2015

Cmsmadesimple hat nichts gelernt


Cmsms hat rein nichts gelernt was Power und Datenbankhandling betrifft.
Nehmen wir als Beispiel nur einmal folgende Abfrage die stets vorkommt und dessen Ergebnis.



Allein wie dieser Teil der Abfrage: IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32) 
zustande kommt ist programmiertechnisch abenteuerlich und extrem zeitaufwendig.

Dann wird ein ORDER BY auf die content_id vorgenommen im Vertrauen das Mysql sich einem existierendem Index bedienen wird der auf die ID gelegt ist - macht Mysql aber nicht sondern verwendet Filesort.

Ein SELECT * sollte misstrauisch machen und tatsächlich - hätte das Web 2000 Seiten würde Cmsmadesimple den Inhalt von 2000 Seiten komplett laden.

Das macht nur ein datentechnischer Volltrottel. Das Feld content ist vom Typ longtext und das kann 4,294,967,295 Bytes aufnehmen. In der Vergangenheit war es eine Nummer kleiner mit 65 KB und das reichte manchen Anwendern nicht aus.

So - nun stelle man sich 2000 Seiten nur mit 65 KB voll - ein Albtraum und erst recht mit 4GB pro Seite.

Und - solche Dinger sind kein Einzelfall !!

SQL wird in keinster Weise ausgenutzt - ein Fachmann würde sagen - die haben keine Ahnung.

Und vieles wird dazwischen noch mit PHP aufbereitet obwohl man es direkt mit der Abfrage hätte erledigen können.
Das ist Datenbankhandling mit einem Niveau unterhalb einer Fußmatte.

Ich hatte eigentlich gehofft das Cmsmadesimple nach den vielen Jahren etwas schlauer geworden ist aber V2 ist wieder nur eine zur geschlossene Tür zur Zukunft die man von rot mit schwarz übergemalt hat.


Slowmotion bei Cmsmadesimple V2

Wenn man sich folgendes bei Cmsms V2  anschaut wird einem klar, warum das System so unvorteilhaft bei der Geschwindigkeit ist:

included Files


1 /var/www/html/cmsms/index.php
2 /var/www/html/cmsms/include.php
3 /var/www/html/cmsms/lib/compat.functions.php
4 /var/www/html/cmsms/lib/classes/class.CmsException.php
5 /var/www/html/cmsms/lib/classes/class.cms_config.php
6 /var/www/html/cmsms/lib/classes/class.CmsApp.php
7 /var/www/html/cmsms/lib/autoloader.php
8 /var/www/html/cmsms/lib/misc.functions.php
9 /var/www/html/cmsms/lib/module.functions.php
10 /var/www/html/cmsms/version.php
11 /var/www/html/cmsms/config.php
12 /var/www/html/cmsms/lib/classes/internal/class.global_cachable.php
13 /var/www/html/cmsms/lib/classes/internal/class.global_cache.php
14 /var/www/html/cmsms/lib/classes/class.cms_siteprefs.php
15 /var/www/html/cmsms/lib/page.functions.php
16 /var/www/html/cmsms/lib/content.functions.php
17 /var/www/html/cmsms/lib/translation.functions.php
18 /var/www/html/cmsms/lib/html_entity_decode_php4.php
19 /var/www/html/cmsms/lib/adodb.functions.php
20 /var/www/html/cmsms/lib/adodb_lite/adodb.inc.php
21 /var/www/html/cmsms/lib/adodb_lite/adodbSQL_drivers/mysqli/mysqli_driver.inc
22 /var/www/html/cmsms/lib/adodb_lite/adodbSQL_drivers/mysqli/mysqli_date_module.inc
23 /var/www/html/cmsms/lib/adodb_lite/adodb-time.inc.php
24 /var/www/html/cmsms/lib/adodb_lite/adodbSQL_drivers/mysqli/mysqli_extend_module.inc
25 /var/www/html/cmsms/lib/adodb_lite/adodbSQL_drivers/mysqli/mysqli_transaction_module.inc
26 /var/www/html/cmsms/lib/adodb_lite/generic_modules/pear_module.inc
27 /var/www/html/cmsms/lib/classes/class.cms_filecache_driver.php
28 /var/www/html/cmsms/lib/classes/class.cms_cache_driver.php
29 /var/www/html/cmsms/lib/classes/class.moduleoperations.inc.php
30 /var/www/html/cmsms/lib/classes/internal/class.Smarty_CMS.php
31 /var/www/html/cmsms/lib/smarty/SmartyBC.class.php
32 /var/www/html/cmsms/lib/smarty/Smarty.class.php
33 /var/www/html/cmsms/lib/smarty/sysplugins/smarty_internal_data.php
34 /var/www/html/cmsms/lib/smarty/sysplugins/smarty_internal_templatebase.php
35 /var/www/html/cmsms/lib/smarty/sysplugins/smarty_internal_template.php
36 /var/www/html/cmsms/lib/smarty/sysplugins/smarty_resource.php
37 /var/www/html/cmsms/lib/smarty/sysplugins/smarty_internal_resource_file.php
38 /var/www/html/cmsms/lib/smarty/sysplugins/smarty_cacheresource.php
39 /var/www/html/cmsms/lib/smarty/sysplugins/smarty_internal_cacheresource_file.php
40 /var/www/html/cmsms/lib/classes/internal/class.CMSModuleDbTemplateResource.php
41 /var/www/html/cmsms/lib/classes/internal/class.CMS_Fixed_Resource_Custom.php
42 /var/www/html/cmsms/lib/smarty/sysplugins/smarty_resource_custom.php
43 /var/www/html/cmsms/lib/classes/internal/class.CmsTemplateResource.php
44 /var/www/html/cmsms/lib/classes/internal/class.CmsStylesheetResource.php
45 /var/www/html/cmsms/lib/classes/class.usertagoperations.inc.php
46 /var/www/html/cmsms/lib/classes/internal/class.CMSContentTemplateResource.php
47 /var/www/html/cmsms/lib/classes/internal/class.CMS_Content_Block.php
48 /var/www/html/cmsms/lib/classes/internal/class.CMSSmartySecurityPolicy.php
49 /var/www/html/cmsms/lib/smarty/sysplugins/smarty_security.php
50 /var/www/html/cmsms/lib/classes/internal/class.CmsRegularTaskHandler.php
51 /var/www/html/cmsms/lib/tasks/class.ClearCache.task.php
52 /var/www/html/cmsms/lib/classes/interface.CmsRegularTask.php
53 /var/www/html/cmsms/lib/tasks/class.GatherNotifications.task.php
54 /var/www/html/cmsms/lib/tasks/class.PruneAdminlog.task.php
55 /var/www/html/cmsms/lib/classes/internal/class.module_meta.php
56 /var/www/html/cmsms/lib/classes/class.cms_cache_handler.php
57 /var/www/html/cmsms/modules/AdminSearch/AdminSearch.module.php
58 /var/www/html/cmsms/lib/classes/class.CMSModule.php
59 /var/www/html/cmsms/lib/classes/class.CmsLangOperations.php
60 /var/www/html/cmsms/lib/classes/class.CmsCoreCapabilities.php
61 /var/www/html/cmsms/modules/CMSContentManager/CMSContentManager.module.php
62 /var/www/html/cmsms/modules/DesignManager/DesignManager.module.php
63 /var/www/html/cmsms/modules/FileManager/FileManager.module.php
64 /var/www/html/cmsms/modules/FileManager/fileinfo.php
65 /var/www/html/cmsms/modules/MicroTiny/MicroTiny.module.php
66 /var/www/html/cmsms/modules/ModuleManager/ModuleManager.module.php
67 /var/www/html/cmsms/modules/Navigator/Navigator.module.php
68 /var/www/html/cmsms/modules/News/News.module.php
69 /var/www/html/cmsms/modules/Search/Search.module.php
70 /var/www/html/cmsms/modules/Search/PorterStemmer.class.php
71 /var/www/html/cmsms/lib/classes/class.contentoperations.inc.php
72 /var/www/html/cmsms/lib/classes/internal/class.cms_content_cache.php
73 /var/www/html/cmsms/lib/classes/internal/class.CmsTemplateCache.php
74 /var/www/html/cmsms/lib/classes/contenttypes/Content.inc.php
75 /var/www/html/cmsms/lib/classes/class.ContentBase.php
76 /var/www/html/cmsms/lib/classes/class.CmsNlsOperations.php
77 /var/www/html/cmsms/lib/nls/de_DE.nls.php
78 /var/www/html/cmsms/lib/classes/class.CmsNls.php
79 /var/www/html/cmsms/lib/nls/en_US.nls.php
80 /var/www/html/cmsms/lib/classes/class.Events.php
81 /var/www/html/cmsms/lib/classes/class.CmsLayoutTemplate.php
82 /var/www/html/cmsms/tmp/templates_c/1d2564fb4117d48c4a4788fdc05bac4cc5af55a3.tpl_top.10.php
83 /var/www/html/cmsms/plugins/function.cms_lang_info.php
84 /var/www/html/cmsms/plugins/function.uploads_url.php
85 /var/www/html/cmsms/plugins/function.title.php
86 /var/www/html/cmsms/plugins/function.cms_selflink.php
87 /var/www/html/cmsms/plugins/function.share_data.php
88 /var/www/html/cmsms/tmp/templates_c/1^f48edbbc04bfde01cbdbfa3ef9dec7c23ab66d68.content.pagedata.php
89 /var/www/html/cmsms/lib/smarty/sysplugins/smarty_internal_filter_handler.php
90 /var/www/html/cmsms/tmp/templates_c/1content_en^62e936251e4799749e89fa9828a0ee7332eb5816.content.content_en.php
91 /var/www/html/cmsms/lib/classes/class.cms_tree_operations.php
92 /var/www/html/cmsms/lib/classes/class.cms_content_tree.php
93 /var/www/html/cmsms/lib/classes/class.cms_tree.php
94 /var/www/html/cmsms/lib/lang/cms_selflink/en_US.php
95 /var/www/html/cmsms/tmp/templates_c/d99cf3aa25268e7ae5585236412acde3dfbfebc9.tpl_body.10.php
96 /var/www/html/cmsms/plugins/function.anchor.php
97 /var/www/html/cmsms/plugins/function.root_url.php
98 /var/www/html/cmsms/plugins/function.sitename.php
99 /var/www/html/cmsms/plugins/function.global_content.php
100 /var/www/html/cmsms/plugins/function.cms_jquery.php
101 /var/www/html/cmsms/lib/classes/class.cms_utils.php
102 /var/www/html/cmsms/modules/Navigator/action.default.php
103 /var/www/html/cmsms/modules/Navigator/lib/class.Nav_utils.php
104 /var/www/html/cmsms/tmp/templates_c/^c57b9d2f578a81d2320a0c971c355eefcf787ce6.cms_template.Simplex Main Navigation.php
105 /var/www/html/cmsms/modules/Search/action.default.php
106 /var/www/html/cmsms/modules/Search/lang/en_US.php
107 /var/www/html/cmsms/lib/classes/internal/module_support/modform.inc.php
108 /var/www/html/cmsms/tmp/templates_c/^1b7993aae547fd0abfae9d9426a4499e23a79651.cms_template.Simplex Search.php
109 /var/www/html/cmsms/tmp/templates_c/1f8b51cce64e8889476b3d8e95a0c448bcaaa6e0.cms_template.Simplex Slideshow.php
110 /var/www/html/cmsms/plugins/modifier.cms_escape.php
111 /var/www/html/cmsms/modules/Navigator/action.breadcrumbs.php
112 /var/www/html/cmsms/lib/classes/class.CmsLayoutTemplateType.php
113 /var/www/html/cmsms/modules/Navigator/lang/en_US.php
114 /var/www/html/cmsms/tmp/templates_c/1c7570b5104d51c91b55f34321a8460292f9fa68.cms_template.Breadcrumbs.php
115 /var/www/html/cmsms/modules/News/action.default.php
116 /var/www/html/cmsms/modules/News/lang/en_US.php
117 /var/www/html/cmsms/modules/News/lib/class.news_ops.php
118 /var/www/html/cmsms/tmp/templates_c/fda763cd477e7ac7540e716e56d042a48142e636.cms_template.Simplex News Summary.php
119 /var/www/html/cmsms/plugins/function.repeat.php
120 /var/www/html/cmsms/lib/smarty/plugins/modifier.date_format.php
121 /var/www/html/cmsms/lib/smarty/plugins/shared.make_timestamp.php
122 /var/www/html/cmsms/tmp/templates_c/^b9a70c7aee91cfc7805c871c3f7b053f71bd72fe.cms_template.Simplex Footer Navigation.php
123 /var/www/html/cmsms/tmp/templates_c/3de2b634adeec980c78e5c6f7700596ee1d12dcc.cms_template.Simplex Footer.php
124 /var/www/html/cmsms/plugins/function.cms_version.php
125 /var/www/html/cmsms/tmp/templates_c/3816413b4868e71aadce5ded6a8df7aecdce56d5.tpl_head.10.php
126 /var/www/html/cmsms/plugins/function.metadata.php
127 /var/www/html/cmsms/plugins/function.cms_stylesheet.php
128 /var/www/html/cmsms/lib/classes/class.CmsLayoutStylesheetQuery.php
129 /var/www/html/cmsms/lib/classes/class.CmsDbQueryBase.php
130 /var/www/html/cmsms/lib/classes/class.CmsLayoutStylesheet.php
131 /var/www/html/cmsms/lib/classes/class.CmsLayoutCollection.php
132 /var/www/html/cmsms/lib/smarty/sysplugins/smarty_internal_utility.php


Es ist erschreckend wenn man feststellen muss das 132 PHP Scripte geladen werden müssen, wenn nur die Startseite aufgerufen wird.
Muss die Templateengine Smarty auch noch compilieren dann sind es sogar 140 Scripte.
Das andere Thema ist die extensive Verwendung von Klassen und autoload.

Autoload wird über spl_autoload initiert da verschiedene Fremdlibs und Programmeinheiten ein eigenes autoload haben.
Das bedeutet - autoload probiert alle Möglichkeiten aus bis ein Treffer erzielt wurde.
Das und die vielen Einzeldateien kosten Zeit.

Auf der anderen Seite wird auch ersichtlich das die Abarbeitung von Code via Klassen für jeden Kleinkram nicht vorteilhaft ist, was Geschwindigkeit betrifft.
Und offenbar wird beim Einsatz zahlreicher Klassen auch über das Zeil einer guten Wartungsfähigkeit hinaus geschossen.

Und natürlich - manche Dinge sind auch hier einfach jämmerlich ausgeführt wie z.B. die Navigationsaufbereitung.

Jämmerlich ist auch die Nutzung von Smarty über einen eigenen Hack was zur Folge hat das Smarty in der aktuellen Version darüber nicht arbeiten kann.

Im Grunde hat sich bei diesen vorher auch schon vorhandenen Schwächen mit der V2 nichts geändert - ich sehe keine Vorteile für den Anwender.

Dienstag, 8. September 2015

Cmsmadesimple V2

Nun - die fertige Version ist heute erschienen.

1. Es wird eine total veraltete Smartyversion verwendet.
2. Es wird eine veraltete Jquery-Version verwendet (1.11.1 statt 1.11.3
3. Es wird eine veraltete Jquery UI Version verwendet (1.10.4 statt 1.11.4
4. Obwohl die paar Fehler bekannt da gepostet (ja sogar mit Bild und Quelltext) ist die Version nicht für PHP 7 geeignet und diese PHP Version steht vor der Haustür
5. Von der hervorgehobenen Speedverbesserung ist rein nichts zu bemerken - sie ist nicht anders als die der letzten 1 er Serie siehe Ergebnis.
Das Ergebnis wurde rein lokal auf einem High Speed Server mit SSD Platten  ermittelt:

 ab -kc 100 -t 30 http://localhost/cmsms/index.php
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Finished 1762 requests


Server Software:        Apache/2.4.10
Server Hostname:        localhost
Server Port:            80

Document Path:          /cmsms/index.php
Document Length:        19757 bytes

Concurrency Level:      100
Time taken for tests:   30.007 seconds
Complete requests:      1762
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      35643498 bytes
HTML transferred:       34811834 bytes
Requests per second:    58.72 [#/sec] (mean)
Time per request:       1703.027 [ms] (mean)
Time per request:       17.030 [ms] (mean, across all concurrent requests)
Transfer rate:          1159.99 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   1.6      0       9
Processing:   158 1664 267.1   1664    2452
Waiting:      155 1647 264.7   1646    2435
Total:        164 1665 266.1   1664    2452

Percentage of the requests served within a certain time (ms)
  50%   1664
  66%   1714
  75%   1763
  80%   1799
  90%   1909
  95%   2024
  98%   2226
  99%   2337
 100%   2452 (longest request)

58,72 Request pro Sekunde ist da viel zu wenig und eine Reaktionszeit von über 1,6 Sekunden bei der Hälfte der Anforderungen - das  ist weit mehr als ein möglicher Besucher warten wird - der erwartet Reaktionszeiten von unter 1 Sekunde.

Auf realen Servern kommt da nur ein Bruchteil dabei heraus.

Auch diese Version ist NICHT für professionelle Zwecke geeignet.
Eine Verbesserung im Sinne professioneller Verwendbarkeit ist nicht gegeben.

Wegen der alten verwendeten Libs und der nicht Lauffähigkeit unter PHP 7 sollte man großen Abstand davon nehmen.

Die veraltete Smartyversion hat zudem einige Sicherheiotslecks die bei aktuelleren Versionen längst gestopft sind.

Also Finger weg !!