Przedstawiam dawno temu zapowiadany na forum.php.pl skrypcik: PHP Compacter, którego używam do zmniejszania rozmiarów skryptów PHP Hypercacher.
Od razu powiem, że jest to wersja NIESTABILNA-ALPHA i ma wiele wad - część z nich a także zalety wymienię ponizej:
Wady:
- Powolny jak cholera (przerobienie katalogu PHP Fusion (1MB czy 2MB kodu) zajmuje z 10 minut na procesorcze klasy Sempron 4000+)
- CMSy PHP Fusion i Joomla po przerobieniu nie działają poprawnie, aczkolwiek kod PHP nie wywołuje parse errorów, a w PHP Fusion działają niektóre funkcjonalności (patrz zrzut ekranu z PHP Fusion)
- Algorytm nie wykorzystuje w większym stopniu preg_match, gdyż miałem z tym duże problemy (preg_match nie toleruje niektórych znaków)- zamiast tego algorytm "taguje" więc początek i koniec fraz alfanumerycznych odpowiednim unikalnym ciągiem i potem używa str_replace do wyszukania fraz razem z unikalnymi ciągami. Poza tym z użyciem preg_match program jest jeszcze wolniejszy.
- Pisanie czegoś takiego w języku nie kompilowanym do postaci BINARNEJ ma mały sens, ponieważ jest strasznie powolny
- Ogólnie uważam że program jest mało przydatny w obecnej formie i nie wiem czy komuś się na coś przyda
Zalety:
- Przerabia bezbłędnie mniej przekombinowane skrypty (obsługuje poprawnie dużą część konstrukcji PHP - tylko z niektórymi ma problem: potrzeba więcej debuggowania żeby dojść co nie działa)
- Zmniejsza rozmiar kodu PHP o około 50% bez użycia kompresji
- Implementacja zawiera prymitywny parser PHP więc teoretycznie może się komuś przyda do czegoś
- PHPCompactera można użyć jako SCRAMBLERA (zaciemniacza) kodu - żeby zabezpieczyć nasz kod przed kradzieżą rozwiązań przez mniej doświadczonych programistów
Konstrukcja:
Klasa zawiera prymitywny algorytm parsujący kod PHP, który analizuje kod PHP bajt po bajcie i potrafi odróżnić nazwy zmiennych, znaki specjalne, komentarze, itd.
Licencja: GPL wersja 3.
Początek kodu wygląda tak:
<?php class PHPCompacter { //If you have any variable name that you don't want to be changed by PHPCompacter, put its name in this array //Warning: All of these must be written UPPERCASE and without dollar '$' otherwise it won't work correctly !! var $predefined_exclude_vars = array('THIS', '_SERVER', 'HTTP_SERVER_VARS', '_ENV', 'HTTP_ENV_VARS', '_COOKIE', 'HTTP_COOKIE_VARS', '_GET', 'HTTP_GET_VARS', '_POST', 'HTTP_POST_VARS', '_FILES', 'HTTP_POST_FILES', '_REQUEST', '_SESSION', 'HTTP_SESSION_VARS', 'GLOBALS', 'PHP_ERRORMSG'); //This are the character that will be used to create new, short variables var $diffrence_separator = '^&pC*'; //This helps to identify/find variable and function names later by separating alphanumeric characters fro
m non-alphanumeric characters var $varname_maxlen; //Array containing maximum sizes of string "digits" of counter string var $min_counter_string_length; //Minimum length of variable names var $max_counter_string_length; //Maximum length of variable names var $compact_variables; //BOOLEAN - true means that we want to compact variable names var $varname_counter = 0; var $output_folder = '_phpCompacter_Output'; ?>
Klasy używamy w następujący sposób
1. Wrzucamy pliki php_compacter.class.php oraz predefined_keywords.txt do folderu
2. Wrzucamy pliki PHP których rozmiar chcemy zmniejszyć do jakiegoś katalogu obok (może to być folder w którym jest zainstalowane PHP fusion)
3. W php_compacter.class.php (lub oczywiście wpisujemy to w innym pliku, i includujemy klasę) wpisujemy:
<?php $phpc1 = new PHPCompacter(1, 5, 2); $phpc1->loadReservedKeywords('predefined_keywords.txt'); $phpc1->RecursiveCompactDir('Nazwa_folderu_z_plikami_PHP'); ?>
4. Odpalamy skrypt z przeglądarki i czekamy na efekt. Jeżeli mamy odpowiednie uprawnienia, to PHP Compacter automatycznie utworzy katalog _phpCompacter_Output i w nim skopiuje strukturę folderów z katalogu, który przerabia i pozapisuje w tej strukturze przerobione pliki PHP w odpowiednich miejscach. Jeżeli nie mamy uprawnień do zapisywania w aktualnym folderze, należy zmienić w klasie zmienną $output_folder na jakiś inny folder - np. mój_folder1/folder/_phpCompacter_Output
Pobrać skrypt można tutaj:
http://hypercacher.com/download_pl.html
Specjalnie do dyskusji na temat tego skryptu utworzyłem też temat na moim forum - jeżeli będą jakieś sugestie poprawek to chętnie je wdrożę.
http://hypercacher.com/forum/viewtopic.php?t=32
-----------
Może komuś będzie chciało się to przepisać na coś binarnego - np. C++ - bo na moje potrzeby wystarczy taka funkcjonalność jak jest teraz, poza tym piszę aktualnie tylko w PHP
