The Story so Phar

Phar je način da se fajlovi koji sadrže PHP kod grupišu i distribuiraju u obliku jedinstvenog paketa. Umesto da imate stotine PHP fajlova rasutih po nizu foldera koji se tako dižu na server, sve to možete imati u obliku jednog .phar fajla, bez da gubite fleksibilnost rada sa fajlovima (include i require rade kao što očekujete, kao i sve funkcije za rad sa fajlovima).

PHP

PHP

Na primer, activeCollab kod i kod biblioteka koje sistem koristi je rasut po 7000+ fajlova i foldera. Kada FTP klijent krene da uploaduje takav skript na server, sam upload zna prilično da traje pošto se za svaki fajl i folder šalju pojedinačne komande, rade provere itd. S druge strane, kada taj isti kod zapakujemo u Phar paket, dobijamo jedan poveći fajl koji se jako brzo uploaduje pošto ide set komandi za samo jedan fajl. Ovo se naročito primeti kod brzih veza, gde upload ide brzo kada se konekcija ostvari, ali se usporava kako broj komandi koje treba da se izvrši.

Početkom prošle godine activeCollab 3 je bio u beti. Početkom beta perioda nove verzije smo puštali u Phar obliku, ali su iste pravile velike probleme kada je na serveru na kome treba da se izvršavaju imao podešen APC. Pošto Phar sam po sebi nije bio piroritet (ali je bio lep bonus), odlučili smo da se za početak okanemo ćorava posla i fokusiramo na stabilizaciju verzije 3. Tako smo prvi put probali da proguramo Phar kao primarni oblik distribucije i odustali.

Onda se desio maj 2012, lansiranje verzije 3 i sav dalji razvoj koji je bio potreban da se sistem ustabili, upegla i zaokruži, tako da Phar dugo nije pomaljao svoju čupavu glavu. Sada, kada smo krenuli da zaokružujemo activeCollab 3.3 (trenutno u beti), odlučili smo se da ponovo probamo Phar kao distribucioni metod i kao osnovu auto-upgrade funkcionalnosti. Opet smo naišli na neke granične slučajeve, ali ovaj put sa dovoljno znanja i iskustva da oko njih prođemo. 

Taman kada som mislili da se ćemo da se "izvučemo" i napokom počnemo da koristimo paketa kao osnovu za distribuciju novih verzija, naletešmo na zid: IonCube loader puca kada naleti na naš paket. Jedna stvar je reći power-useru da pojedine APC config opcije podesi kako mi kažemo, a skroz druga tražiti od system administratora shared okruženja da isključi nešto bitno kao što je IonCube loader. Očekivati bug fix od IonCube ekipe, kao i brz upgrade od strane hostera je ludost, tako da o tome nismo ni razmišljali kao opciji (iako smo im sam bug prijavili).

I tako se vraćamo na početak - još jedno proleće, još jedno odustajanje (polovično, čitaj dalje), a sve pod geslom: više sleće na proleće 2014.

Ono što smo odlučili da uradimo je da zadržimo Phar kao mod za distribuciju, ali da napravimo activeCollab dovoljno pametnim da ume da otpakuje paket u graničnim slučajevima za koje nam je poznato da su problematični:

  1. Sistem nema registrovan phar stream wrapper.
  2. APC je instaliran i ima apc.stat setovan na 1. 
  3. Vidimo da je instaliran IonCube loader.

Ova lista verovatno nije konačna i naletećmo na još neke graničke slučajeve tokom bete, ali neće promeniti naš pristup problemu: Phar kao primarni način za distribuciju, a otpakivanje samo u slučaju potrebe. Lepa stvar je što Phar sam po sebi ume lepo da otpakuje arhive uz razumnu potršnju memorije (između 5 i 10MB, za .phar fajl veličine nešto više od 40MB).

Vidimo se sledeće godine u ovo doba. Nadam se da će PHP ekosistem u međuvremenu dovoljno napredovati da ono što nam danas pravi probleme tada ne bude prisutno. Uostalom, uskoro kreće activeCollab Cloud tako da će distribucija koda vremenom postajati sve manje i manje bitna…