Dziś jest niedziela, 14 marca 2010 roku (z kalendarza...)

Phar, PEAR, Pyrus...

Icon

02.08.2008, 11:45

PHP

Komentarze (8)

Powrót

PHP metodą małych kroczków dorabia się stopniowo szeregu bardzo fajnych narzędzi. Wczoraj ukazał się PHP 5.3.0-alpha1, a wśród nowych domyślnie aktywnych rozszerzeń pojawił się Phar. Nazwa ta oznacza PHp ARchive, czyli coś na wzór archiwów JAR z Javy. Rozszerzenie umożliwia spakowanie całej aplikacji lub biblioteki PHP do jednego pliku, który można uruchomić w całości, albo też wczytać pojedynczy węzeł. Ponadto, rozszerzenie zapewnia zunifikowane API do obsługi archiwów TAR i ZIP.

Phar nie jest nowym wymysłem, gdyż działa on sprawnie już na PHP 5.2, z tym że trzeba go samodzielnie zainstalować z repozytorium PECL. Jako że wczoraj dorobiłem się najnowszej wersji rozwojowej interpretera, postanowiłem się trochę tym wszystkim pobawić.

Działanie Phar

Phar umożliwia zarówno załadowanie całego archiwum naraz, jak też wczytanie pojedynczego pliku:

require('./archiwum.phar'); // 1
require('phar://archiwum.phar/plik.php'); // 2

Rozszerzenie dodaje własną nakładkę strumieni (dla popolskuniekumających: stream wrapper), który umożliwia właśnie bezpośredni dostęp do zawartości archiwów poprzez zwykłe funkcje plikowe.

Każde archiwum posiada tzw. stub działający mniej więcej jak bootloader w systemie operacyjnym. Jest on uruchamiany, kiedy ładujemy całe archiwum (linijka 1), co oczywiście nie oznacza, że PHP przeparsuje wszystkie zawarte w nim pliki. W stubie możemy umieścić np. inicjację autoloadera biblioteki lub w przypadku gotowego skryptu, uruchomienie MVC.

Archiwa Phar mogą być także uruchamiane bezpośrednio przez interpreter, np. po wpisaniu adresu URL do przeglądarki lub z linii komend:

php archiwum.phar

W Internecie można łatwo znaleźć przykłady istniejących aplikacji spakowanych jako Phar (np. phpMyAdmin).

PHP nie udostępnia gotowego narzędzia do pakowania archiwów, a obiektowe API, które może także służyć do manipulowania plikami TAR i ZIP. Aby zapakować jakąś aplikację, musimy napisać dla niej skrypt pakujący, co nie jest specjalnie trudnym zadaniem i nawet w dokumentacji można znaleźć kilka przykładów.

Wydajność

Twórcy PHP robią, co mogą, by maksymalnie zoptymalizować działanie archiwów Phar. Odpowiednio napisane, mogą one znacząco zredukować ilość operacji dyskowych będących najczęściej wąskim gardłem. Drugi kierunek zmagań to integracja z systemem cache'owania kodu APC. Póki co nie wszystko wygląda rewelacyjnie, ale pożyjemy, zobaczymy. Na liście dyskusyjnej jednego z twórców PHP można znaleźć post, którego autor pokusił się o przetestowanie spakowanego phpMyAdmina. Wynika z niego, że w normalnych okolicznościach wydajność wersji niespakowanej i spakowanej jest prawie identyczna. Różnica to ułamek procenta na korzyść pierwszej. Sprawy mają się gorzej, gdy autor odpalił APC. Tutaj już normalna wersja lekko zdystansowała Phar. Przedstawiana na jakiejś konferencji miesiąc wcześniej prezentacja rysowała sprawę wydajności w znacznie czarniejszych barwach, więc albo udało im się znacząco poprawić kod, albo po prostu była to kwestia wybranej do testu aplikacji.

PHK

