AĀ·R
EN SR

PHP aplikacije napravljene za rast

Kontrolne table, portali i interni alati. Moderna PHP arhitektura koja izdržava stvarno produkciono opterećenje.

Započni projekat Pogledaj naŔ proces
Izrada custom PHP aplikacija — Aleksandar RaÅ”ević

Zastareo PHP kod vas koŔta viŔe nego Ŕto mislite

PHP 5.x kod napisan bez okvira (framework-a) postaje neodrživ kako aplikacija raste: SQL upiti razbacani po fajlovima za prikaz, bez jasne podele odgovornosti, lozinke heÅ”irane MD5 algoritmom, i nijedan test. Tipičnoj zastareloj PHP aplikaciji treba 3-5 puta viÅ”e vremena za izmenu nego modernom Laravel ili Symfony ekvivalentu, a svaka izmena nosi rizik da pokvari neÅ”to nepovezano. Aleksandar RaÅ”ević razvija aplikacije u PHP 8.2, sa strogim tipovima, servisno orijentisanom arhitekturom, i sveobuhvatnim testovima. Tipična Laravel aplikacija se pokreće za manje od 50ms, podnosi 2.000+ istovremenih zahteva na jednom serveru uz podeÅ”en OPcache, i postavlja se preko Docker-a sa blue-green izdanjima bez prekida rada.

Odziv ispod 50ms

PodeÅ”en OPcache, optimizovani Eloquent modeli i Redis keÅ”iranje za vreme odziva API-ja ispod 50ms pri produkcionom opterećenju.

Tipski bezbedan kod

Tipizirana svojstva u PHP 8.2, union tipovi, enum-ovi i readonly klase. GreŔke se hvataju pri kompajliranju, nikad u produkciji.

Postavljanje preko Docker-a

Kontejnerizovano sa Docker Compose za razvoj i Kubernetes za produkciju. Ponovljivo pravljenje verzija, bez razlika između okruženja.

Aplikacije koje podnose stvarno opterećenje

Custom kontrolne table i izveŔtavanje

Analitičke kontrolne table razvijamo sa Laravel-om kao API pozadinom i Vue.js 3 ili React-om za prikaz. Tokovi za agregaciju podataka koriste Laravel-ov query builder sa optimizovanim selectRaw() i groupBy() pozivima za izveÅ”taje koji obuhvataju milione redova. Implementiramo materijalizovane poglede u PostgreSQL-u za unapred izračunate metrike, zakazujemo automatsko generisanje izveÅ”taja preko Laravel Scheduler-a, i izvozimo u PDF pomoću DomPDF-a ili u Excel pomoću Maatwebsite/Laravel-Excel paketa. Elementi kontrolne table se prikazuju po ulogama preko Laravel-ove Gate i Policy autorizacije, sa ažuriranjima u realnom vremenu preko Laravel Echo i Pusher-a ili Soketi-ja.

Portali za klijente

Bezbedni portali za klijente sa multi-tenant arhitekturom preko Laravel-ovog Scope za izolaciju podataka, kontrolom pristupa po ulogama pomoću Spatie Permission paketa, i upravljanjem dokumentima preko Laravel Medialibrary za otpremanje fajlova, verzionisanje i bezbednu isporuku preko CDN-a. Autentifikacija koristi Laravel Breeze ili Jetstream sa dvofaktorskom autentifikacijom preko TOTP-a, upravljanjem sesijama preko Redis pogona, i zaÅ”titom od brute-force napada kroz Laravel-ov ThrottleRequests middleware. Evidencija aktivnosti prati svako preuzimanje dokumenta, čitanje poruke i slanje forme, sa IP adresom i vremenskom oznakom.

Izrada admin panela

Interne admin alate razvijamo sa Filament PHP ili Laravel Nova za brzo generisanje CRUD interfejsa, ili potpuno custom admin panelima na React-u kada to interfejs zahteva. Custom admin paneli imaju kreatore formi prevlačenjem elemenata, tokove grupnih operacija preko redova zadataka, napredno filtriranje preko Laravel Scout-a i Meilisearch-a, i evidenciju izmena preko spatie/laravel-activitylog paketa. Svaka admin akcija je ograničena dozvolama, pretraživa i zabeležena. Implementiramo meko brisanje, verzionisanje modela, i vraćanje transakcija baze radi celovitosti podataka kod složenih viÅ”estepenih operacija.

Izrada API-ja

RESTful API-jevi napravljeni preko Laravel-ovih resource controller-a, API resource klasa za dosledno formatiranje odgovora, i route model binding-a sa implicitnim ograničenim vezama. Autentifikacija koristi Laravel Sanctum za autentifikaciju SPA aplikacija preko tokena, ili Laravel Passport za potpunu OAuth2 server implementaciju. Verzionisanje API-ja se reŔava preko prefiksa u URL-u (/api/v1/, /api/v2/) sa oznakama zastarelosti na endpoint-ima koji se ukidaju. Implementiramo ograničenje broja zahteva po korisniku i po IP adresi, proveru zahteva preko Form Request klasa, i detaljne odgovore o greŔkama prema RFC 7807 Problem Details standardu. Dokumentacija API-ja se automatski generiŔe alatom Scribe.

