Abro, März 2009

PHP Compressor aka "Ihr seid doch bescheuert!"

phpIch treibe mich ja oft auf so offiziellen Seiten meiner Top-Sprachen wie dev.jquery.com und php.net herum. Und es ist schon oft erstaunlich auf welche Dinge Menschen kommen. Will sagen “es ist traurig”. Eines schönen Abends, ich weiss nicht mehr warum und auf welcher Seite genau, durfte ich Zeuge einer Diskussion über das komprimieren von PHP-Quelltext werden. Was bitte? Also es gibt wirklich keinen sinnvollen Anwendungsfall dafür. Leerzeichen interessieren den Interpreter nämlich spätestens seit PHP3 überhaupt nicht mehr.

Das einzige was mir dazu einfällt, ist dass ein großartiger SEO von dem ich wirklich verdammt viel nebenbei lernen durfte, mich beim Projektgespräch inständig darum bat doch bitte nicht die Leerzeichen und Kommentare aus dem Source zu löschen. Hey ein bisschen Spass muss bei der Arbeit sein!

Na also gut, um sich unersetzlich zu machen könnte man natürlich die Sources unlesbar machen. Wenn das überhaupt nötig ist. Seit ich mich jetzt nen Monat lang intensiv mit dem XT-Commerce Source auseinander setzen durfe… ist klar woll. Lange Rede, kurzer Sinn: “Ihr seid doch bescheuert!” – um es mit den Worten meines Sysadmins zu sagen. Denn wer sich dann so was ausdenkt ist entweder noch nicht volljährig, betrunken, oder gehört eingesperrt :

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
$tokens = token_get_all($php);
$cleaned = '';
$lastToken = null;
$tokensThatNeedSpaceAfter = array(
		T_ABSTRACT, T_AS, T_CASE, T_CLASS, T_ECHO, T_EXTENDS, T_FINAL, T_FUNCTION,
		T_IMPLEMENTS, T_INCLUDE, T_INCLUDE_ONCE, T_INSTANCEOF, T_INTERFACE,
		T_LOGICAL_AND, T_LOGICAL_OR, T_LOGICAL_XOR, T_NEW, T_PUBLIC, T_PROTECTED,
		T_REQUIRE, T_REQUIRE_ONCE, T_RETURN, T_RETURN, T_STATIC, T_THROW, T_USE,
);
$operators = array(
		'(', ')', ',', ';', '{', '}', '=', '!', '[', ']', '.', '?', ':',
		'+', '-', '*', '/', '%', '~', '^', '<', '>', '|', '&',
);
foreach ($tokens as $token) {
		if (is_array($token)) {
				switch ($token[0]) {
						case T_AS:
								$cleaned .= ' as';
								continue;
						case T_BAD_CHARACTER:
								continue;
						case T_CHARACTER:
						case T_COMMENT:
						case T_DOC_COMMENT:
						case T_WHITESPACE:
								if (in_array($lastToken, $tokensThatNeedSpaceAfter)) {
									$cleaned .= ' ';
								}
								continue;
						case T_OPEN_TAG:
								$token[1] = trim($token[1]).' ';
						default:
								$cleaned .= $token[1];
								$lastToken = $token[0];
				}
		} else {
				$token = trim($token);
				if ($lastToken && !in_array($token, $operators)) {
						$cleaned .= ' ';
						$lastToken = null;
				}
				$cleaned .= $token;
		}
}
echo htmlspecialchars($cleaned);
?>

Ahm, alles wird gut – didn’t you know about php_strip_whitespace() ? Also ich mach das ca. so:

1
2
3
4
<?php
  string_save_file('tmp.txt',$txt);
  $txt_zip = php_strip_whitespace('tmp.txt');
?>

Lässig, wa? Und da ich ja nichts mehr beweisen muss hab ich den compressor gleich mal hochgeladen. Das Thema stammt nämlich noch aus meinen wilden Zeiten und dementsprechend alt ist das Script auch. Na dann prost!



2 kreative Kommentare

  1. reeaal, 11.06.2010 23:11h

    Ganz ehrlich, Komprimieren macht definitiv Sinn, wenn man es perfektionieren will.
    Das Problem ist auch nicht der Interpreter.

    Das Problem ist, dass der Code inkludiert werden muss.

    Inkludierst du Megabytes von Source-Code über “include” oder “require”, werden auch Megabytes in den Speicher geladen.

    Allerdings ist Komprimieren nicht unbedingt die beste Lösung.

    Die beste Lösung wäre es, den kompletten Source-Code in eine Datei zu packen.
    Sowas habe ich auch schonmal bei diversen Games gesehen, welche im Prinzip alle Daten in eine einzige “bigfile” speichern.

    Naja, aber wer perfektionistisch sein möchte, hat mit PHP so oder so schon die falsche Wahl getroffen. x)

  2. Abro, 12.06.2010 03:56h

    Die Includes liegen ja normalerweise auch als kompilierter PHP-Code im Shared Memory vor, da macht ein Compressor auf Scriptebene für mich immernoch keinen Sinn.
    Aber wenn man die Anzahl der Aufrufe von include/require drastisch reduziert macht sich das u.U. schon bemerkbar, da hast du völlig recht.
    Wäre mal spannend welche Serverseitige Sprache sich denn für Perfektionismus eignet…

Kommentare sind geschlossen.
Aufgrund interner Umstrukturierungsmaßnahmen ist es uns z.Zt. leider nicht
möglich auf neue Kommentare zu reagieren. Wir bitten dies zu entschuldigen.
Bei dringenden Rückfragen suchen Sie bitten den direkten Kontakt zu uns.
Das Unternehmen Lucido Media GbR wurde am 31.12.2013 stillgelegt. Diese Website existiert weiterhin zu Archivzwecken. Der Gesellschafter Daniel Abromeit führt seine Arbeit ab sofort unter dem Dach der Agentur Koch Essen fort. Für entsprechende Anfragen wenden Sie sich daher bitte an https://koch-essen.de/kontakt/