W repozytorium PECL siedzi jeszcze jedno rozszerzenie do obsługi tutejszego odpowiednika JAR-ów. Mowa jest o PHK, którego archiwa są niekompatybilne z Phar. Rozszerzenie to działa już na PHP 5.1 i ma tę zaletę, że nie musi być fizycznie zainstalowane, aby PHP był w stanie uruchomić wygenerowane przez niego archiwum, choć wtedy wydajność jest znacznie słabsza. Zgodnie z informacjami na stronie autora, sprawuje się ono gorzej, kiedy próbujemy wyciągnąć z archiwum pojedynczy plik, lecz posiada znacznie większe możliwości, gdy mówimy o uruchomieniu całej paczki. Twórca ponadto chwali się wsparciem trzech systemów cache'owania kodu, które tutaj faktycznie mają sprawiać, że spakowana aplikacja działa wtedy szybciej, niż niespakowana. Ile w tym jest prawdy, powiedzieć nie mogę, gdyż rozszerzenia nie miałem już czasu przetestować (zresztą, nawet Phara póki co tylko pobieżnie liznąłem. Niestety, jego dokumentacja nie jest jeszcze kompletna i do części rzeczy trzeba dochodzić metodą prób i błędów).

Dystrybucja kodu

Wraz z premierą PHP 6, projekt będzie mieć prawie kompletny system dystrybucji kodu, w skład którego wejdą:

  1. System archiwów Phar
  2. System cache'owania kodu APC
  3. Nowy instalator PEAR2: Pyrus
  4. Zaawansowany mechanizm autoloaderów
  5. Przestrzenie nazw
  6. Repozytorium PECL

Do kompletu brakowałoby tylko kompilatora Bytecode. Sztuką jednak będzie zgranie tych wszystkich narzędzi, by potrafiły one wzajemnie wykorzystać swoje możliwości. Do premiery PHP 6 być może uda się to zrealizować, gdyż na razie jeszcze różnie z tym bywa.

Całość nie odniesie jednak sukcesu, jeśli twórcy nie zrobią świetnej dokumentacji i nie będą dbać o promocję swoich narzędzi. Ile osób wie, że Symfony, Zend Framework, ez Components i wiele innych bibliotek może być zainstalowanych za pomocą PEAR, chociaż wcale one częścią tego repozytorium nie są? Ile osób próbowało samodzielnie założyć własny kanał dystrybucyjny dla swojego projektu? Ile osób wie, jak pisać kod PHP, by APC potrafił go przyspieszyć? Pewnie niewiele, skoro sami twórcy na listach dyskusyjnych mówią, że sposób informowania o tym jest, łagodnie mówiąc, do bani. W ramach eksperymentu zajrzałem do dokumentacji PEAR, by sprawdzić, jak mogę założyć własny kanał np. dla Open Power Libs. Oczywiście, był tam developer guide... w którym autorzy szeroko rozwodzili się o zasadach przyjmowania pakietów do PEAR, budowie pliku package.xml, zasadach kodowania, a o tym, że w ogóle można tego używać do czegoś innego niż PEAR, wspominał mimochodem fragment JEDNEGO ZDANIA: "or third party channels".

Jak to powinno być zrobione

Twórcy powinni zacząć od rozdzielenia dokumentacji. Jedna dotyczyłaby ogólnie samego instalatora, tworzenia pakietów, zakładania kanałów i wszystkiego, co chciałby widzieć twórca biblioteki lub programu. PEAR nie byłby w niej w żaden sposób wyróżniony, co oczywiście nie przeszkadza, by sam instalator był w tym napisany. Dopiero druga dokumentacja skupiałaby się na tym konkretnym repozytorium: zasady przyjmowania pakietów, standardy kodowania, czyli rzeczy, które w innych projektach mogą wyglądać inaczej.

Druga rzecz to uporządkowanie samej dokumentacji PHP. Przyznam szczerze, po tym, jak jej autorzy pogrupowali rozszerzenia tematycznie, za jasną cholerę nie potrafię tam nic odnaleźć :). Byłoby to jeszcze do zgryzienia (w końcu znam bezpośrednie adresy URL do wszystkich potrzebnych mi rozdziałów), gdyby nie fakt, że niektóre rzeczy po prostu nie są udokumentowane. Widać nie tylko ja borykam się z tym, że prawie nikt nie chce mi przy dokumentowaniu OPL pomóc, o tłumaczeniu już nie wspominając. Sama dokumentacja powinna być też wyznacznikiem pewnych reguł pisania, by programiści nie musieli wynajdywać koła na nowo. Sprowadza się to do zaproponowania schematu, który można by później łatwo powielić, przy okazji wiedząc, dlaczego jest to zrobione tak, a nie inaczej.

