PHP Compressor aka “Ihr seid doch bescheuert!”
Ich 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 (ich weiss du liest das also lass uns ruhig mal wieder schwätzen – und dein Penaltypost ist btw. der Hammer), 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 geniale Kommentare
Abro (21 comments) am Juni 12th, 2010
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…
reeaal (1 comments) am Juni 11th, 2010
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)