Vizuelizacija podataka

Interaktivni grafikoni i vizuelizacije preko Chart.js, D3.js ili Apache ECharts, povezani sa Laravel pozadinskim podacima. Razvijamo kontrolne table za praćenje u realnom vremenu sa ažuriranjima preko WebSocket-a za metrike poput aktivnih korisnika, obima transakcija i stanja servera. Geografske vizuelizacije koriste Leaflet.js sa custom slojevima karte. Funkcija izvoza generiÅ”e statične PNG ili SVG slike grafikona na strani servera pomoću Puppeteer-a, za ugrađivanje u PDF izveÅ”taje. Tabele podataka koriste ag-Grid ili DataTables sa obradom na strani servera za paginaciju i sortiranje velikih skupova podataka bez problema sa memorijom na strani klijenta.

Sistemi u realnom vremenu

Funkcionalnosti u realnom vremenu pokreće Laravel Echo sa Soketi-jem ili Pusher-om za WebSocket emitovanje, Redis pub/sub za distribuciju događaja, i Laravel Queue radnici koji obrađuju poslove u pozadini uz Horizon nadzor. Razvijamo sisteme za obaveÅ”tenja uživo, zajedničko uređivanje u realnom vremenu uz operativnu transformaciju, i sisteme za razgovor uživo sa čuvanjem istorije u PostgreSQL-u. Kanali prisutnosti prate koji korisnici su onlajn, indikatori kucanja pokazuju aktivne učesnike, a potvrde isporuke poruka potvrđuju da je poruka pročitana. Event sourcing preko spatie/laravel-event-sourcing paketa obezbeđuje evidenciju svake promene stanja.

Centri za integracije

Middleware aplikacije koje povezuju različite sisteme: sinhronizujemo podatke između vaÅ”eg CRM-a (Salesforce, HubSpot), ERP-a (SAP, NetSuite), knjigovodstvenog softvera (QuickBooks, Xero), i internih baza podataka koristeći Laravel-ov sistem redova za pouzdanu asinhronu obradu. Svaki konektor za integraciju je napravljen kao servisna klasa sa doslednim interfejsom: autentifikacija, preuzimanje, transformacija, provera i čuvanje. Neuspele sinhronizacije se ponavljaju uz eksponencijalno čekanje, redovi za neuspele poruke hvataju zapise koji se ne mogu obraditi radi ručnog pregleda, a webhook endpoint-i primaju obaveÅ”tenja od spoljnih sistema uz proveru HMAC potpisa.

Modernizacija zastarelih sistema

Zastarele PHP aplikacije modernizujemo kroz proces u fazama: prvo, kontejnerizujemo postojeću aplikaciju preko Docker-a radi doslednog postavljanja; drugo, izdvajamo poslovnu logiku u servisne klase koje se mogu testirati preko PHPUnit-a; treće, zamenjujemo čist SQL Eloquent ORM modelima i migracijama; četvrto, uvodimo moderan frontend preko Vue.js-a ili React-a; peto, prelazimo na strukturu Laravel ili Symfony okvira. Migracije baze podataka se rade preko Laravel-ovog schema builder-a ili Doctrine Migrations-a, a svaka izmena je unazad kompatibilna uz feature flag-ove koji omogućavaju postepeno uvođenje. Modernizovali smo aplikacije od PHP 5.2 do PHP 8.2 bez ijednog dana prekida rada.

Kako radimo

1

Tehničko otkrivanje

Analiziramo vaÅ”u postojeću infrastrukturu, kod i Å”emu baze podataka kako bismo razumeli trenutna uska grla i tehnički dug. Dokumentujemo model odnosa entiteta, prepoznajemo N+1 probleme sa upitima, analiziramo evidenciju sporih upita, i mapiramo integracije sa spoljnim sistemima. Za projekte koji kreću od nule, definiÅ”emo model domena kroz radionice event storming-a i pravimo mapu ograničenih konteksta. Rezultat: tehnička specifikacija sa zapisima arhitektonskih odluka (ADR), ERD dijagramom baze, API ugovorom (OpenAPI), i dijagramom topologije postavljanja.

2

Dizajn baze podataka