Zakończenie

Ufff, ale mi wyszedł długi wpis. Przydałoby się przynajmniej połowę przetłumaczyć na angielski i posłać twórcom, wraz ze wszystkimi pozytywnymi komentarzami, które by się poniżej pojawiły. W końcu ciężko oczekiwać zmian od kogoś, kto nie ma pojęcia, że ktoś inny ich oczekuje :).

Powrót

Komentarze

Napisał Lucas w sobotę, 2 sierpnia 2008 o 15:45

Muszę przyznać że z dokumentacją masz całkowitą rację :) Pamiętam że jak pierwszy raz po zmianach zajrzałem w poszukiwaniu czegoś o PDO myślałem że mnie trafi. Na całe szczęście jest .chm w którym to niestety brak komentarzy. I kwestia porozbijania niektórych działów. Zwłaszcza o stringach wygląda to fatalnie. O ile gdy ktoś zna już php nie jest to problemem ale dla początkujących istna masakra.

Napisał WebCM w sobotę, 2 sierpnia 2008 o 20:57

Rzeczywiście po zmianach ciężko cokolwiek znaleźć. Może to tylko przyzwyczajenie. Wcześniej podstrona o PDO była bardzo rozbudowana - też źle. To pewnie przez komentarze. Nie wszyscy je czytają, dlatego twórcy PHP mogą zastosować AJAX, by wyświetlać je na żądanie. W przypadku przeglądarek bez obsługi JS otwierałyby się na osobnej podstronie lub w oknie. Teraz trzeba przejść na osobną podstronę nawet po to, aby przeczytać 1 paragraf tekstu (np. Wstęp) - absurd. Teraz na 1. rzut oka nawet nie wiadomo, do czego właściwie rozszerzenie jest przydatne.

Inne rozwiązanie -> brak komentarzy na podstronach "overview" ze wstępem, listą funkcji i kilkoma przykładami, bo co tam komentować? Na osobnych podstronach powinny znaleźć się uwagi dotyczące instalacji rozszerzenia oraz konfiguracji. Komentarz chętnie przetłumaczę na angielski w razie potrzeby ;)

Napisał usagi w sobotę, 2 sierpnia 2008 o 21:48

zgadzam się z Lucasem :) dla tych bardziej obznajomionych wystarczy znać pojęcie i używać google, większość zapytań dot. PHP będzie na pierwszym miejscu jako manual :)
Nawiasem, bardzo czekam na Phara, pomógłby mi bardzo w porządkowaniu moich projektów. Tylko jakby był bardziej efektowny...

Napisał dream3r w środę, 6 sierpnia 2008 o 16:27

@lucas:

Jest dostępna rozszerzona wersja dokumentacji razem z komentarzami "Extended HTML Help".

Do pobrania z:
http://www.php.net/download-docs.php

Napisał Nowaker w piątek, 8 sierpnia 2008 o 19:11

PHP-owi nic nie pomoże, nawet rewolucja. W tym języku jest tyle śmiecia, że po porządkach nic by już nie zostało...

Kwiatki:
- array_values, reset
- imagecreatefrompng, ldap_first_attribute, ArrayAccess
- typ boolean, funkcja is_bool(), rzutowanie (bool)
- ((new sth)->method())['sth'] nie da rady. Da radę: $var = new sth; $var = $var->method(); $var = $var['sth];
- miliardy zaśmiecających stałych

Niestety, teraz ten język umiem nieprzeciętnie. I to jedyny powód, dla którego z niego w dalszym ciągu korzystam. Gdybym mógł się cofnąć o 7 lat wstecz, to nie popełniłbym tego błędu i w ogóle bym na to nie patrzył...

Napisał Zyx w poniedziałek, 11 sierpnia 2008 o 09:55

usagi -> "efektowny" czy "efektywny"? :)

