Obrazki osadzone w jednoplikowym skrypcie php
Wstęp…
Ostatnio pracuję nad projektem inferno – jedno plikowym systemem zdalnego zarządzania systemem, oczywiście na licencji GPL. Panel takiego skryptu musi ładnie wyglądać, a żeby ładnie wyglądał potrzebuje obrazków… Tylko jak tu teraz umieścić obrazki w jednym pliku z skryptem?
Okazuje się że to nie jest wcale takie trudne! Sposób podejrzałem w skrypcie c99shell. Wystarczy zakodować obrazki base64 i wstawić je do pliku php!:)
Wystarczy odpowiednia manipulacja funkcjami base64_decode oraz base64_encode.
No to zaczynamy!
Podstawą są same obrazki. Musimy je zakodować. Oczywiście, funkcją którą wykorzystamy do tego celu będzie base64_encode. Przyjmuję, że mamy plik graficzny w formacie gif o nazwie ‘ikonka.gif’.
$filename='ikonka.gif'; file_put_contents($filename.'base64.txt', base64_encode(file_get_contents($filename));
Skrypt stworzy nam nowy plik – ikonka.gif.base64.txt, w którym to znajdziemy zakodowany nasz plik graficzny. Właściwie to już połowa pracy za nami
Teraz musimy zająć się skryptem, który ma obsługiwać ten obrazek. Przyjmuję, że skrypt jest w pliku skrypt.php, oraz obrazek będziemy chcieli wyświetlić poprzez skrypt.php?image=ikonka.
Na górze dokumentu dopisujemy więc:
if (isset($_GET['image']) && $_GET['image']=='ikonka') {
header('Content-type: image/gif'); //nasz plik był w formacie gif
echo base64_decode('MIEJSCE'); //tutaj umieszczamy "zakodowaną" zawartość pliku graficznego
exit(); //no i kończymy skrypt, bo obrazek już mamy!
}
I już mamy osadzony obrazek w skrypcie PHP
Więcej!
Zapraszam do pobrania skryptu Inferno, w którym można zobaczyć praktyczne i bardziej zaawansowane zastosowanie powyższej metody.
Good luck & have fun
Dobra. Nie rozumiem tylko jednego. Chcesz utworzyć JEDNOPLIKOWĄ web aplikację a tworzysz osobne pliki. Rozumiem, że tylko na poziomie dev, żeby odczytać wartość zawartą w tym pliku i skopiować ją do pliku ze skryptem? OK. Mamy dwadzieścia ikonek po 750 bajtów, enkodowanie do base64 dodaje jakieś 25% rozmiaru, więc jeden obraz zajmuje 1KB. Razy 20 daje prostą kalkulację 20KB. 20KB to już dobrze zoptymalizowany 800-linijkowy skrypt. Drugie tyle na zawarcie obrazów w jednym pliku? Widzę parę „ale”. 1) Do takich „mobilnych” rozwiązań stosuje się standardową kompresję do ZIP, a przy konieczności odczytu – unpack w czasie rzeczywistym. 2) Zresztą po cholerę ktoś mądry kiedyś wymyślił katalogi? Żeby uporządkować. Dwa „pliki” (skrypt+folder) to chyba nie takie złe rozwiązanie. 3) W czasie szybkich komputerów/serwerów programiści (a już z pewnością programiści PHP) nie zwracają najmniejszej uwagi na użycie zasobów serwera podczas pisania swoich skryptów. Niejednokrotne powtarzanie tych samych linijek kodu, brak optymalizacji, tworzenie setki zmiennych zawierających stringi, arraye a co gorsza nawet resource’y, PAKOWANIE WIELU PLIKÓW W JEDEN – z pewnością te ficzery nie należą do przyszłościowych ani nawet nie wróżą na dalszy rozwój. Gdzie zresztą sens tworzenia jednego ogromnego pliku, w którym nawet by uruchomić tylko parę pierwszych linijek – trzeba odczytać całość. Otwierasz skrypt.php, w nim ładujesz dwadzieścia ikonek poprzez img src=”skrypt.php?image=ikonka” i w efekcie otrzymujesz 21*20KB zajmowanej pamięci. Patrząc na serwery, które mają kilkadziesiąt GB pamięci mogłoby się wydawać, że to mało – zaledwie dziesięciotysięczna część. Pewnie w takim zastosowaniu jak Twoje – Inferno, również nie będzie to niczemu szkodziło. Co jednak w wypadku jeśli pokusi Cię by stosować podobne rozwiązanie w aplikacji, która używana będzie już nie tylko przez samego admina, ale i odwiedzających. Strona się rozrośnie, a cały kod szlag trafi razem z serwerem. Twoje rozwiązanie można stosować, owszem, ale takie rozwiązanie jak podajesz jest kompletnie nie zoptymalizowane pod kątem wydajności i ekonomii zasobów.
Nie napisałem nigdzie, że z tej metody którą tutaj opisałem sam korzystałem do wygenerowania kodów obrazków – jest to tylko pomoc dla osób które może kiedyś będą potrzebowały takiego rozwiązania.
Nieraz przydaje mi się aplikacja w jednym pliku, którą można szybko wgrać na serwer i szybko też z niego usunąć (np. Inferno). Nie myśl przypadkiem, że stosuję rozwiązania jedno plikowe na co dzień, przy tworzeniu serwisów dla szarych użytkowników.
A we wstępie co pisze?
Nie myślę, że stosujesz takie rozwiązania na codzień. Po prostu wiem, że nie stosujesz, bo prędzej popełnił byś samobójstwo szukając w kodzie odpowiedniej linijki.