Å emu baze podataka dizajniramo sa pravilnom normalizacijom, strategijama indeksiranja, i particionisanjem za tabele kod kojih se očekuje preko 10 miliona redova. Ograničenja stranog ključa obezbeđuju referencijalni integritet, a koristimo PostgreSQL za složene tipove podataka (JSONB, nizovi, opsezi) ili MySQL 8 za aplikacije gde su pretraga celog teksta i GIS funkcionalnosti ključne. Fajlovi migracija se čuvaju pod verzijskom kontrolom i mogu se poniÅ”titi. Implementiramo generatore test podataka za razvojna okruženja i piÅ”emo merenja performansi za kritične upite koristeći Laravel-ov DB::listen() kako bismo uhvatili spore upite tokom razvoja, ne u produkciji.

3

Arhitektura pozadinskog sistema

Pozadinski sistem razvijamo sa Laravel-om ili Symfony-jem prema principima domain-driven dizajna: kontroleri prosleđuju posao servisnim klasama, repozitorijumi apstrahuju pristup podacima, a akcije objedinjuju pojedinačne poslovne operacije. Koristimo Laravel-ov service container za dependency injection, primenjujemo repository Å”ablon radi lakÅ”eg testiranja, i piÅ”emo API resurse koji pretvaraju modele u dosledne JSON strukture. Autentifikacija koristi Laravel Sanctum ili Fortify, autorizacija se reÅ”ava preko Gates i Policies, a strategije keÅ”iranja se definiÅ”u po endpoint-u sa Redis-om kao skladiÅ”tem keÅ”a. Poslovi u redu obrađuju teže operacije asinhrono, uz Horizon za nadzor.

4

Integracija frontend-a

Frontend aplikacije se grade kao SPA sa Vue.js 3 (Composition API, Pinia za stanje) ili React-om (hooks, Zustand/Redux). Koristimo Tailwind CSS za utility-first stilizovanje i biblioteke komponenti poput Headless UI ili PrimeVue za pristupačne forme i tabele podataka. Komunikacija sa API-jem koristi Axios sa automatskim obnavljanjem tokena, sprečavanjem duplih zahteva, i globalnim rukovanjem greŔkama. Build proces koristi Vite za HMR ispod sekunde i optimizovane produkcione pakete. SSR se implementira preko Inertia.js kada je SEO bitan, ili kao potpuno odvojena SPA kada je aplikacija iza autentifikacije.

5

Testiranje opterećenja

Pre lansiranja pokrećemo testove opterećenja alatima k6 i Artillery, simulirajući 2.000+ istovremenih korisnika koji izvrÅ”avaju realne tokove: prijavu, unos podataka, generisanje izveÅ”taja i otpremanje fajlova. ProfiliÅ”emo pomoću Laravel Telescope-a i Blackfire.io-a kako bismo prepoznali curenje memorije, N+1 upite, i zastoje pri zaključavanju. Vreme izvrÅ”avanja upita analiziramo preko EXPLAIN ANALYZE, spore upite optimizujemo složenim indeksima, a često koriŔćeni podaci se unapred učitavaju u Redis. Testiramo scenarije otkaza: prebacivanje baze, pad radnika u redu, gubitak Redis konekcije, i isteke vremena kod spoljnih API-jeva, kako bismo obezbedili postepeno, kontrolisano opadanje performansi umesto potpunog pada.

6

PodeŔavanje nadzora

Produkciona postavljanja uključuju sveobuhvatan nadzor: Laravel Telescope za otklanjanje greÅ”aka u zahtevima, Sentry za praćenje greÅ”aka sa punim stack trace-om i kontekstom korisnika, Prometheus i Grafana za metrike servera (CPU, memorija, disk I/O, dužina reda), i Pingdom ili UptimeRobot za spoljnu proveru dostupnosti. Agregacija logova koristi ELK stack ili Grafana Loki sa strukturiranim JSON logovanjem preko Monolog-a. Pravila za upozorenja obaveÅ”tavaju preko Slack-a ili PagerDuty-ja kada porastu stope greÅ”aka, kaÅ”njenje reda pređe granicu, ili se baze konekcija približe iscrpljenju. Postavljamo automatske rezervne kopije baze sa mogućnoŔću oporavka na tačno vreme, i mesečno testiramo procedure vraćanja.

Tehnologije koje koristimo

PHP 8.2 Laravel 11 Symfony 7 MySQL 8 PostgreSQL 16 Redis RabbitMQ Docker Kubernetes Nginx Vue.js 3 React Inertia.js Tailwind CSS Chart.js PHPUnit PHPStan Pest PHP Laravel Horizon Sentry Grafana GitHub Actions
"Kontrolna tabla za logistiku koju je Aleksandar RaÅ”ević napravio za nas skratila je vreme obrade dispečerskih naloga sa 45 minuta na manje od 8 minuta. To je stvaran povraćaj investicije u softver."
James Okafor Potpredsednik za tehnologiju, Blueprint Logistics, Kejptaun, JAR

Često postavljana pitanja

Da li koristite PHP okvir ili razvijate u čistom PHP-u?

