Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Fri, 11 Mar 16 21:10:58 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1662970#m1662970 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1662970#m1662970 <p>Moin!</p> <p>CSS-Files werden manchmal so groß, dass man diese erst <a href="http://www.heise.de/forum/heise-online/News-Kommentare/Microsoft-Edge-mit-schnellster-JavaScript-Engine/Minifizieren/posting-8824049/show/" rel="nofollow noopener noreferrer">minifizieren</a> und dann auch noch <a href="https://wiki.ubuntuusers.de/gzip/" rel="nofollow noopener noreferrer">kuhzippen</a> will. Auch sollen die Browser diese cachen, wozu es ggf. spezielle HTTP-Header braucht.</p> <p>Natürlich wäre es unschön, wenn die Datei bei jedem Abruf minifiziert und gepackt wird ... also werden diese Versionen (und ein Etag für die noch zu schreibende Cache-Optimierung) gespeichert.</p> <p>Das folgende PHP-Skript wird dieses automatisch einrichten. Man muss nur nach einer Veränderung entweder die minifizierte Version (z.B. style.css.min) oder die gezippte Version style.css.min.gz oder die Datei mit dem ETag löschen. Oder aber <code>css_packer.php?pack=style.css&renew=1</code> aufrufen.</p> <p>Erst einmal ein paar Voreinstellungen:</p> <pre><code class="block language-ini"><span class="token comment">## file: php.ini (im gleichen Verzeichnis wie css_packer.php)</span> <span class="token key attr-name">allow_url_fopen</span> <span class="token punctuation">=</span> <span class="token value attr-value">Off</span> </code></pre> <p>Damit man nicht viele Seiten ändern muss ist dieses für den Apache hoffentlich hilfreich:</p> <pre><code class="block">## file: .htaccess (im gleichen Verzeichnis wie css_packer.php) RewriteEngine on RewriteRule ^(.*\.css)$ css_packer.php?pack=$1 </code></pre> <p>Eine Readme fürs Erinnern:</p> <pre><code class="block language-txt">## file: css_packer.readme (im gleichen Verzeichnis wie css_packer.php) Benutzung: Rufen Sie dieses Skript statt der CSS-Datei auf. Automatisch geht dieses (in vielen aber nicht allen Fällen) mit einer Umleitung in einer Datei .htaccess : Beispiel: RewriteEngine on RewriteRule ^(.*\.css)$ css_packer.php?pack=$1 Es ist aber möglich, css_packer.php?pack=style.css direkt anzugeben. Hinweise: Die packcss.php und die .htaccess muss im gleichen Verzeichnis wie die CSS-Datei sein! Die CSS-Datei MUSS die Endung '.css' haben! Bei einem Aufruf mit css_packer.php?renew=1&pack=style.css werden die gepackten und gezippten Dateien und das Etag-File erneuert. Es muss nur die wirklich menschenlesbare Version manuell gepflegt werden... </code></pre> <p>Und dann das Skript:</p> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token comment">/** file: css_packer.php Autor: Jörg Reinholz, www.fastix.org Lizenz: GPL 2.0 http://www.gnu.org/licenses/old-licenses/gpl-2.0.de.html **/</span> <span class="token comment">/** Konfiguration: Wie lange soll der Cache gültig sein? **/</span> <span class="token function">define</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'CACHE_DAYS'</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">#Tage</span> <span class="token comment">/** Programm: **/</span> <span class="token function">define</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'MINIMAL_CSS'</span> <span class="token punctuation">,</span> <span class="token string single-quoted-string">'./'</span> <span class="token operator">.</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'.min'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">define</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'MINIMAL_CSS_ZIPPED'</span> <span class="token punctuation">,</span> <span class="token string single-quoted-string">'./'</span> <span class="token operator">.</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'.min.gz'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">define</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'ETAG'</span> <span class="token punctuation">,</span> <span class="token string single-quoted-string">'./'</span> <span class="token operator">.</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'.etag'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">error_log</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Fehler: Keine Datei übergeben. (?pack=)'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Fehler: Keine Datei übergeben.\n\n"</span><span class="token punctuation">;</span> <span class="token keyword">include</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'pack_css.readme'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">exit</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token function">substr</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">4</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token string single-quoted-string">'.css'</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">error_log</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Hinweis: Netter Versuch: (?pack='</span> <span class="token operator">.</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">')'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Netter Versuch!\n\n"</span><span class="token punctuation">;</span> <span class="token keyword">include</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'pack_css.readme'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">exit</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token function">strpos</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'..'</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">error_log</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Hinweis: Netter Versuch. (?pack='</span> <span class="token operator">.</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token operator">.</span><span class="token string single-quoted-string">')'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Netter Versuch!\n\n"</span><span class="token punctuation">;</span> <span class="token keyword">include</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'pack_css.readme'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">exit</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token string single-quoted-string">'./'</span> <span class="token operator">.</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span> <span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'renew'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'renew'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Datei(en) nicht vorhanden? Egal!</span> @<span class="token function">unlink</span><span class="token punctuation">(</span><span class="token constant">MINIMAL_CSS</span><span class="token punctuation">)</span><span class="token punctuation">;</span> @<span class="token function">unlink</span><span class="token punctuation">(</span><span class="token constant">MINIMAL_CSS_ZIPPED</span><span class="token punctuation">)</span><span class="token punctuation">;</span> @<span class="token function">unlink</span><span class="token punctuation">(</span><span class="token constant">ETAG</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span> <span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'HTTP_ACCEPT_ENCODING'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'HTTP_ACCEPT_ENCODING'</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span><span class="token operator">!</span> <span class="token function">is_file</span><span class="token punctuation">(</span><span class="token constant">MINIMAL_CSS</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">or</span> <span class="token punctuation">(</span><span class="token operator">!</span> <span class="token function">is_file</span><span class="token punctuation">(</span><span class="token constant">MINIMAL_CSS_ZIPPED</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">or</span> <span class="token punctuation">(</span><span class="token operator">!</span> <span class="token function">is_file</span><span class="token punctuation">(</span><span class="token constant">ETAG</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span> <span class="token function">is_file</span> <span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token operator">!</span> <span class="token function">is_readable</span> <span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">die</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Fehler: Die CSS-Datei '</span> <span class="token operator">.</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' gibt es nicht.'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span> <span class="token function">is_writable</span> <span class="token punctuation">(</span><span class="token constant">__DIR__</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">error_log</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'In das Verzeichnis '</span> <span class="token operator">.</span> <span class="token constant">__DIR__</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' kann nicht geschrieben werden.'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">die</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Fehler: In das Verzeichnis kann nicht geschrieben werden.'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">umask</span><span class="token punctuation">(</span><span class="token number">0022</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$file</span> <span class="token operator">=</span> <span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$file</span> <span class="token operator">=</span> <span class="token function">str_replace</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"\n"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"\r"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"\t"</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token string single-quoted-string">' '</span><span class="token punctuation">,</span><span class="token variable">$file</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$file</span> <span class="token operator">=</span> <span class="token function">preg_replace</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/ {2, }/'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">' '</span><span class="token punctuation">,</span> <span class="token variable">$file</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$file</span> <span class="token operator">=</span> <span class="token function">str_replace</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">', '</span><span class="token punctuation">,</span><span class="token string single-quoted-string">' ,'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'; '</span><span class="token punctuation">,</span><span class="token string single-quoted-string">' ;'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'{ '</span><span class="token punctuation">,</span><span class="token string single-quoted-string">' {'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'} '</span><span class="token punctuation">,</span><span class="token string single-quoted-string">' }'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">': '</span><span class="token punctuation">,</span><span class="token string single-quoted-string">' :'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">','</span><span class="token punctuation">,</span><span class="token string single-quoted-string">','</span><span class="token punctuation">,</span><span class="token string single-quoted-string">';'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">';'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'{'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'{'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'}'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'}'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">':'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">':'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$file</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">file_put_contents</span><span class="token punctuation">(</span><span class="token constant">MINIMAL_CSS</span><span class="token punctuation">,</span> <span class="token variable">$file</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">file_put_contents</span><span class="token punctuation">(</span><span class="token constant">MINIMAL_CSS_ZIPPED</span><span class="token punctuation">,</span> <span class="token function">gzencode</span><span class="token punctuation">(</span><span class="token variable">$file</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">file_put_contents</span><span class="token punctuation">(</span><span class="token constant">ETAG</span><span class="token punctuation">,</span> <span class="token function">dechex</span><span class="token punctuation">(</span><span class="token function">crc32</span><span class="token punctuation">(</span><span class="token variable">$file</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$max_age</span> <span class="token operator">=</span> <span class="token constant">CACHE_DAYS</span> <span class="token operator">*</span> <span class="token number">86400</span><span class="token punctuation">;</span> <span class="token variable">$exp_gmt</span> <span class="token operator">=</span> <span class="token function">gmdate</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"D, d M Y H:i:s"</span><span class="token punctuation">,</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token variable">$max_age</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' GMT'</span><span class="token punctuation">;</span> <span class="token variable">$mod_gmt</span> <span class="token operator">=</span> <span class="token function">gmdate</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"D, d M Y H:i:s"</span><span class="token punctuation">,</span> <span class="token function">filemtime</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' GMT'</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant boolean">false</span><span class="token operator">===</span><span class="token function">strpos</span><span class="token punctuation">(</span><span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'HTTP_ACCEPT_ENCODING'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'gzip'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'Content-Type:text/css'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"Expires:<span class="token interpolation"><span class="token variable">$exp_gmt</span></span>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'Cache-Control:public'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"Cache-Control: max-age=<span class="token interpolation"><span class="token variable">$max_age</span></span>, public"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"Last-Modified:<span class="token interpolation"><span class="token variable">$mod_gmt</span></span>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'Etag: "'</span> <span class="token operator">.</span> <span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token constant">ETAG</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'"'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">readfile</span> <span class="token punctuation">(</span><span class="token constant">MINIMAL_CSS</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">exit</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'Content-Type:text/css'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"Expires:<span class="token interpolation"><span class="token variable">$exp_gmt</span></span>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'Cache-Control:public'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"Cache-Control: max-age=<span class="token interpolation"><span class="token variable">$max_age</span></span>, public"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"Last-Modified:<span class="token interpolation"><span class="token variable">$mod_gmt</span></span>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'Etag: "'</span> <span class="token operator">.</span> <span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token constant">ETAG</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'"'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'Vary:Accept-Encoding'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'Content-Encoding:gzip'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">readfile</span> <span class="token punctuation">(</span><span class="token constant">MINIMAL_CSS_ZIPPED</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">exit</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </span></code></pre> <p>Falls sich jemand aufregen will: Das ist meine Schönschrift. Und <a href="http://www.fastix.org/skins/fastix/css/css.css" rel="nofollow noopener noreferrer">das Skript läuft</a> auf <a href="http://www.fastix.org" rel="nofollow noopener noreferrer">fastix.org</a>.</p> <p>Jörg Reinholz</p> (Download-Link) Fri, 11 Mar 16 23:31:44 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1662974#m1662974 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1662974#m1662974 <p>Moin!</p> <p>Download aller Dateien:</p> <p><a href="http://fastix.org/r/css_packer.tar.gz" rel="nofollow noopener noreferrer">http://fastix.org/r/css_packer.tar.gz</a></p> <p>Jörg Reinholz</p> Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Sat, 12 Mar 16 03:14:16 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1662976#m1662976 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1662976#m1662976 <p>Servus!</p> <p>Vielen Dank, habe es im Wiki verlinkt: <a href="http://wiki.selfhtml.org/wiki/PHP/Anwendung_und_Praxis" rel="nofollow noopener noreferrer">PHP/Anwendung und Praxis#Forum-Threads</a></p> <p>Herzliche Grüße</p> <p>Matthias Scharwies</p> <div class="signature">-- <br> Es gibt viel zu tun - packen wir's an: * <a href="http://wiki.selfhtml.org/wiki/Kategorie:ToDo" rel="nofollow noopener noreferrer">ToDo-Liste</a> * <a href="http://wiki.selfhtml.org/wiki/Spezial:Gew%C3%BCnschte_Seiten" rel="nofollow noopener noreferrer">gewünschte Seiten</a> </div> Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Sat, 12 Mar 16 11:41:15 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1662997#m1662997 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1662997#m1662997 <blockquote> <p>CSS-Files werden manchmal so groß, dass man diese erst <a href="http://www.heise.de/forum/heise-online/News-Kommentare/Microsoft-Edge-mit-schnellster-JavaScript-Engine/Minifizieren/posting-8824049/show/" rel="nofollow noopener noreferrer">minifizieren</a> und dann auch noch <a href="https://wiki.ubuntuusers.de/gzip/" rel="nofollow noopener noreferrer">kuhzippen</a> will. Auch sollen die Browser diese cachen, wozu es ggf. spezielle HTTP-Header braucht.</p> </blockquote> <p>Warum nur CSS und nicht auch JavaScript?</p> <p>IMHO ist die Minifizierung einzelner Dateien eher ein Placebo. Komprimierung hingegen ist natürlich hilfreich. Ob minifiziert oder nicht minifiziert komprimiert wird, macht keinen nennenswerten Unterschied. OK, der Client muss dann weniger parsen und Google Pagespeed findet das auch toll. Vernünftige HTTP-Header sind auch sinnvoll. Nur stellt sich dann die Frage, ob man PHP dafür braucht. Sowohl die Komprimierung, wie auch die Header kann der Webserver. Wenn nötig, via htaccess.</p> <p>Bleibt also die Minifizierung als einziger Mehrwert. Da bin ich skeptisch, ob man da für die Minifizierung einzelner Files PHP anwerfen sollte.</p> <p>Die Nummer lohnt sich m.E. erst, wenn man einzelne Ressourcen zusammenfasst und damit Requests einspart. "minify.php?/css/1.css,/css/2.css", bzw. "minify.php?/js/1.js,/js/2.js". Das alles gibt es schon ziemlich ausgereift:</p> <p><a href="https://github.com/mrclay/minify" rel="noopener noreferrer">https://github.com/mrclay/minify</a></p> (Download-Link) Sat, 12 Mar 16 10:17:18 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1662987#m1662987 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1662987#m1662987 <p>Moin!</p> <p>Angeregt durch das Lob habe ich eine Version 2 herausgebracht, die jetzt auch den Status 304 (not modified) beherrscht <a href="https://de.wikipedia.org/wiki/HTTP_ETag" rel="nofollow noopener noreferrer">und also bei übereinstimmenden ETag nicht mal versucht, die Daten zu senden</a>.</p> <p>Die Adresse bleibt die alte:</p> <blockquote> <p><a href="http://fastix.org/r/css_packer.tar.gz" rel="nofollow noopener noreferrer">http://fastix.org/r/css_packer.tar.gz</a></p> </blockquote> <p>Es bleibt auch (mit Kommentaren und jetzt besser aufgeräumten, menschenlesbaren Code) beim schlanken "UHU" ("unter-100-Zeiler"):</p> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token comment">/** css_packer.php Version 2.0.2 Autor: Jörg Reinholz, www.fastix.org Lizenz: GPL 2.0 http://www.gnu.org/licenses/old-licenses/gpl-2.0.de.html **/</span> <span class="token comment">/* Konfiguration: */</span> <span class="token comment"># Wie lange soll der Cache gültig sein?</span> <span class="token function">define</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'CACHE_DAYS'</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">#Tage</span> <span class="token comment">/* Programm: */</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">error_log</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Fehler: Keine Datei übergeben. (?pack=)'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Fehler: Keine Datei übergeben.\n\n"</span><span class="token punctuation">;</span> <span class="token keyword">include</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'css_packer.readme'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">exit</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/* Sicherheits-Voodoo: */</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'./'</span> <span class="token operator">.</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token function">define</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'MINIMAL_CSS'</span> <span class="token punctuation">,</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'.min'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">define</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'MINIMAL_CSS_ZIPPED'</span> <span class="token punctuation">,</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'.min.gz'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">define</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'ETAG'</span> <span class="token punctuation">,</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'.etag'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token function">substr</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">4</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token string single-quoted-string">'.css'</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">error_log</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Hinweis: Netter Versuch: (?pack='</span> <span class="token operator">.</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">')'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Netter Versuch!\n\n"</span><span class="token punctuation">;</span> <span class="token keyword">include</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'css_packer.readme'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">exit</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token function">strpos</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'..'</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">error_log</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Hinweis: Netter Versuch. (?pack='</span> <span class="token operator">.</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">')'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Netter Versuch!\n\n"</span><span class="token punctuation">;</span> <span class="token keyword">include</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'css_packer.readme'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">exit</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span> <span class="token function">is_file</span><span class="token punctuation">(</span><span class="token constant">MINIMAL_CSS</span><span class="token punctuation">)</span> <span class="token keyword">or</span> <span class="token operator">!</span> <span class="token function">is_file</span><span class="token punctuation">(</span><span class="token constant">MINIMAL_CSS_ZIPPED</span><span class="token punctuation">)</span> <span class="token keyword">or</span> <span class="token operator">!</span> <span class="token function">is_file</span><span class="token punctuation">(</span><span class="token constant">ETAG</span><span class="token punctuation">)</span> <span class="token keyword">or</span> <span class="token operator">!</span> <span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'renew'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span> <span class="token function">is_file</span> <span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token operator">!</span> <span class="token function">is_readable</span> <span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">error_log</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'Fehler: Die CSS-Datei '</span> <span class="token operator">.</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' gibt es nicht oder ist nicht lesbar.'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">'Fehler: Die CSS-Datei gibt es nicht oder ist nicht lesbar.'</span><span class="token punctuation">;</span> <span class="token keyword">exit</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span> <span class="token function">is_writable</span> <span class="token punctuation">(</span><span class="token constant">__DIR__</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">error_log</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'In das Verzeichnis '</span> <span class="token operator">.</span> <span class="token constant">__DIR__</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' kann nicht geschrieben werden.'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">'Fehler: In das Verzeichnis kann nicht geschrieben werden.'</span><span class="token punctuation">;</span> <span class="token keyword">exit</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> @<span class="token function">unlink</span><span class="token punctuation">(</span><span class="token constant">MINIMAL_CSS</span><span class="token punctuation">)</span><span class="token punctuation">;</span> @<span class="token function">unlink</span><span class="token punctuation">(</span><span class="token constant">MINIMAL_CSS_ZIPPED</span><span class="token punctuation">)</span><span class="token punctuation">;</span> @<span class="token function">unlink</span><span class="token punctuation">(</span><span class="token constant">ETAG</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token function">str_replace</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"\n"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"\r"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"\t"</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token string single-quoted-string">' '</span><span class="token punctuation">,</span><span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token function">preg_replace</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/ {2,}/'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">' '</span><span class="token punctuation">,</span> <span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token function">str_replace</span><span class="token punctuation">(</span> <span class="token keyword">array</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">', '</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">' ,'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'; '</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">' ;'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'{ '</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">' {'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'} '</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">' }'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">': '</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">' :'</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">','</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">','</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">';'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">';'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'{'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'{'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'}'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'}'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">':'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">':'</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$data</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">umask</span><span class="token punctuation">(</span><span class="token number">0022</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">file_put_contents</span><span class="token punctuation">(</span><span class="token constant">MINIMAL_CSS</span><span class="token punctuation">,</span> <span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$data_gz</span> <span class="token operator">=</span> <span class="token function">gzencode</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">file_put_contents</span><span class="token punctuation">(</span><span class="token constant">MINIMAL_CSS_ZIPPED</span><span class="token punctuation">,</span> <span class="token variable">$data_gz</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$etag</span> <span class="token operator">=</span> <span class="token function">dechex</span><span class="token punctuation">(</span><span class="token function">crc32</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">file_put_contents</span><span class="token punctuation">(</span><span class="token constant">ETAG</span><span class="token punctuation">,</span> <span class="token variable">$etag</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$max_age</span> <span class="token operator">=</span> <span class="token constant">CACHE_DAYS</span> <span class="token operator">*</span> <span class="token number">86400</span><span class="token punctuation">;</span> <span class="token variable">$exp_gmt</span> <span class="token operator">=</span> <span class="token function">gmdate</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"D, d M Y H:i:s"</span><span class="token punctuation">,</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token variable">$max_age</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' GMT'</span><span class="token punctuation">;</span> <span class="token variable">$mod_gmt</span> <span class="token operator">=</span> <span class="token function">gmdate</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"D, d M Y H:i:s"</span><span class="token punctuation">,</span> <span class="token function">filemtime</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pack'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' GMT'</span><span class="token punctuation">;</span> <span class="token comment">/* Senden */</span> <span class="token variable">$etag</span> <span class="token operator">=</span> <span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token constant">ETAG</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"Etag:<span class="token interpolation"><span class="token variable">$etag</span></span>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token keyword">empty</span> <span class="token punctuation">(</span> <span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'HTTP_IF_NONE_MATCH'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'HTTP_IF_NONE_MATCH'</span><span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token variable">$etag</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'Content-Type:text/css'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"Expires:<span class="token interpolation"><span class="token variable">$exp_gmt</span></span>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"Cache-Control:max-age=<span class="token interpolation"><span class="token variable">$max_age</span></span>, public"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"Last-Modified:<span class="token interpolation"><span class="token variable">$mod_gmt</span></span>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">/* gezippt ? */</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span> <span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'HTTP_ACCEPT_ENCODING'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'HTTP_ACCEPT_ENCODING'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant boolean">false</span> <span class="token operator">===</span> <span class="token function">strpos</span><span class="token punctuation">(</span><span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'HTTP_ACCEPT_ENCODING'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'gzip'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token function">readfile</span><span class="token punctuation">(</span><span class="token constant">MINIMAL_CSS</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><span class="token keyword">echo</span> <span class="token variable">$data</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'Vary:Accept-Encoding'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'Content-Encoding:gzip'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$data_gz</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token function">readfile</span><span class="token punctuation">(</span><span class="token constant">MINIMAL_CSS_ZIPPED</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><span class="token keyword">echo</span> <span class="token variable">$data_gz</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">header</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Status: 304'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </span></code></pre> <p>Jörg Reinholz</p> Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Sat, 12 Mar 16 11:59:36 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1662999#m1662999 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1662999#m1662999 <p>Moin!</p> <blockquote> <p>Sowohl die Komprimierung, wie auch die Header kann der Webserver. Wenn nötig, via htaccess.</p> </blockquote> <p>Äh. Ja. Aber das führt dazu, dass der Webserver selbst komprimieren muss. Das bedeutet ein Absinken der Netzlast, welches durch einen Anstieg der Prozessorlast erkauft wird. Zudem berechnet der Apache den Etag merkwürdigerweise (per default) auch aus dem Inode der Datei. Das das Minifizieren nicht wirklich viel bringt weiß ich übrigens auch. Wollen aber trotzdem viele haben...</p> <p>Mein Konzept ist es, die Komprimierung und das Berechnen des Etag nur einmal durchzuführen.</p> <blockquote> <p>Warum nur CSS und nicht auch JavaScript?</p> </blockquote> <p>Nun, für Javascript (und also auch in HTML enthaltenes JS habe ich derzeit noch keine Methode gefunden um es in purem PHP ohne großen Aufwand(!) funktionssicher(!) zu minifizieren. Aber generell ist das Skript natürlich anpass- und verwendbar. So könnte man das Minifizieren weglassen...</p> <p>(Nicht gestellte Frage: Und die Webseiten selbst?)</p> <p><a href="http://www.fastix.org/PHP-+Einfaches+Caching+fuer+Webprojekte.htm" rel="nofollow noopener noreferrer">Eine ähnliche Methode für das "Einfaches Caching für Webprojekte" verwende ich seit vielen Jahren</a>.</p> <p>Jörg Reinholz</p> Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Sat, 12 Mar 16 12:02:24 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663000#m1663000 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663000#m1663000 <blockquote> <p>Nun, für Javascript (und also auch in HTML enthaltenes JS habe ich derzeit noch keine Methode gefunden um es in purem PHP ohne großen Aufwand(!) funktionssicher(!) zu minifizieren.</p> </blockquote> <p><a href="https://github.com/pagespeed/mod_pagespeed" rel="noopener noreferrer">https://github.com/pagespeed/mod_pagespeed</a></p> Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Sat, 12 Mar 16 12:03:49 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663001#m1663001 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663001#m1663001 <blockquote> <p>(Nicht gestellte Frage: Und die Webseiten selbst?)</p> </blockquote> <p><a href="https://www.varnish-cache.org/" rel="nofollow noopener noreferrer">https://www.varnish-cache.org/</a></p> Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Sat, 12 Mar 16 12:23:51 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663002#m1663002 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663002#m1663002 <p>Tach,</p> <blockquote> <p>Äh. Ja. Aber das führt dazu, dass der Webserver selbst komprimieren muss. Das bedeutet ein Absinken der Netzlast, welches durch einen Anstieg der Prozessorlast erkauft wird.</p> </blockquote> <p>wenn das ein relevanter Faktor ist, hat man ganz andere Probleme und kann vermutlich bereits mit Lastspitzen nicht mehr umgehen.</p> <p>mfg<br> Woodfighter</p> Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Sat, 12 Mar 16 12:55:07 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663007#m1663007 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663007#m1663007 <p>Moin!</p> <blockquote> <blockquote> <p>(Nicht gestellte Frage: Und die Webseiten selbst?)</p> </blockquote> <p><a href="https://www.varnish-cache.org/" rel="nofollow noopener noreferrer">https://www.varnish-cache.org/</a></p> </blockquote> <p>1,9 MB tar.gz. Muss kompiliert werden - was nicht jeder kann und von denen, die es können, dann längst nicht jeder auf dem Webserver installieren darf. Ich schrieb aber: "<a href="https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1662999#m1662999" rel="noopener noreferrer">in purem PHP ohne großen Aufwand</a>".</p> <p>Einen Proxy wie Squid "vor den Webserver stellen" kann ich auch ...</p> <blockquote> <p>mod_pagespeed</p> </blockquote> <p>... is an open-source Apache module (ähnlich wie oben) und also auch keine Lösung unter den oben genannten Prämissen.</p> <p>Jörg Reinholz</p> Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Sat, 12 Mar 16 12:45:22 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663004#m1663004 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663004#m1663004 <p>Moin!</p> <blockquote> <blockquote> <p>Absinken der Netzlast, welches durch einen Anstieg der Prozessorlast erkauft</p> </blockquote> </blockquote> <blockquote> <p>wenn das ein relevanter Faktor ist, hat man ganz andere Probleme und kann vermutlich bereits mit Lastspitzen nicht mehr umgehen.</p> </blockquote> <p>Das ist zu kurz gegriffen. Man kann nämlich auch Atomkraftwerke betreiben statt Energie zu sparen.</p> <p>Jörg Reinholz</p> Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Sat, 12 Mar 16 12:52:05 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663006#m1663006 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663006#m1663006 <p>Tach,</p> <blockquote> <p>Das ist zu kurz gegriffen. Man kann nämlich auch Atomkraftwerke betreiben statt Energie zu sparen.</p> </blockquote> <p>dann musst du jetzt darlegen, dass dein PHP-Script beim Aufruf weniger Energie verbraucht, als den Webserver die Komprimierung übernehmen zu lassen und wenn das so wäre (was ich durchaus anzweifeln würde), wäre es vermutlich immer noch sinnvoller den Webserver (sofern er die komprimierten Dateien nicht eh schon cached), die einmalig komprimierten Dateien ausliefern zu lassen (siehe z.B. <a href="https://httpd.apache.org/docs/current/mod/mod_deflate.html#precompressed" rel="nofollow noopener noreferrer">https://httpd.apache.org/docs/current/mod/mod_deflate.html#precompressed</a>).</p> <p>mfg<br> Woodfighter</p> Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Sat, 12 Mar 16 13:24:31 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663011#m1663011 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663011#m1663011 <p>Moin!</p> <blockquote> <blockquote> <p>Atomkraftwerke vers. Energiesparen</p> </blockquote> </blockquote> <blockquote> <p>wäre es vermutlich immer noch sinnvoller den Webserver (sofern er die komprimierten Dateien nicht eh schon cached), die einmalig komprimierten Dateien ausliefern zu lassen (siehe z.B. <a href="https://httpd.apache.org/docs/current/mod/mod_deflate.html#precompressed" rel="nofollow noopener noreferrer">https://httpd.apache.org/docs/current/mod/mod_deflate.html#precompressed</a>).</p> <p>mfg<br> Woodfighter</p> </blockquote> <blockquote> <p>Since mod_deflate re-compresses content each time a request is made, some performance benefit can be derived by pre-compressing the content and telling mod_deflate to serve them without re-compressing them. This may be accomplished using a configuration like the following:</p> </blockquote> <p>Übersetzt:</p> <blockquote> <p>Da mod_deflate jedes Mal wenn ein Request erfolgt die Inhalte erneut komprimiert können einige Leistungsvorteil durch Vorkomprimierung und die Konfiguration von mod_deflate erreicht werden - in dem vermieden wird, diese erneut zu komprimieren. Dies kann unter Verwendung einer Konfiguration wie folgt erreicht werden.</p> </blockquote> <p>Aus der Dokumentation:</p> <pre><code class="block"> RewriteCond "%{HTTP:Accept-encoding}" "gzip" RewriteCond "%{REQUEST_FILENAME}\.gz" -s RewriteRule "^(.*)\.css" "$1\.css\.gz" [QSA] </code></pre> <p><strong>Für Menschen, die <em>"English4poors"</em> nicht können, übersetzt:</strong></p> <blockquote> <p>Wenn der Useragent meldet, dass er gzip kann, dann wird bei einem Request nach einer css-Datei geschaut, ob es deren gezippte Version schon gibt - und (wenn beides passt) - die gezippte Version ausgeliefert. Was hier nicht steht, ist, dass auch der Etag noch vom Apache berechnet werden muss.</p> </blockquote> <p>~Genau das~ (Mist: Durchstreichen geht nicht.) <strong>Ähnliches/Etwas wichtiges mehr macht mein Skript!</strong></p> <p>Wenn der Useragent meldet, dass er gzip kann, dann wird bei einem Request nach einer css-Datei geschaut, ob es deren gezippte Version schon gibt - und (wenn beides passt) - die gezippte Version ausgeliefert. Gibt es die gezippte Version nicht, dann wird diese erzeugt und ausgeliefert. Kann der useragent (angeblich) kein gzip, dann gibt es nur die minifizierte Version. Auch der Etag wird "vorgespeichert".</p> <p><strong>Da ist dann doch ein kleiner Unterschied - oder?</strong></p> <p>Für mein Skript reicht es, das CSS-File zu verändern und eine der gezippten Dateien oder das .etag - File zu löschen. Der Rest wird "einfach, schnell und leise" beim nächsten Abruf erledigt.</p> <p>Jetzt stell Dir mal einen Windows-Benutzer vor, der ohne Putty & Co. zu kennen oder einen ssh-Zugang zu haben (was mir als unbenutzbar gilt, aber viele Hoster noch immer so verkaufen), mod_gzip benutzen soll, also die Komprimate selbst erzeugen und ablegen muss.</p> <p>Jörg Reinholz</p> Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Sat, 12 Mar 16 13:40:44 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663014#m1663014 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663014#m1663014 <p>Tach,</p> <blockquote> <p>~Genau das~ (Mist: Durchstreichen geht nicht.) <strong>Ähnliches/Etwas wichtiges mehr macht mein Skript!</strong></p> <p>Wenn der Useragent meldet, dass er gzip kann, dann wird bei einem Request nach einer css-Datei geschaut, ob es deren gezippte Version schon gibt - und (wenn beides passt) - die gezippte Version ausgeliefert. Gibt es die gezippte Version nicht, dann wird diese erzeugt und ausgeliefert. Kann der useragent (angeblich) kein gzip, dann gibt es nur die minifizierte Version. Auch der Etag wird "vorgespeichert".</p> <p><strong>Da ist dann doch ein kleiner Unterschied - oder?</strong></p> </blockquote> <p>ja, aber dein Script ist trotzdem eine Nischenlösung und die (vermutlich) besseren Lösungen sollten auch erwähnt werden, oder? Mindestens sollten vermutlich falsche Aussage, wie dein Script wäre <a href="https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663004#m1663004" rel="noopener noreferrer">energiesparender</a> entkräftet werden.</p> <p>mfg<br> Woodfighter</p> Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Sat, 12 Mar 16 14:00:31 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663016#m1663016 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663016#m1663016 <p>Hallo Jörg Reinholz,</p> <blockquote> <p>~Genau das~ (Mist: Durchstreichen geht nicht.) <strong>Ähnliches/Etwas wichtiges mehr macht mein Skript!</strong></p> </blockquote> <p><em>Durchstreichen geht.</em></p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini) </div> Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Sat, 12 Mar 16 14:56:49 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663020#m1663020 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663020#m1663020 <p>Moin!</p> <p>Mindestens sollten vermutlich falsche Aussage, wie dein Script wäre <a href="https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663004#m1663004" rel="noopener noreferrer">energiesparender</a> entkräftet werden.</p> <p>Nun ja. Mit "vermutlich falsche Aussage" lässt Du ja selbst offen, dass es Dir nicht ganz klar ist ob diese Methode gegenüber allen vorstellbaren "energetisch teurer" ist. Freilich ist die von Dir vorgestellte, "native" Methode mit dem manuellen Erzeugen der Komprimate die energiesparenste. Aber wer verzichtet denn auf den Staubsauger, räumt die Wohnung aus und klopft wie "anno früher" den Teppich?</p> <p>Jörg Reinholz</p> Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Sat, 12 Mar 16 14:52:22 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663019#m1663019 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663019#m1663019 <p>Moin!</p> <blockquote> <p><em>Durchstreichen geht.</em></p> </blockquote> <p>Aha.</p> <p>Jörg Reinholz</p> Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Sat, 12 Mar 16 15:08:37 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663023#m1663023 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663023#m1663023 <p>Tach,</p> <blockquote> <p>Nun ja. Mit "vermutlich falsche Aussage" lässt Du ja selbst offen, dass es Dir nicht ganz klar ist ob diese Methode gegenüber allen vorstellbaren "energetisch teurer" ist.</p> </blockquote> <p>ja, aber die Aussage war deine, und damit ach die Nachweispflicht.</p> <blockquote> <p>Freilich ist die von Dir vorgestellte, "native" Methode mit dem manuellen Erzeugen der Komprimate die energiesparenste. Aber wer verzichtet denn auf den Staubsauger, räumt die Wohnung aus und klopft wie "anno früher" den Teppich?</p> </blockquote> <p>Das Energie-Argument war deins nicht meins, und ich würde nicht auf die Idee kommen, das komprimieren nicht zu automatisieren.</p> <p>mfg<br> Woodfighter</p> Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Sat, 12 Mar 16 15:35:14 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663024#m1663024 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663024#m1663024 <p>Moin!</p> <blockquote> <p>ja, aber die Aussage war deine, und damit ach die Nachweispflicht.</p> </blockquote> <p>Nein. Ich hatte nicht ausgesagt, dass die Methode energiesparend ist. Das ich derlei damit gemeint haben <em>könnte</em> ist Deine Mutmaßung. Es handelte sich um eine Antwort auf Deine Bemerkung <em>"wenn das ein relevanter Faktor ist, hat man ganz andere Probleme und kann vermutlich bereits mit Lastspitzen nicht mehr umgehen."</em> die auf meinen Einwurf <em>"Aber das führt dazu, dass der Webserver selbst komprimieren muss. Das bedeutet ein Absinken der <strong>Netzlast</strong>, welches durch einen Anstieg der <strong>Prozessorlast</strong> erkauft wird."</em> hin erfolgte.</p> <p>Verstehst Du, dass es gar nicht um Energie an sich, sondern um einen Vergleich mit der Aussage ging, dass man mit Ressourcen (hier eher bezogen auf Netz- und Prozessorlast) doch bitte stets sparsam umgehen solle?</p> <p>Jörg Reinholz</p> Das Skript zum Sonntag; Minifiziertes und gezipptes CSS senden Sat, 12 Mar 16 19:06:40 Z https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663042#m1663042 https://forum.selfhtml.org/self/2016/mar/11/das-skript-zum-sonntag-minifiziertes-und-gezipptes-css-senden/1663042#m1663042 <p>Tach,</p> <blockquote> <p>Verstehst Du, dass es gar nicht um Energie an sich, sondern um einen Vergleich mit der Aussage ging, dass man mit Ressourcen (hier eher bezogen auf Netz- und Prozessorlast) doch bitte stets sparsam umgehen solle?</p> </blockquote> <p>ah sorry, dann habe ich dein Bild zu wörtlich genommen; allerdings glaube ich weiterhin nicht, dass dein Script ressourcenschonender ist als die Alternativen. Und in diesem Falle handelt es sich um eine Ressource, die auf Webservern fast immer im Überfluss vorhanden ist; ich habe im wesentlichen nur reagiert, weil die selbe falsche Argumentation auch gerne in Bezug auf TLS verwendet wird.</p> <p>mfg<br> Woodfighter</p>