Zmierzyłem dzisiaj czas odnajdywania plików PHP we wnętrzu archiwum Phar (przy pomocy dostarczonego API) i z dysku za pomocą file_exists(). Przy większej liczbie plików Phar jest odczuwalnie szybszy, co w sumie przewidywałem (struktura całego archiwum może być przechowywana w pamięci, a PHP nie musi wywoływać funkcji systemowych, by sprawdzić, czy coś istnieje).

Napisał splatch w środę, 13 sierpnia 2008 o 10:03

Zyx pisząc "coś na wzór archiwów JAR z Javy" masz sporo racji ponieważ do jarów pharom to jeszcze kawałek drogi brakuje.

JAR.. to zawsze zwykły ZIP, żadna magia, ale za to dobrze zorganizowany. Domyślne lokalizowanie manifestów, możliwość zapisywania w nim meta-informacji (nie tylko Main-Class). Gotowe API do odczytu manifestu
Wiele narzędzi bazuje na wpisach w manifeście (np OSGI), a sam JAR poprzez manifest ma możliwość określenia classpatha.

Ale największą różnicą między pharem a JARem to chyba jego obsługa przez PHP a VM. JAR jest przeźroczysty. W czasie działania programu ulegną zmianie jedynie URLe do zasobów (foo.jar!some/file.txt). Ten sam, skompilowany kod można uruchomić z katalogów jak i z jarów z odpowiednio zmodyfikowanym classpathem bez modyfikacji linii kodu (żaden import nie ulega zmianie), podczas gdy przechodzi się pomiędzy katalogami a pharem? Czy wtedy wystarczy ustawienie include_patha?

Znaczy ogólnie, phar nie jest złym krokiem. Dobrze że w końcu, po tylu latach, "coś" się ruszyło w kwestii dystrybucji bibliotek. Różne z JARem jest na pewno to, że w nim nikt nie upychał obsługi webowych, a to usiłuje się zrobić w pharze. Od tego jest w javie WebapplicationARchive.
Instalator pakietów z PEARa jest bardzo dobry, w Javie jest od tego Maven2, prezentujący rozbudowaną funkcjonalność, ale za to zbliżony model dystrybucji oparty na repozytoriach, z tą drobną (?) różnicą że w Mavenie zdalne repozytorium to zwykłe pliki, wrzucone do katalogu, nie wymagające uruchamiania żadnych dodatkowych stron.

Pozdrawiam,
Łukasz 'Zceptyk' Dywicki

Napisał Zyx w środę, 13 sierpnia 2008 o 13:15

Myślę, że z przechodzeniem na Phary specjalnych problemów nie ma - widziałem już spakowanego Smarty'ego, phpMyAdmina i parę innych bibliotek (nawet pakowarki dla Zend Frameworka chyba są).

Wewnątrz pharów nic nie trzeba dodawać do ścieżek, gdyż wtedy domyślnie PHP zakłada, że ścieżka dotyczy zawartości archiwum. Dopiero jak się z zewnątrz odwołujesz, musisz skorzystać z phar://. Nie próbowałem jeszcze połączenia, że phar próbuje coś z zewnątrz odczytać, ale chyba po prostu trzeba dodać odpowiednio dużo ../, by z archiwum wyskoczyć.

Sam mam zamiar zrobić biblioteki OPL w dwóch wersjach: standardowej i w postaci archiwów Phar.

Pamiętaj, dbaj o kulturę wypowiedzi oraz dyskusji w sieci.

Skomentuj

NickInformacja
E-mailNa wypadek potrzeby kontaktu z autorem (niepublikowany)
BlogNie zapomnij o http://
LayoutNapisz tu, czy widzisz dzienny czy nocny layout.
WpisFormatowanie wiki

Na Zyxist.com panuje swoboda wyrażania opinii oraz krytyki pod dowolnym adresem. Jedyny warunek: musi być ona kulturalna i rzeczowa. Na chamstwo, prostactwo lub jawne obrażanie kogokolwiek nie ma tu miejsca i takie komentarze są bardzo szybko usuwane. Jeśli zamierzasz polemizować z treścią wpisu, wpierw uważnie ją przeczytaj.

© Tomasz "Zyx" Jędrzejewski 2005 - 2010 | Wykonanych zapytań: 2 | Serwer wirtualny zapewnia