Isključivo koristimo okvire: Laravel 11 za većinu novih aplikacija i Symfony 7 za veće poslovne projekte sa složenim zahtevima domena. Aplikacije ne razvijamo u čistom PHP-u. Okviri pružaju testirane bezbednosne implementacije (zaÅ”tita od CSRF-a, sprečavanje SQL injekcija, XSS escaping), ORM slojeve koji sprečavaju nebezbedne upite, sisteme redova za obradu u pozadini, i infrastrukturu za testiranje čija bi izrada u custom kodu trajala mesecima. NaÅ”e Laravel aplikacije se pokreću za manje od 50ms uz uključen OPcache, a dodatno opterećenje od okvira je zanemarljivo u odnosu na dobijenu brzinu razvoja i bezbednosne prednosti.

Kako pristupate dizajnu baze podataka?

Dizajn baze podataka prati strukturiran proces: model domena pravimo preko ERD dijagrama u dbdiagram.io ili DrawSQL, normalizujemo do trećeg normalnog oblika za transakcione podatke, i selektivno denormalizujemo tabele za izveÅ”tavanje. Biramo PostgreSQL za aplikacije kojima je potreban JSONB, pretraga celog teksta ili GIS funkcionalnosti, i MySQL 8 za tradicionalne CRUD aplikacije. Svaka tabela dobija pravilno indeksiranje: primarne ključeve, strane ključeve sa ON DELETE CASCADE gde je to prikladno, i složene indekse za kombinacije kolona koje se često upituju. Fajlovi migracija se čuvaju pod verzijskom kontrolom i testiraju u CI-ju. Za tabele sa velikim obimom podataka, implementiramo particionisanje i read replike.

Možete li da se integriÅ”ete sa naÅ”im postojećim sistemima?

Integracija sistema je jedna od naÅ”ih osnovnih jačih strana. Razvijamo REST i SOAP API klijente preko GuzzleHTTP-a sa automatskim ponovnim pokuÅ”ajima, circuit breaker-ima za endpoint-e koji ne rade, i evidencijom zahteva/odgovora. Za sinhronizaciju između baza podataka, koristimo Laravel-ove Eloquent modele sa konekcijama samo za čitanje ka starim bazama, ETL tokove za transformaciju podataka, i radnike u redu za pouzdanu obradu u grupama. Integrisali smo se sa Salesforce-om, SAP-om, NetSuite-om, QuickBooks-om, Xero-om, Stripe-om, PayPal-om, Twilio-om, Slack-om, Microsoft Graph-om, i desetinama internih sistema klijenata. Svaka integracija uključuje rukovanje greÅ”kama, logiku ponovnih pokuÅ”aja, i kontrolnu tablu za nadzor stanja sinhronizacije.

Šta je sa funkcionalnostima u realnom vremenu poput obaveŔtenja uživo?

Funkcionalnosti u realnom vremenu se implementiraju preko Laravel Echo-a koji emituje događaje preko WebSocket-a putem Soketi-ja (na sopstvenom serveru) ili Pusher-a (kao upravljana usluga). Za aplikacije kojima su potrebna ažuriranja uživo, promene modela emitujemo kroz Laravel-ov BroadcastsEvents trait i sluÅ”amo ih na frontend-u preko Echo JavaScript klijenta. Kanali prisutnosti prate korisnike koji su onlajn, privatni kanali obezbeđuju da se podaci isporučuju samo ovlaŔćenim primaocima, a whisper događaji omogućavaju indikatore kucanja na strani klijenta. Za scenarije sa velikim protokom, koristimo Redis pub/sub kao pogon za emitovanje, uz horizontalno skaliranje Soketi instanci iza load balancer-a.

Kako obezbeđujete bezbednost aplikacije?

Bezbednost je slojevita na svakom nivou sistema. Nivo aplikacije: Laravel-ovi ugrađeni CSRF tokeni, pripremljeni upiti preko Eloquent ORM-a, bcrypt heÅ”iranje lozinki, i potpisani URL-ovi za resetovanje lozinke i proveru emaila. Autorizacija se sprovodi preko Policies i Gates na svakoj akciji kontrolera. Infrastruktura: isključivo HTTPS sa HSTS zaglavljima, sprečavanje SQL injekcija preko parametrizovanih upita, XSS zaÅ”tita preko automatskog escaping-a u Blade Å”ablonima, i bezbednosna zaglavlja (CSP, X-Frame-Options, X-Content-Type-Options) podeÅ”ena u Nginx-u. Pokrećemo automatska bezbednosna skeniranja alatima Semgrep i Trivy u CI-ju, proveru zavisnosti preko composer audit, i penetraciono testiranje na produkcionim postavljanjima. Sve tajne se čuvaju preko environment promenljivih i Docker secrets-a, nikad se ne čuvaju u verzijskoj kontroli.