Licenta Larisa (3) [619474]
Universitatea „Politehnica” Bucures ,ti
Facultatea de Automatic ˘a s,i Calculatoare
Departamentul Automatic ˘a s,i Informatic ˘a Industrial ˘a
LUCRARE DE LICENT ,˘A
Alinierea pret ,urilor în comert ,ul on-line
Coordonator Absolvent
S,l. dr. ing Adriana Olteanu Larisa-Nicoleta Cebuc
2019
Rezumat
Lucrarea abordeaz ˘a o tematic ˘a larg r ˘aspândit ˘a în comert ,ul on-line s ,i anume cea a alinierii
pret ,urilor proprii la pret ,urile piet ,ei. Pentru realizarea lucr ˘arii am dezvoltat o aplicat ,ie
web ce adun ˘a periodic pret ,urile din magazinele on-line, urmând ca acestea s ˘a fie salvate
într-un format propriu s ,i analizate, pentru ca mai apoi s ˘a li se aplice valid ˘arile de cost
necesare. În urma acestor act ,iuni va rezulta o serie de pret ,uri noi care va fi introdus ˘a în
baza noastr ˘a de date.
Aceast ˘a solut ,ie vine în urma analizei atente a pret ,urilor unei serii de magazine on-line
într-o perioad ˘a de 30 de zile, unde s-au observat discrepant ,e mari între pret ,urile acestora.
Aplicat ,ia ”Alinieri in comert ,ul on-line” va ajuta dezvoltarea atât a noilor juc ˘atori pe piat ,˘a,
cât s ,i a celor vechi, sust ,inând un nivel accesibil al tuturor pret ,urilor.
Cuprins
1 Introducere 2
1.1 Problematic ˘a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Scopul proiectului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Descriere proiect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Context actual 6
2.1 Motivat ,ie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 Solut ,ionare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2.1 Solut ,ia software . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3 Documentat ,ie tehnic ˘a 9
3.1 Prezentare aplicat ,ie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.1.1 Prezentare framework utilizat . . . . . . . . . . . . . . . . . . . 9
3.1.2 Prezentare editorului utilizat . . . . . . . . . . . . . . . . . . . . 11
3.1.3 Prezentare client SSH utilizat . . . . . . . . . . . . . . . . . . . 16
3.1.4 Prezentare baz ˘a de date utilizat ˘a . . . . . . . . . . . . . . . . . . 16
3.1.5 RabbitMQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.1.6 PHP DOM – lucrul cu XML . . . . . . . . . . . . . . . . . . . . 21
3.1.7 Dezvoltare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.2 Implement ˘ari viitoare . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.2.1 Utilizare MongoDB . . . . . . . . . . . . . . . . . . . . . . . . 43
3.2.2 Utilizare cron-urilor . . . . . . . . . . . . . . . . . . . . . . . . 44
3.2.3 Anti-spider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.3 Testarea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.4 Concluzii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Bibliografie 50
1
Capitolul 1
Introducere
1.1 Problematic ˘a
Digitalizarea continu ˘a din ultimii ani a condus la numeroase beneficii aduse de comert ,ul
on-line. Printre beneficiile e-commerce-ului se num ˘ar˘a s,i o gam ˘a larg ˘a de bunuri s ,i ser-
vicii, consumatori ce pot face tranzact ,ii în orice moment, posibilitatea de a returna un
produs achizit ,ionat s ,i educarea client ,ilor în vederea familiariz ˘arii cu tehnologia.
Cump ˘ar˘aturile on-line pot fi dificile din mai multe motive:
1) multe dintre companiile de pe piat ,˘a au pret ,uri diferite, iar o mare parte din cump ˘a-
r˘atori prefer ˘a s˘a achizit ,ioneze produsul cu pret ,ul cel mai mic, f ˘ar˘a a verifica în prealabil
veridicitatea furnizorilor.
2) des ,i într-un procentaj destul de mic, o parte din client ,ii magazinelor on-line co-
mand ˘a produse care au un pret ,ridicat fat ,˘a de medie deoarece consider ˘a c˘a acestea sunt
mai bune.
Pentru a elimina cele dou ˘a probleme, aplicat ,ia ”Alinieri în comertul on-line” abor-
deaz ˘a trei pas ,i de piat ,˘a ai competitorilor, s ,i anume: adunarea pret ,urilor magazinelor con-
curente(targeting), alinierea propriilor pret ,uri la pret ,urile piet ,ei(alignment) si verific ˘arile
de cost necesare firmelor în vederea câs ,tigurilor(price-check).
O dat ˘a asumat ˘a problematica alinierii pret ,urilor prin mecanismele tehnice aferente,
se va diminua sentimentul de confuzie al clientului, permit ,ându-i-se acestuia s ˘a ia decizii
mult mai us ,or, rezultând minimizarea feedback-ului negativ oferit piet ,ei on-line.
1.2 Scopul proiectului
Conform unui studiu realizat în anul 2018 de GPeC s ,i iSense Solutions în rândul a
914 persoane ce utilizeaz ˘a internetul, 53% dintre persoanele aflate în mediul urban au
cump ˘arat cel put ,in o dat ˘a pe lun ˘a online, având o cres ,tere semnificativ ˘a fat ,˘a de anul
precedent s ,i anume 44%.
2
1.3. Descriere proiect
Decizia de a cump ˘ara on-line este influent ,at˘a de numeros ,i factori, printre care s ,i tim-
pul de livrare al produselor, pret ,urile, dar s ,i popularitatea magazinului on-line, cel mai
important fiind pret ,ul final al produselor.
Conform Asociat ,iei Romane a Magazinelor On-line(ARMO), finalul anului 2018 a
adus piat ,a comert ,ului online la cifra de 3,6 miliarde de euro, o cres ,tere semnificativ ˘a
de la 2,8 miliarde în anul 2017, iar num ˘arul de comerciant ,i activi a crescut de la apro-
ximativ 7000, la 14000. De asemenea, ARMO sust ,ine c ˘a e-commerce-ul este cel mai
puternic creator de businessuri, acesta aducând aproximativ 70 de milioane de euro în
industria curieratului, dar s ,i o majorare de profituri pentru companiile din acest domeniu,
preconizându-se c ˘a pân ˘a în anul 2022 companiile on-line vor det ,ine un procent de 10%
din totalul vânz ˘arilor.
1.3 Descriere proiect
Concluzionând analizele de piat ,˘a f˘acute de ARMO s ,i estim ˘arile ce au urmat acestora,
observ ˘am c ˘a de la an la an comerciant ,ii on-line se dezvolt ˘a din ce în ce mai mult, aducând
un aport foarte mare economiei t ,˘arii.
Pentru a sust ,ine aceast ˘a evolut ,ie, aplicat ,ia implementat ˘a foloses ,te ceea ce în comert ,ul
on-line poart ˘a denumirea de web crawler. Un crawler web foloses ,te scripturi automate ce
”navigheaz ˘a” prin internet s ,i adun ˘a o serie de URL-uri. De asemenea, se mai pot lua în
considerare ca s ,i aplicat ,ii software ce adun ˘a informat ,ii printr-un protocol HTTP.
În general, problemele cu care se poate confrunta un crawler web sunt:
1) num ˘arul de pagini necesare pentru a fi parsate. În vederea solut ,ion˘arii este necesar
un plan de c ˘autare foarte bine pus la punct înc ˘a de la începutul dezvolt ˘arii proiectului.
2) în cazul în care este nevoie de a c ˘auta printr-un num ˘ar foarte mare de pagini într-o
secund ˘a, este necesar ca aplicat ,ia s˘a fie foarte bine optimizat ˘a.
La o simpl ˘a c˘autare pe Google putem observa c ˘a marii juc ˘atori ai piet ,ei de comert ,on-
line(Alibaba, Amazon, eMAG) pun mare pret ,pe satisfacerea client ,ilor, as ,adar sunt foarte
atent ,i la discrepant ,ele ce pot ap ˘area între pret ,urile lor s ,i pret ,urile concurent ,ilor. În ajutor,
se pot folosi anumite tehnici atât de spionaj al piet ,ei, cât s ,i de stopare a spionajului venit
din exterior. Utilitatea principal ˘a a acestor tehnici este de a putea supraveghea în mod
automat mai multe magazine, dar s ,i pentru a obt ,ine vizibilitate în rândul cump ˘ar˘atorilor.
Succesul e-commerce-ului pe piat ,˘a se datoreaz ˘a crawlerelor web ce joac ˘a un rol cru-
cial în dezvoltare. De exemplu, se poate observa c ˘a serviciile si produsele c ˘autate recent
vor ap ˘area în topul rezultatelor c ˘aut˘arilor dumneavoastr ˘a. Aceasta ajut ˘a p˘astrarea unui
index al c ˘aut˘arilor constant actualizat, ce va include doar link-uri recent accesate. Aces ,ti
”robot ,i web” utilizeaz ˘a structuri sau modele pentru a indica URL-urile cele mai accesate
de un utilizator. Prin urmare, dac ˘a un site este accesat constant, acesta va ap ˘area în topul
c˘aut˘arilor si sugestiilor.
3
1.3. Descriere proiect
Crawlerii web nu pot desc ˘arca toate URL-urile pentru a le ar ˘ata în index deoarece
internetul este o colect ,ie infinit ˘a de date s ,i site-uri, as ,a c˘a va fi afis ,at˘a doar o mic ˘a parte
din ele. De asemenea, poate verifica important ,a acesteia pentru a decide dac ˘a va continua
s˘a afis ,eze acele URL-uri sau nu.
O dat ˘a ce un crawler descarc ˘a o pagin ˘a dorit ˘a, va trebui s ˘a fac ˘a noi verific ˘ari pentru a
vedea dac ˘a exist ˘a schimb ˘ari majore efectuate asupra datelor deja existente.
Cel mai mare impact pe care îl poate avea un crawler web este cel din domeniul de
business. Putem lua în cosiderare urm ˘atoarea situat ,ie: suntem det ,in˘atorii unui magazin
online s ,i facem comert ,de bunuri, dar s ,i de servicii. Orice comerciant îs ,i va dori ca
pret ,urile sale s ˘a fie în competit ,ie cu pret ,urile piet ,ei, astfel stabilind un nivel accesibil
pentru tot ,i cump ˘ar˘atorii. Solut ,ia este o procedur ˘a automatizat ˘a care poate s ˘a analizeze
constant un num ˘ar de site-uri s ,i informat ,iile din acestea, în cazul de fat ,˘a fiind necesare
pret ,urile produselor.
O alt ˘a modalitate prin care putem realiza act ,iunea de extragere a informat ,iilor este
cea manual ˘a îns ˘a niciodat ˘a nu vom putea aduna toate informat ,iile necesare într-un timp
util. Rolul unui crawler este mult mai simplu deoarece acesta obt ,ine tot ce este necesar
printr-o singur ˘a c˘autare. Acesta va aduna toate URL-urile legate de produsul c ˘autat s ,i le
va afis ,a într-un singur index. În continuare se vor putea analiza pret ,urile concurent ,ei s ,i
vor fi comparate cu pret ,urile propriului magazin în vederea modific ˘arii acestora pentru a
putea concura cu cometitorii.
În general se adun ˘a informat ,ii legate de denumirea produsului, pret ,urile, descrie-
rea, dar s ,i detaliile tehnice ale acestuia, îns ˘a exist ˘a cazuri în care sunt necesare s ,i alte
informat ,ii. În acest caz va trebui s ˘a modific ˘am cheile de c ˘autare în funct ,ie de dorint ,ele
noastre. Ca s ,i în cazul cerint ,elor standard, se vor aduna datele din întregul set de URL-uri
legat de c ˘autare.
Exist ˘a o multitudine de utiliz ˘ari ale crawlerelor web, cele mai importante fiind îndrep-
tate spre partea de business, deoarece se poate aduna un volum foarte mare de date referi-
toare la produsele sau serviciile pe care ni le dorim a fi analizate. De altfel, comerciant ,ii
prefer ˘a s˘a foloseasca crawlerele web pentru a cerceta pret ,urile sau pentru a monitoriza
alt,i juc˘atori de pe piat ,˘a.
În urma acestor activit ˘at,i, un comerciant on-line va det ,ine un set de date pe care va
trebui s ˘a îl analizeze s ,i s˘a îl transforme în informat ,ii ce mai târziu vor fi afis ,ate în propriul
site. În cazul în care se dores ,te o uniformizare a datelor proprii t ,inând cont de datele
competitorilor se va trece la etapa de aliniere a pret ,urilor.
Alinierea în comert ,ul on-line este o etap ˘a crucial ˘a s,i necesar ˘a pentru orice det ,in˘ator
de business de e-commerce deoarece dorint ,a principal ˘a a acestora este ca bunurile s ,i
serviciile det ,inute s ˘a poat ˘a fi vândute cu us ,urint ,˘a pe piat ,˘a. Prin urmare, pentru o mai bun ˘a
desf˘as,urare a acestei act ,iuni, denumirile s ,i respectiv pret ,urile obt ,inute din alte magazine
on-line vor trebui ret ,inute, de preferat, într-o baz ˘a de date pentru ca mai apoi s ˘a fie trecute
4
1.3. Descriere proiect
într-un format prestabilit, iar într-un final s ˘a poat ˘a fi analizate s ,i modificate.
Dup˘a parcurgerea acestor etape, comerciant ,ii vor avea un nou set de informat ,ii obt ,inute
pe baza celor adunate de la concurent ,˘a.
Ultima etap ˘a prin care va trece noul set de date va fi cea de verificare de pret ,. Având
stabilit noul set de informat ,ii, orice comerciant on-line este nevoit s ˘a îl analizeze s ,i s˘a îl
modifice în funct ,ie de propriile nevoi. Pentru a putea înt ,elege mai simplu conceptul de
verificare de pret ,sau cost, vom lua urm ˘atorul exemplu: avem un set de date obt ,inute în
urma analizei f ˘acute asupra concurent ,ei.
Urm ˘atorul nostru pas este de a vedea dac ˘a noile pret ,uri respect ˘a anumite criterii, cum
ar fi: pret ,ul de vânzare s ˘a nu fie mai mic decât pret ,ul de achizit ,ie, s˘a existe un profit
minim 10% sau ca pret ,urile s ˘a nu se schimbe la un interval mai mic de 30 de zile. Aceste
criterii sunt stabilite de fiecare comerciant în parte în vederea satisfacerii nevoilor proprii.
Dup˘a stabilirea strategiei s ,i a criteriilor de verificare de cost, se va putea decide dac ˘a
noile pret ,uri pot fi afis ,ate sau nu în site.
5
Capitolul 2
Context actual
2.1 Motivat ,ie
În primul capitol am analizat situat ,ia comerciant ,ilor on-line s ,i a cump ˘ar˘atorilor, ob-
servând o problem ˘a destul de mare pe piat ,˘a, s ,i anume necesitatea stabiliz ˘arii piet ,ei prin
metode de aliniere. În urm ˘atorul capitol vom descrie atât motivul pentru care am decis
abordarea acestui concept de aplicat ,ie, cât s ,i modul de solut ,ionare al problemei.
De ce comert ,ul on-line are nevoie de crawlerii web? [1] Pentru a putea obt ,ine un loc
pe piat ,a comerciant ,ilor on-line, fiecare magazin trebuie s ˘a aib ˘a un plan de business bine
stabilit, deoarece în acest domeniu fiecare act ,iune a concurent ,ei poate impacta în mod
egal, atât pozitiv, cât s ,i negativ vânz ˘arile propriului magazin.
Pentru a putea r ˘amâne în topul vânz ˘arilor pe piat ,a comerciant ,ilor on-line, vânz ˘atorii
îs,i monitorizeaz ˘a îndeaproape competitorii. De exemplu, Amazon dores ,te rapoarte exacte
despre cum pret ,urile produselor lor evolueaz ˘a fat ,˘a de pret ,urile magazinelor competitoare
BestBuy sau Walmart.
Pentru a afla aceste informat ,ii sau pentru a fi la curent cu posibilele promot ,ii de actu-
alitate, ei vor avea nevoie s ˘a analizeze categoriile de produse de interes ale acestor dou ˘a
site-uri. Alte informat ,ii ce mai pot fi extrase cu ajutorul crawlerelor pot fi: detalii des-
pre timpii de livrare, num ˘arul de vendori, disponibilitate s ,i recomand ˘ari despre produse
asem ˘an˘atoare.
În ultimii ani, cea mai utilizat ˘a metod ˘a de a preveni astfel de probleme a fost utilizarea
crawlerilor web, cu ajutorul c ˘arora se pot supraveghea non-stop un num ˘ar impresionant
de magazine concurente s ,i nu numai.
Cea de-a doua utilizare a acestora este de a aduna un num ˘ar impresionant de date pen-
tru a putea fi analizate mai departe în procesul de aliniere. Aceste date cont ,in informat ,ii
despre produse, cum ar fi: pret ,ul actual, imagini ale produselor, denumiri ale acestora,
descrieri, dar s ,i specificat ,ii tehnice pentru a putea asocia mai us ,or produsele între ele.
Un alt beneficiu important al crawling-ului este acela de a mentine un index actualizat al
6
2.2. Solut ,ionare
c˘aut˘arilor utilizatorilor.
În momentul în care un utilizator va c ˘auta fie un anumit tip de produs, fie o categorie
anume, aceast ˘a c˘autare va putea fi ret ,inut˘a, pentru ca mai apoi, în top-ul c ˘aut˘arilor s ˘a îi
apar˘a produsele dorite sau sugestii de produse asem ˘an˘atoare. [2]
Pe parcursul analizei pe care am f ˘acut-o asupra piet ,ei de comert ,on-line, am descoperit
numeroase discrepant ,e între magazinele concurente, dovad ˘a fiind diferent ,a mare între
pret ,urile produselor det ,inute de magazinele ce utilizeaz ˘a crawleri web s ,i cele care nu
utilizeaza nicio tehnic ˘a de aliniere.
2.2 Solut ,ionare
Pentru solut ,ionarea aceastei probleme am decis s ˘a simulez introducerea unui magazin
on-line mic pe piat ,˘a, cu un num ˘ar de aproximativ 30 de produse, alegând aceias ,i furnizori
ca cei ai marilor magazinele autohtone. Alegerea furnizorilor st ˘a la baza ideii de a obt ,ine
un pret ,de vânzare al produselor peste medie, pentru a putea obt ,ine un profit mai mare.
În majoritatea cazurilor, pe piat ,˘a, exist ˘a multiple strategii de care se poate t ,ine cont în
momentul în care se face alinierea pret ,urilor, în funct ,ie de strategia de vânzare a fiec ˘arui
comerciant, cum ar fi:
1) punerea profitului pe primul plan, ceea ce implic ˘a pret ,uri medii, un nivel al pret ,urilor
de vânzare aproximativ egal cu media general ˘a, dar s ,i posibilitatea ca loialitatea client ,ilor
s˘a scad ˘a datorit ˘a dorint ,ei lor de a avea un raport pret ,/calitate cât mai mic.
2) punerea calit ˘at,ii pe primul plan, ceea ce implic ˘a atât costuri de achizit ,ie foarte mari,
cât s ,i costuri de vânzare mari, îns ˘a exist ˘a o posibilitate ca vânz ˘arile s ˘a creasc ˘a datorit ˘a
încrederii dobândite de client ,i în serviciile de calitate oferite.
3) punerea vizibilit ˘at,ii pe primul plan, ceea ce implic ˘a pret ,uri mici spre medii, dar s ,i o
calitate mai slab ˘a a produselor. Aceast ˘a strategie este cel mai put ,in utilizat ˘a deoarece nu
satisface nevoia client ,ilor de produse cu un nivel de calitate înalt, dar nici nu va satisface
pe deplin nevoia comerciant ,ilor de a avea profit.
2.2.1 Solut ,ia software
În momentul de fat ,˘a, aplicat ,ia a fost dezvoltat ˘a luând în considerare cazul cel mai des
întâlnit pe piat ,˘a s,i anume acela al favoriz ˘arii profitului, unde pret ,urile produselor sunt
de nivel mediu, urm ˘arind trei mari comerciant ,i on-line care au adoptat aceeas ,i strategie:
eMAG, Flanco s ,i Altex. Aces ,ti trei comerciant ,i utilizeaz ˘a, de asemenea, tehnici de spio-
naj ale piet ,ei pentru a putea satisface atât client ,ii, cât s ,i propriile nevevoi. Pentru a putea
înt,elege mai bine aplicat ,ia, s-a folosit un num ˘ar de aproximativ 100 de produse din toate
cele trei magazine, s-a analizat mai întai dac ˘a specificat ,iile corespund, iar mai apoi s-au
extras pret ,urile produselor.
7
2.2. Solut ,ionare
În procesul de colectare al datelor despre produse s-a observat c ˘a acestea au pret ,uri
asem ˘an˘atoare, fiind o dovad ˘a a faptului c ˘a sunt utilizat ,i crawlerii web de tot ,i cei trei
concurent ,i.
8
Capitolul 3
Documentat ,ie tehnic ˘a
3.1 Prezentare aplicat ,ie
3.1.1 Prezentare framework utilizat
Pentru a demonstra necesitatea unei aplicat ,ii de crawling web în domeniul comert ,ului
on-line, am utilizat prin intermediul limbajului de prgramare PHP, framework-ul Symfony
4. [3]
Un framework este o colect ,ie de programe universale, reutilizabile ce îndeplinesc anu-
mite cerint ,e pentru a facilita dezvoltarea aplicat ,iilor software. În termeni metaforici, un
framework este un schelet, carcas ˘a sau baz ˘a pentru o aplicat ,ie web sau pentru dezvoltare
de website-uri. Utilizarea unui framework nu este obligatorie, dar este o practic ˘a bun ˘a
pentru a simplifica dezvoltarea. Motivele pentru utilizarea unui framework sunt:
1) Dezvoltare mai rapid ˘a; se pot reutiliza unele componente, iar timpul salvat pentru
dezvoltarea acestora poate fi folosit pentru dezvoltarea task-urilor specifice
2) Mentenant ,˘a simplificat ˘a; utilizarea unui framework impune urm ˘arirea unor struc-
turi standard s ,i a unor reguli bine stabilite. Astfel, nu va fi o problem ˘a pentru un viitor
nou dezvoltator s ˘a preia proiectul pe care alt ,i programatori l-au scris
3) Mai put ,ine probleme; codul scris cu ajutorul unui framework este curat si reduce
num˘arul de erori posibile datorate dezvolt ˘arii
4) Securitate mai mare; componentele unui framework sunt updatate în mod regulat
pentru a putea fi la zi cu noile tehnologii
O aplicat ,ie web poate fi dezvoltat ˘a în întregime în limbajul PHP sau se pot uti-
liza framework-uri special concepute pentru a us ,ura dezvoltarea aplicat ,iilor, alegerea
framework-ului depinzând de nivelul de complexitate al aplicat ,iei, experient ,a progra-
matorului s ,i mult ,i alt ,i factori. Framework-ul Symfony [4] a urcat în top 3 popularitate,
imediat dup ˘a Laravel s ,i CodeIgniter. Ast ˘azi, 82,8% dintre website-uri sunt create cu aju-
torul limbajului de programare PHP.
9
3.1. Prezentare aplicat ,ie
Acesta este un framework open source pentru dezvoltarea aplicat ,iilor web. A fost
conceput de SensioLabs pentru dezvoltarea site-urilor propriilor client ,i.
Symfony a fost lansat în anul 2005, necesitând licent ,˘a, îns ˘a, în prezent, este unul
dintre cele mai utilizate framework-uri pentru dezvoltarea în PHP [5]. Sust ,inut de Sen-
sioLabs, Symfony ofer ˘a numeroase resurse, cum ar fi: suport din partea comunit ˘at,ii de
utilizatori Symfony, documentat ,ie bogat ˘a s,i, în special, suport profesional ce poate consta
în consultant ,˘a s,i traininguri [6].
Motive pentru alegerea framework-ului Symfony:
1)Flexibilitate mare
Symfony este unul dintre cele mai bogate framework-uri în materie de facilit ˘at,i. Dou ˘a
dintre cele mai importante beneficii ale acestei tehnologii sunt Bundle-urile si Compo-
nentele. Bundle-urile sunt asem ˘an˘atoare plugin-urilor, iar cel mai mare beneficiu pe care
bundle-urile îl aduc este faptul c ˘a sunt independente. Se pot face reconfigur ˘ari s ,i reutili-
zari pentru multe aplicat ,ii diferite în vederea reducerii costului de dezvoltare.
Componentele sunt caracteristici generice pentru reducerea task-urilor de rutin ˘a, ce
ajut˘a programatorii s ˘a se poat ˘a concentra pe dezvolt ˘arile de business, existând aproxima-
tiv 30 de componente Symfony ce faciliteaz ˘a acest proces. Componentele pot fi folosite
independent, putând ad ˘auga s ,i module personalizate f ˘ar˘a a impacta arhitectura. Compo-
nentele Symfony pot fi, de asemenea, utilizate independent s ,i în alte framework-uri(ex.
Laravel).
Bundle-urile s ,i componentele elimin ˘a dependint ,ele stricte din arhitectur ˘a. Cu cât
exist ˘a mai put ,ine dependint ,e, cu atât este mai us ,or s˘a facem schimb ˘ari f˘ar˘a riscul de a
impacta alte p ˘art,i ale sistemului. Astfel, solut ,iile se pot adapta la orice cerint ,˘a sau scena-
riu pentru a face aplicat ,iile flexibile.
2)Compania din spatele tehnologiei
Symfony este unul dintre put ,inele framework-uri cu sprijin comercial. SensioLabs,
creatorul s ,i sponsorul contribuie constant la reputat ,ia acestuia, ei furnizeazând tutoriale
oficiale s ,i certific ˘ari pentru a ajuta utilizatorii.
3)Sigurant ,˘a
Symfony s-a dovedit a fi de încredere de-a lungul timpului în timp ce multe alte
framework-uri au es ,uat. Multe platforme importante precum phpBB, Drupal, Magento s ,i
eZ Publish folosesc componentele sale.
4)Testare us ,oar˘a
Fiecare linie nou ˘a de cod ar trebui s ˘a fie testat ˘a pentru a garanta stabilitatea unei
aplicat ,ii. Reutilizarea de bundle-uri, lipsa unor depentint ,e stricte s ,i posibilitatea de a
crea design pattern-uri contribuie la o mai bun ˘a mentenant ,˘a s,i testare în Symfony. Testele
unitare sunt foarte utile s ,i us,oar de utilizat deoarece se folosesc de biblioteca independent ˘a
PHPUnit. Testarea funct ,ional ˘a este, de asemenea automatizat ˘a pentru a reduce rutina
programatorilor.
10
3.1. Prezentare aplicat ,ie
5)Suport pe termen lung
Symfony este un framework stabil s ,i foarte bine testat, ce primes ,te update-uri regulate
pentru a putea îmbun ˘at˘at,i lucrul cu el s ,i pentru a rezolva posibilele probleme ce apar pe
parcurs legate de mentenant ,˘a. Cea mai recent ˘a versiune a Symfony-ului are suport pe
termen lung s ,i este compatibil ˘a cu cele mai noi lans ˘ari.
6)Comunitate extins ˘a
Unul dintre aspectele importante ale supraviet ,uirii acestui framework este o comuni-
tate ce ofer ˘a suport. Site-ul oficial declara peste 2000 de contribuitori, un numar ce îl
dep˘as,es,te pe cel al Github-ului(1740 de contribuitori). Acest num ˘ar de contribuitori este
de câteva ori mai mare decat al oric ˘arui alt framework PHP.
De ce comunitatea conteaz ˘a? Nu doar dezvoltatorii de baz ˘a lucreaz ˘a la îmbun ˘at˘at,iri,
Symfony-ul fiind un framework open-source. Aceasta înseamn ˘a c˘a expertii PHP s ,i entuzias ,tii
de peste tot iau parte la îmbun ˘at˘at,irea framework-ului, creându-se, de-a lungul timpului,
o leg ˘atur˘a strâns ˘a de colaborare.
7)Documentat ,ie
Documentat ,iile incomplete sau învechite pot fi un impediment pentru tot ,i programa-
torii, fiind una din cele mai mari probleme ale multor tehnologii. Documentat ,ia Symfony
este considerat ˘a una dintre ccele mai bune în comparat ,ie cu cea a altor framework-uri
PHP. Aceasta este bine structurat ˘a, având multe exemple s ,i updatat ˘a de la versiune la
versiune, putând fi g ˘asite explicat ,ii pentru fiecare component ˘a în parte s ,i procesul de
dezvoltare.
În concluzie, un framework vizeaz ˘a simplificarea, dar s ,i us,urarea procesului de dezvol-
tare, Symfony fiind un framework puternic s ,i robust.
Proiectele create cu ajutorul acestei platforme sunt foarte us ,or de extins datorit ˘a ar-
hitecturii bazate pe module. Utilizarea bundle-urilor s ,i a componentelor ajut ˘a la g ˘asirea
unor solut ,ii foarte bune pentru aplicat ,iile s ,i site-urile web de orice dimensiune sau com-
plexitate. Des ,i nu este us ,or de înt ,eles sau înv ˘at,at, se pot g ˘asi rapid documentat ,ii utile,
cursuri oficiale s ,i suport din partea comunit ˘at,ii.
Des ,i viteza sau performant ,a nu sunt punctele forte ale framework-ului Symfony, pro-
gramatorii experimentat ,i pot dep ˘as,i problemele ce pot ap ˘area datorit ˘a aplicat ,iilor supra-
înc˘arcate. [7]
3.1.2 Prezentare editorului utilizat
Codul aplicat ,iei a fost scris în editorul JetBrains-PhpStorm 2018, Figura 3.1.
Acesta este un software global specializat în crearea de tool-uri inteligente, ce cresc
productivitatea pentru programatorii de aplicat ,ii software s ,i echipe. Compania JetBrains
ofer˘a suport atât pentru SQL, cât s ,i pentru numeroase limbaje de programare precum:
Java, Kotlin, Ruby, Python, PHP, C, Objective-C, C++, Go s ,i JavaScript.
11
3.1. Prezentare aplicat ,ie
Figura 3.1: PhpStorm
PhpStorm este perfect pentru lucrul cu Symfony, Laravel, Drupal, WordPress s ,i multe
alte framework-uri. Editorul analizeaz ˘a codul scris de programator, înt ,elege structura s ,i
ofer˘a suport pentru toate caracteristicile limbajului PHP, oferind cele mai bune complet ˘ari
de cod, refactoriz ˘ari, erori on-the-fly s ,i multe altele. Tehnologiile de front-end sunt s ,i
ele incluse, putând fi folosite cele mai noi dintre ele, precum HTML 5, CSS, Saas, Less,
Stylys, CoffeeScript, TypeScript, Emmet s ,i JavaScript, cu refactoriz ˘ari, debugging s ,i teste
unitare disponibile.
Mult ,umit ˘a VCS(Version Control System), se pot rula mai multe rutine deodata, direct
din IDE.
Sute de verific ˘ari au grij ˘a s˘a supravegheze constant codul în timp ce este scris, ana-
lizând întregul proiect. Sprijinul PHPDoc, aranjamentul codului s ,i formatarea acestuia,
fix-urile rapide s ,i alte propriet ˘at,i ajut ˘a la scrierea unui cod curat, ce respect ˘a regulile de
baz˘a s,i este us ,or de ment ,inut.
Refactorizarea fiabil ˘a a codului cu ajutorul comenzilor de Rename, Move, Delete,
Extract Method, Inline Variable s ,i multe altele ajut ˘a la efectuarea schimb ˘arilor la nivel de
proiect prin intermediul unor click-uri, toate schimb ˘arile putând fi anulate.
PhpStorm este renumit pentru configurat ,ia Visual Debugger, ce furnizeaz ˘a o extraor-
dinar ˘a privire de ansamblu a ceea ce apare în aplicat ,ie la fiecare pas. Lucreaz ˘a cu Xdebug
s,i Zend Debugger s ,i poate fi utilizat atât local cât s ,i remote. Testele unitare cu PHPUnit,
BDD cu Behat si integrarea profilului sunt, de asemenea, disponibile. [8]
Pas ,ii pentru a configura mediul de lucru:
PhpStorm este un IDE inteligent, dar mai întâi trebuie s ˘a stabilim ce mediu de lucru
PHP folosim, ce componente PHP sunt stocate s ,i cum sunt configurate acestea.
12
3.1. Prezentare aplicat ,ie
Figura 3.2: Interfat ,˘a PhpStorm
Înainte de a începe, se va instala Docker pentru sistemul de operare, iar in PhpStorm,
în sect ,iunea Settings/Preferences, se acceseaz ˘a Build,E xecution, Deployment | Docker s ,i
se selecteaz ˘a modul de conexiune la Docker daemon [9].
1) Se deschide un proiect in PhpStorm
Cre˘am un proiect nou, select ˘am PhpStorm Workshop Project din lista ce va fi afis ,at˘a
în partea stâng ˘a a ecranului, acces ˘am docker-compose.yml din editor s ,i updat ˘am variabila
XDEBUG CONFIG cu valoarea care este stabilit ˘a de sistemul nostru de operare. Aceast ˘a
act,iune este necesar ˘a pentru Web Debugging.
Tot în fis ,ierul docker-compose.yml, decoment ˘am linia cea mai apropiat ˘a de serviciul
sftp în funct ,ie de sistemul nostru de operare. Aceast ˘a act ,iune este necesar ˘a pentru imple-
ment ˘ari corecte.
Mai apoi acces ˘am terminalul PhpStorm s ,i execut ˘am comanda "docker-compose up".
2) Explorarea interfet ,ei Figura 3.2.
Meniul principal al PhpStorm este divizat în câteva zone logice.
i) meniuri si toolbar-uri ce ajut ˘a la execut ,ia a numeroase comenzi
ii) bara de navigat ,ie pentru a naviga în interiorul proiectului
iii) bara de status cu numeroase informat ,ii referitoare la PhpStorm, proiectul curent
sau un fis ,ier în editor, mesaje de erori sau mesaje de atent ,ionare
iv) editorul unde se poate scrie codul aplicat ,iilor. Acesta prezint ˘a numeroase file
pentru a naviga us ,or prin fis ,ierele deschise
13
3.1. Prezentare aplicat ,ie
v) fereastra cu tool uri ce îndeplines ,te diferite funct ,ionalit ˘at,i: ajut ˘a la explorarea s ,i na-
vigarea prin proiect s ,i fis ,ierele sale, vizualizare, c ˘autare s ,i reguli de inspect ,ie ale codului,
rulare, debug s ,i testare de aplicat ,ii, lucru cu console interactive s ,i multe altele.
3) Scrierea de cod cu ajutorul asistent ,ei inteligente
PhpStorm are grij ˘a de rutine pentru ca dezvoltatorul s ˘a se poat ˘a concentra pe ce este
mai important. Este recomandat ˘a folosirea tuturor aptitudinilor PhpStorm pentru a creea
aplicat ,ii f˘ar˘a erori, f ˘ar˘a a irosi timp util.
i) Autocompletarea codului
– este util ˘a în vederea salv ˘arii timpului fat ,˘a de scrierea în întregime a acestuia. Exist ˘a
dou˘a tipuri de autocompletare în PhpStorm:
a)completarea de baz ˘a(Ctrl+Space) sugereaz ˘a opt ,iunile de completare pentru contex-
tul curent s ,i arat ˘a membrii tipului curent necesar. Pentru mai multe sugestii se apas ˘a
Ctrl+Space pentru înc ˘a o dat ˘a.
b)completarea inteligent ˘a(Strl+Shift+Space) analizeaz ˘a contextul în care se lucreaz ˘a
s,i ofer ˘a sugestii mai precise, bazate pe analiza unei liste de funct ,ii s,i variabile pentru a se
potrivi cu tipul expresiei
ii) Act ,iunile de intent ,ie
PhpStorm urm ˘ares ,te activitatea dezvoltatorului pentru a face sugestii inteligente, nu-
mite act ,iuni de intent ,ie, pentru a salva timpul acestuia. În cazul în care codul aplicat ,iei
face referint ,˘a la un fis ,ier care nu exist ˘a, se apas ˘a tastele Alt+Enter s ,i se selecteaz ˘a Create
file <filename>. Pentru a vedea o list ˘a complet ˘a a act ,iunilor de intent ,ie disponibile, se
acceseaz ˘a în set ˘ari Editor| Intentions.
4) P˘astrarea unui cod curat
PhpStorm monitorizeaza codul s ,i încearc ˘a s˘a îl p ˘astreze corect s ,i curat. Detecteaz ˘a
potent ,ialele erori s ,i probleme s ,i sugereaz ˘a rezolv ˘ari rapide pentru acestea. De fiecare dat ˘a
când PhpStorm observ ˘a cod neutilizat, bucle interminabile, operatori utilizat ,i în mod ero-
nat, se va observa un semnal de eroare. Pentru a-l solut ,iona, se apas ˘a pe acesta pictograma
care îl reprezint ˘a.
5) Generarea de cod
Generatorul de cod aflat în sect ,iunea The Code | Generate ajut ˘a dezvoltatorii la gene-
rarea constructorilor, getteri/setteri, comentarii PHPDoc sau sugestii de suprascriere/im-
plementare a unor metode.
6) G˘asirea de metode s ,i clase prin accesarea c ˘aii directe
Existent ,a unor proiecte mari sau proiectele dezvoltate de alt ,i programatori creeaz ˘a de
multe ori probleme
i) c˘autarea de baz ˘a – folosit ˘a pentru a c ˘auta un anumit simbol în proiect, cât s ,i în
interiorul unui anumit fis ,ier sau director.
ii) navigarea prin proiect
– c˘autarea pretutindeni permite c ˘autarea de clase, fis ,iere, simboluti s ,i act ,iuni de meniu.
14
3.1. Prezentare aplicat ,ie
Figura 3.3: Interfat ,˘a PhpStorm
Dac˘a nu se specific ˘a un anumit model de c ˘autare, PhpStorm va sugera o list ˘a a fis ,ierelor
recent accesate unde se poate naviga printr-un click.
– c˘atre declarat ,ie; duce c ˘atre locat ,ia unde un simbol anume este declarat pentru prima
oar˘a. Acest tip de c ˘autare funct ,ioneaz ˘a din orice loc al codului surs ˘a, chiar dac ˘a dintr-o
alt˘a clas ˘a sau comentariu.
– c˘atre implementare; duce c ˘atre implementarea unei clase particulare. Dac ˘a exist ˘a
mai multe implement ˘ari, PhpStorm arat ˘a o list ˘a unde se pot selecta cele relevante pentru
a naviga c ˘atre.
iii) navigarea prin cronologie
PhpStorm p ˘astreaz ˘a automat calea unde au fost f ˘acute modific ˘arile în cod, rezultatele
refactoriz ˘arii s ,i chiar s ,i istoricul local.
7) Depanarea aplicat ,iei
Pentru a stabili de ce aplicat ,ia nu îndeplines ,te cerint ,ele pentru care a fost conceput ˘a,
va necesita o c ˘autare mai am ˘anunt ,it˘a ce se poate solut ,iona prin depanarea acesteia.
Depanarea poate fi f ˘acut˘a astfel:
i) Setarea de breakpoint-uri – depanarea începe prin a seta un breakpoint în locul în
care execut ,ia programului necesit ˘a a fi întrerupta pentru a putea fi analizate datele.
ii) începerea depan ˘arii – PhpStorm începe sesiunea de depanare s ,i deschide fereastra
de Debug Tool unde se poate trece prin punctele de întrerupere, se pot vedea valorile
variabilelor, se pot evalua expresiile s ,i mult mai mult de atât.
8) Testarea codului Figura 3.3.
PhpStorm integreaz ˘a cele mai populare framework-uri de testare în PHP cum ar fi
PHPUnit, PHPSpec s ,i Codeception.
i) Scrierea testelor
Pentru a scrie teste, se navigheaz ˘a c˘atre clasa pe care vrem s ˘a o test ˘am. PhpStorm va
genera o clas ˘a de test pe care o va deschide în editor.
ii) rularea testelor
Se deschide fis ,ierul pe care vrem s ˘a îl rul ˘am în editor, iar mai apoi se ruleaz ˘a. Astfel
se va rula configurat ,ia de PHPUnit ce este generat ˘a automat.
9) P˘astrarea codului surs ˘a sub Version Control.
P˘astrarea codului surs ˘a sub versiunile de control duce la integrarea cu multiple sisteme
15
3.1. Prezentare aplicat ,ie
Figura 3.4: MTPutty
precum: Git, Mercurial, Perforce s ,i Subversion.
3.1.3 Prezentare client SSH utilizat
Pentru a putea rula aplicat ,ia, am avut nevoie de MTPutty Figura 3.4. , un client
SSH ce permite conectarea la unul sau mai multe sisteme remote [10]. Dup ˘a desc ˘arcarea
acestuia, am setat numele serverului, protocolul, portul s ,i o parol ˘a ce ne vor permite
logarea în interfat ,˘a.
Pentru a putea t ,ine o evident ,˘a a datelor, acestea trebuie s ˘a fie salvate într-o baz ˘a de
date. Am ales o baz ˘a de date MySQL, anume HeidiSQL, ce este un software gratis, având
o interfat ,˘a intuitiv ˘a [11].
3.1.4 Prezentare baz ˘a de date utilizat ˘a
Pentru implement ˘ari viitoare vom putea folosi si o baz ˘a de date tip NoSQL, anume
MongoDB [12], o baz ˘a de date scalabil ˘a s,i de tip agile, scris ˘a în C++, orientat ˘a spre date
de dimensiuni mai mari.
HeidiSQL [13], s ,tiut înainte ca MySQL-Front, este un instrument de administrare
gratuit s ,i open-source pentru MySQL, la fel ca Microsoft SQL Server s ,i PostgreSQL.
Este alegerea principal ˘a a multor dezvoltatori datorit ˘a vitezei cu care se poate utiliza.
Pentru a putea administra bazele de date cu ajutorul HeidiSQL, utilizatorii trebuie s ˘a se
logheze pe un server local sau remote MySQL cu un user s ,i o parol ˘a acceptate, creând
astfel o sesiune de login. Cu ajutorul acestei sesiuni se pot administra bazele de date tip
MySQL cât timp exist ˘a o conexiune la server.
HeidiSQL permite navigarea s ,i editarea datelor, crearea s ,i editarea de tabele, vizuali-
16
3.1. Prezentare aplicat ,ie
Figura 3.5: HeidiSQL
zare, proceduri, triggere s ,i planificare evenimente. De asemenea, se pot exporta structuri
s,i date în fis ,iere SQL, clipboard-uri sau c ˘atre alte servere.
Acesta poate rula în regul ˘a pe Windows 7, Vista s ,i chiar Windows XP, de asemenea
s,i pe Linux, prezent ˘a în Figura 3.5.
HeidiSQL are urm ˘atoarele caracteristici s ,i compatibilit ˘at,i:
1) Conexiune server
– sesiuni multiple salvate cu ajutorul conexiunii s ,i credent ,ialelor
– interfat ,˘a cu serverele prin TCP/IP sau protocoale tip tunneling(SSH)
– sesiuni multiple paralele
– administreaza utilizatorii de pe server: adaugare, s ,tergere, editare s ,i credent ,ialele
acestora
– administreaza privilegiile utilizatorilor global sau pentru baza de date
– ferestre multiple pentru query-uri
2) Server
– vizualizare s ,i filtrare pentru toate variabilele serverului, precum systemTimeZone
– editare variabile server, fie pentru sesiunea actual ˘a, fie pentru un scop global
– vizualizare variabile statistice ale serverului, media valorilor pe or ˘a s,i secund ˘a
3) Baze de date
– vizualizare toate bazele de date de pe server, conexiune la o singur ˘a baz ˘a de date
pentru a lucra cu tabelele s ,i datele sale
– vizualizare total baze de date conectate s ,i m˘arimile tabelelor în KB/MB/GB în struc-
tur˘a
– creare de noi baze de date, alterarea celor existente, setare de caractere, s ,tergere baze
de date
4) Tabele, vizualiz ˘ari, proceduri, triggere s ,i evenimente
17
3.1. Prezentare aplicat ,ie
Figura 3.6: Conexiune MySQL
– vizualizarea tuturor obiectelor din baza de date selectat ˘a, golire, redenumire s ,i ster-
gere obiecte
– editare coloane, indecs ,i s,i chei str ˘aine. Sunt suportate coloanele virtuale si serverele
MariaDB
– editare, vizualizare query s ,i set˘ari
– editare proceduri s ,i parametri
– editare trigger s ,i set˘ari
Pas ,ii pentru a accesa bazele de date:
1) Acceptarea unei conexiuni MySQL remote din adresa IP
Pentru început, trebuie aflat ˘a adresa IP utilizând orice instrument on-line. O modali-
tate pentru a-l afla este cu ajutorul motorului de c ˘autare Google, scriind "Care este adresa
mea IP". Mai apoi, se navigheaz ˘a c˘atre sect ,iunea Remote MySQL în panoul de control
al gazdei web. Este necesar s ˘a fie ad ˘augat IP-ul public pentru a permite conexiunea bazei
de date. În aceast ˘a sect ,iune se vor g ˘asi s ,i numele gazde ale MySQL-ului remote, care vor
fi folosite mai târziu.
Un exemplu exist ˘a în Figura 3.6, unde HOST este folosit pentru a introduce adresa
IP public ˘a, iar Database pentru a selecta în MySQL baza de date la care vrem s ˘a ne
conect ˘am. Dup ˘a completarea acestora, se apas ˘a butonul Create s ,i se va primi un mesaj de
confirmare, urmând s ˘a putem accesa baza de date remote.
2) Culegerea de detalii ale bazei MySQL
Pentru cel de-al doilea pas, vom avea nevoie de informat ,iile bazei de date. Pentru a
putea obt ,ine credent ,ialele necesare, este nevoie de accesarea sect ,iunii MySQL Databases
din panoul de control. Odat ˘a ce am setat denumirile în pas ,ii anteriori, avem nevoie doar
de numele bazei de date s ,i de utilizator.
3) Configurarea clientului HeidiSQL
Se acceseaz ˘a baza de date s ,i se apas ˘a "New" pentru a crea o nou ˘a intrare, careia i se
va aloca o denumire s ,i se completeaz ˘a configur ˘arile bazei de date MySQL. Urm ˘atoarele
câmpuri sunt necesare pentru a fi completate:
18
3.1. Prezentare aplicat ,ie
Figura 3.7: Conexiune Heidi
– Network Type – se seteaz ˘a ca MySQL(TCP/IP)
– Hostname/IP – se introduce numele gazd ˘a al MySQL-ului remote descris la punctul
1)
– User – introducem userul bazei de date MySQL descris la punctul 2)
– Password – introducem parola
– Port – portul în mod implicit pentru conexiunile locale sau remote este 3306
– Databases – numele bazei de date descris la punctul 2)
Odat ˘a completate, se apas ˘a butonul Open pentru a accesa baza de date, Figura 3.7.
3.1.5 RabbitMQ
RabbitMQ este un broker de mesaje care face dezvoltarea de sisteme distribuite mult
mai us ,oar˘a pentru programatori [14].
Mesajele permit aplicat ,iilor s ˘a se conecteze s ,i scaleze. Aplicat ,iile se pot conecta între
ele ca s ,i componente ale unei aplicat ,ii mai mari, sau c ˘atre dispozitive sau date. Trimiterea
de mesaje este asincron ˘a, decuplând aplicat ,iile prin separarea mesajelor trimise de cele
primite.
Trimiterea unor date, operat ,iile non-blocante sau notific ˘arile, publicarea/abonarea,
procesele asincrone sau lucrul cu cozi formeaz ˘a o parte a unor mesaje.
RabbitMQ este un broker de mesaje, un intermediar pentru a trimite mesaje, acesta
furnizând aplicat ,iilor o platform ˘a comun ˘a pentru a trimite s ,i primi mesaje s ,i, de aseme-
nea, un loc sigur pentru mesaje de a as ,tepta pân ˘a sunt primite [15].
Acesta ofer ˘a o varietate de caracteristici pentru a l ˘asa programatorul s ˘a interschimbi
performant ,a cu fiabilitatea, incluzând persistent ,a, livrarea de cunos ,tint ,e, cornfirm ˘ari de
edit˘ari s ,i disponibilitate mare.
Mesajele sunt rutate prin schimburi înainte de sosirea la cozi. RabbitMQ are mai
19
3.1. Prezentare aplicat ,ie
multe tipuri de schimburi încorporate pentru logica de rutare tipic ˘a. În cazul în care se
dores ,te rutare complex ˘a, se pot lega mai multe schimburi împreun ˘a sau scrie noul tip de
schimb ca un plugin.
Mai multe servere RabbitMQ într-o ret ,ea local ˘a pot fi grupate împreun ˘a, formând un
singur broker logic. Pentru serverele ce necesit ˘a s˘a fie mai mult libere s ,i nesigure decât
permite un cluster, RabbitMQ ofer ˘a un model.
Cozile pot fi oglindite peste mai multe mas ,ini dintr-un cluster, asigurând faptul c ˘a s,i în
cazul unei erori de hardware, mesajele vor fi în sigurant ,˘a. RabbitMQ suport ˘a mesageria
pe o varietate de protocoale de comunicat ,ie.
RabbitMQ vine cu o interfat ,˘a us ,or de utilizat, accesibil ˘a utilizatorilor ce permite mo-
nitorizarea s ,i controlul fiec ˘arui aspect al brokerului de mesaje utilizat.
Dac˘a sistemul de mesagerie nu funct ,ioneaz ˘a corect, RabbitMQ ofer ˘a suport pentru
detectarea traseului anterior pentru a putea afla de unde a provenit problema.
Pentru a putea înt ,elege RabbitMQ, trebuie analizate apelurile tip jQuery AJAX. Un
apel AJAX este distribuit prin calculul cu mesaje. Dac ˘a exist ˘a un browser web pe com-
puterul cuiva s ,i un server web as ,teptând undeva în internet, când browserul web va face
un apel AJAX prin jQuery, va lua parametrii ”datelor” s ,i îi va pasa c ˘atre serverul web.
Serverul se uit ˘a la URL-ul asupra c ˘aruia s-a f ˘acut solicitarea, la datele prev ˘azute s ,i
lucreaz ˘a pe baza acestora.
Va trimite un r ˘aspuns înapoi la browser, fie c ˘a este unul instantaneu ce confirm ˘a c˘a
munca a fost f ˘acut˘a, fie un simplu ”200 ok” ce reprezint ˘a c˘a mesajul a fost primit sau
orice altceva. Munca adit ,ional ˘a va putea fi f ˘acut˘a pe serverul web f ˘ar˘a ca browserul web
s˘a s,tie. Aceasta se numes ,te tehnic ˘a de calcul distribuit ˘a, mutarea unor task-uri dintr-un
sistem în altul.
Dac˘a un apel AJAX este o tehnic ˘a de calcul distribuit ˘a pentru browserele web, atunci
RabbitMQ este o tehnic ˘a de calcul distribuit ˘a pentru servere. În loc s ˘a se ocupe cu cererile
tip HTTP ce pot fi expuse în internet, RabbitMQ este mai mult utilizat pentru servicii de
back-end.
RabbitMQ este un model ”intermediat”
Serverul RabbitMQ în sine este situat între codul ce face cererea s ,i codul ce gestio-
neaz ˘a cererea.
Din aceast ˘a cauz ˘a, codul ce produce mesajele nu s ,tie nimic de codul ce consum ˘a
mesajele. Ultimul tert ,(serverul de RabbitMQ) este situat între produc ˘atorul de mesaje s ,i
consumator. Acesta permite o decuplare complet ˘a a celor dou ˘a servicii.
Des ,i se creeaz ˘a o complexitate mai mare, de asemenea furnizeaz ˘a multe oportunit ˘at,i
pentru îmbun ˘at˘at,irea arhitecturii sistemului, cres ,terea robustet ,ii, permiterea mai multor
sisteme, limbaje s ,i platforme pentru a lucra împreun ˘a.
RabbitMQ permite serviciilor software s ˘a comunice prin distant ,a logic ˘a s,i fizic ˘a, uti-
lizând documente tip JSON.
20
3.1. Prezentare aplicat ,ie
Figura 3.8: Interfat ,˘a RabbitMQ
Permite rezolvarea unor noi categorii de probleme în lumea de azi a aplicat ,iilor web,
cum ar fi:
1) Împinge munca în procese de fundal, eliberând serverul web pentru a putea sust ,ine
mai mult ,i utilizatori
2) Scaleaz ˘a cele mai frecvent utilizate p ˘art,i ale sistemului, f ˘ar˘a a fi nevoit s ˘a scaleze
tot procesul
3) Manevreaz ˘a cu us ,urint ,˘a foarte mare ceea ce ar putea fi probleme catastrofice
4) Are de-a face cu timpi de r ˘aspuns aparent imposibili
5) Permite serviciilor s ˘a fie scrise în diferite limbi pe platforme diferite.
Beneficiile pe care le reprezint ˘a RabbitMQ sunt beneficiile tehnicilor de calcul distri-
buite s ,i a mesajelor (Figura 3.8).
3.1.6 PHP DOM – lucrul cu XML
SimpleXML permite lucrul rapid, eficient s ,i us ,or cu documentele XML, iar în ma-
joritatea cazurilor, SimpleXML este suficient. Dac ˘a se dores ,te a se lucra cu XML-uri
într-o manier ˘a profesional ˘a, la o capacitate mare, exist ˘a posibilitatea de a avea nevoie
de propriet ˘at,i care nu sunt suportate de SimpleXML, iar în acest caz se va folosi PHP
DOM(Document Object Model) [16].
PHP DOM este o implementarea a standardului W3C DOM s ,i ader ˘a mai mult la mo-
delul de obiect decât o face SimpleXML. Aceast ˘a metod ˘a, des ,i implic ˘a o aprofundare a
documentat ,iei s ,i o înt ,elegere foarte bun ˘a a utiliz ˘arii, este o modalitate foarte bun ˘a de con-
trol asupra lucrului cu XML, putând s ˘a acces ˘am s ,i s˘a manipul ˘am cu us ,urint ,˘a documente
XML. Acest fapt se datoreaz ˘a variilor elemente constituente ale documentelor XML, pre-
cum diferitele tipuri de noduri.
21
3.1. Prezentare aplicat ,ie
Unul dintre cele mai importante lucruri în înt ,elegerea DOM-ului este conceptul de
nod. Un nod este, în esent ,˘a, orice element conceptual din documentul XML. Dac ˘a este
un element, atunci poate fi un nod. Dac ˘a este un atribut, atunci, la fel ca la element, este
v˘azut de DOM ca un nod. Nodurile ofer ˘a structura atomic ˘a a documentului XML.
Subclasele DOMNode ale PHP DOM ofer ˘a clase copii ce reprezint ˘a aspecte diferite
ale documentului. Deci, DOMDocument mos ,tenes ,te clasa DOMNode. DOMElement s ,i
DOMAttr mos ,tenesc, la fel, clasa DOMNode. Având o clas ˘a p˘arinte comun ˘a, permite
programatorului s ˘a aib ˘a metode comune s ,i propriet ˘at,i ce sunt disponibile pentru toate no-
durile, la fel ca cele utilizate pentru determinarea tipului nodurilor, valorilor sau eventual
s˘a se fac ˘a ad˘aug˘ari.
Clasa numit ˘a "Library" ofer ˘a metode pentru funct ,ionalit ˘at,ile cerute. Are, de aseme-
nea, un constructor s ,i un destructor, propriet ˘at,i interne pentru a stoca DOM Documentul
s,i calea c ˘atre fis ,ierul XML. Operat ,iile variate ce sunt executate asupra DOM Document
s,i calea sunt utilizate pentru a salva arborele ca XML, înapoi la sistemul de fis ,iere.
Constructorul este proiectat pentru a lua calea din documentul XML pe care vrem
s˘a o folosim ca argument. Exist ˘a câteva teste care se pot face pentru a ne asigura c ˘a
documentul este valid.
Primul test pentru a determina dac ˘a documentul înc ˘arcat utilizeaz ˘a biblioteca "doc-
type". Fiecare DOMDocument are proprietatea public ˘a doctype ce returneaz ˘a doctype-ul
uilizat de documentul XML.
Cel de-al doilea test este de a ne asigura dac ˘a definit ,ia utilizat ˘a este conceput ˘a într-o
manier ˘a corect ˘a, utilizând una din propriet ˘at,ile sistemId sau publicId.
Cel de-al treilea test este acela de a ne asigura c ˘a documentul în sine este valid, în
conformitate cu documentul DTD. Validarea documentului verific ˘a, de asemenea, dac ˘a
documentul este bine format s ,i dac ˘a ader ˘a la DTD-ul pe care este bazat.
O dat ˘a ce toate aceste condit ,ii sunt îndeplinite, se salveaz ˘a o referint ,˘a c˘atre documen-
tul înc ˘arcat s ,i calea c ˘atre fis ,ierul XML ca propriet ˘at,i interne pentru a fi folosite mai târziu
de alte metode ale claselor. Dac ˘a în orice punct al testelor, acesta d ˘a gres ,, se arunc ˘a o
eroare.
<?php
public function __construct($xmlPath) {
//loads the document
$doc = new DOMDocument();
$doc->load($xmlPath);
//is this a library xml file?
If ($doc->doctype->name != "library" ||
$doc->doctype->systemId != "library.dtd") {
throw new Exception("Tip de document invalid");
22
3.1. Prezentare aplicat ,ie
}
//iverificare dac [U+FFFD] documentul este valid
if($doc->validate()) {
$this->domDocument = $doc;
$this->xmlPath = $xmlPath;
}
else {
throw new Exception("Document invalid");
}
}
Metoda de destructor elibereaz ˘a orice memorie utilizat ˘a de variabila $domDocument.
Pentru a face unset la aceast ˘a proprietate, se apeleaz ˘a în interiorul destructorului secvent ,a
de cod "unset($this->domDocument);".
Urm ˘atoarea metod ˘a important ˘a pentru DOMDocument este ad ˘augarea de elemente în
baza de date a XML-ului.
O modalitate de a efectua acest lucru este de a utiliza metoda createElement() s ,i de
a ad˘auga noul nod la document s ,i de a seta referint ,a pentru a putea opera cu noul obiect
începând cu acel punct.
Când se creeaz ˘a un nou element, acesta trebuie ad ˘augat documentului. Utilizând
metoda createElement(), aceasta nu va ad ˘auga automat documentului. Asociz ˘a elementul
cu documentul, dar va r ˘amâne în acest punct cu dezvoltarea.
Pentru a identifica elementul r ˘ad˘acin˘a al documentului XML, se poate utiliza propri-
etatea documentElement. Dac ˘a nu se va proceda în acest fel, ci doar se va ad ˘auga în mod
direct în document, vom ad ˘auga, de fapt, un copil la sfârs ,itul documentului. De aici vor
rezulta erori în document.
Cele dou ˘a metode, setAttribute() s ,i setAttributeNode() sunt responsabile pentru ad ˘au-
garea s ,i modificarea atributelor asociate cu elementele. Dac ˘a atributele nu exist ˘a, acestea
necesit ˘a a fi create. Dac ˘a exist ˘a, ele pot fi updatate.
Urm ˘atoarea metod ˘a cheie a DOMDocument este cea de a elimina. În acest caz trebuie
s˘a identificam mai întâi ce element din documentul XML vrem s ˘a s,tergem, pentru ca mai
apoi s ˘a folosim metoda de removeChild() pentru a-l putea elimina.
Trebuie s ˘a se t ,in˘a cont de dou ˘a lucruri importante:
1) În primul rând, este imposibil s ˘a elimin ˘am în mod direct un copil al unei instant ,e
al DOMDocument. Trebuie s ˘a acces ˘am documentElement s ,i s˘a s,tergem copilul de acolo.
Acest lucru este necesar din aceleas ,i motive ca în cazul ad ˘aug˘arii unui element.
2) În cel de-al doilea rând, s ,tergerea unui element dintr-un document doar îl elimin ˘a
din memorie. Dac ˘a se dores ,te persistarea datelor, acestea vor trebui salvate într-un fis ,ier.
Metoda de s ,tergere a DOMDocument:
23
3.1. Prezentare aplicat ,ie
<?php
public function deleteBook($isbn) {
// se ia elementul book bazat pe id
$book = $this->domDocument->getElementById($isbn);
// the documents [U+FFFD] tergerea elementelor copil din document
// documentElement
$this->domDocument->documentElement->removeChild($book);
// salvare
$this->domDocument->save($this->xmlPath);
}
Identificarea în funct ,ie de gen
Metoda pentru a identifica anumite caracteristici în funct ,ie de gen este bazat ˘a în ge-
neral pe XPath-uri pentru a obt ,ine rezultatele dorite.
getElementById() este un mod convenabil de a alege elementele în afara DOM-ului,
acolo unde avem declarate ID-uri prin intermediul fis ,ierului DTD.
3.1.7 Dezvoltare
În aplicat ,ia dezvoltat ˘a în vederea alinierii pret ,urilor unui magazin la pret ,urile concurent ,ilor
de pe piat ,a de comert ,on-line am utilizat, de asemenea, DOMDocument pentru a putea
extrage pret ,urile a trei magazine prin intermediul HTML-ului.
Pentru a putea obt ,ine pret ,urile a trei magazine diferite s ,i anume eMAG, Altex s ,i
Flanco, am ales strategia de a parcurge HTML-ul site-urilor concurente s ,i de a extrage de
acolo pret ,urile necesare.
Motivul pentru care am ales parcurgerea HTML-urilor s ,i de a nu folosi XPath-uri este
unul ce t ,ine de complexitatea parcurgerilor, necesitând c ˘aut˘ari mai precise s ,i mai ample.
Primul pas în dezvoltare a fost f ˘acut desc ˘arcând tool-urile necesare pe care le-am
descris în acest capitol.
Cel de-al doilea pas a fost de a instala cu ajutorul MTPutty cele necesare pentru a
putea dezvolta cu ajutorul framework-ului Symfony, urmând dezvoltarea propriu-zis ˘a.
Fiind o aplicat ,ie care se bazeaz ˘a într-o proport ,ie foarte mare pe partea de back-end,
toate rezultatele acesteia, anume pret ,urile concurent ,ei s ,i pret ,urile finale, se observ ˘a prin
intermediul bazei de date MySQL Heidi, în urma acestora putându-se face un simplu
export la baza de date folosit ˘a, pentru ca mai apoi datele obt ,inute s ˘a fie analizate cu
ajutorul unor grafice.
Rezultatele obt ,inute în urma acestor grafice ajut ˘a la observarea fluctuat ,iilor pret ,urilor,
24
3.1. Prezentare aplicat ,ie
la analiza unor diferent ,e în unele intervale prestabilite, spre exemplu de 30 de zile, la
analiza îndeaproape a piet ,ei, la stabilirea unor noi pret ,uri ale propriului magazin on-line,
dar s ,i la unele decizii ce t ,in de strategiile de marketing.
Crearea unui crawler de nivelul celui dezvoltat în lucrarea de licent ,˘a, low-level, s-a
bazat pe necesitatea unor firme mici s ,i mijlocii, nou lansate pe piat ,˘a, care urm ˘aresc un
num˘ar mic de firme pentru a-s ,i putea stabiliza profitul s ,i investit ,iile.
Bazele aplicat ,iei de crawling sunt puse prin intermediul serviciului SiteContentTransla-
tor.php, care este dezvoltat în vederea lu ˘arii pret ,urilor, pentru ca mai apoi s ˘a fie introduse
în baza de date.
Acest serviciu cont ,ine o clas ˘a SiteContentTranslator, cu trei metode getEmagPrice-
FromLink(), getAltexPriceFromLink() s ,i getFlancoPriceFromLink(). Cele trei metode
sunt dezvoltate asem ˘an˘ator, singurele diferent ,e dintre aceste aflându-se în c ˘aile de ana-
liz˘a ale pret ,urilor.
Pentru o mai us ,oar˘a înt ,elegere, se va analiza mai întâi metoda getEmagPriceFrom-
Link(), urmând s ˘a fie explicate mai departe diferent ,ele dintre celelalte dou ˘a metode ale
clasei SiteContentTranslator.
public function getEmagPriceFromLink(string $link): array
{
$html = file_get_contents($link);
$dom = new \DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_clear_errors();
$xmlElement = simplexml_load_string($dom->saveXML(),
"SimpleXMLElement", LIBXML_NOCDATA);
$json = json_encode($xmlElement);
$siteBody = json_decode($json, true);
unset($siteBody['@attributes']);
unset($siteBody['head']);
$emagSiteContent = $siteBody['body'];
unset($emagSiteContent['script']);
unset($emagSiteContent['noscript']);
unset($emagSiteContent['comment']);
unset($emagSiteContent['input']);
try {
return trim(str_replace('\n', '',
$emagSiteContent['div'][1]['nav'][0]['div']['div']['div'][3]['p'][1]));
25
3.1. Prezentare aplicat ,ie
} catch (\Exception $ex) {
return trim(str_replace('\n', '',
$emagSiteContent['div'][1]['nav'][0]['div']['div']['div'][3]['p']));
}
}
Metoda getEmagPriceFromLink primes ,te ca parametru variabila $link, ce va cont ,ine
link-ul site-ului pe care îl va analiza crawler-ul, returnând un element de tipul array, da-
torit˘a structurii pe care o dorim mai departe, în dezvoltarea aplicat ,iei, deoarece datele
vor putea fi afis ,ate într-un format mai us ,or de analizat de c ˘atre programatori în cadrul
dezvolt ˘arii, dar s ,i în cazul unor erori.
Metoda predefinit ˘a file_get_contents() este folosit ˘a pentru a citi s ,i afis ,a fis ,ierele sub
forma unui string. Aceast ˘a metod ˘a este similar ˘a celei file(), îns ˘a va returna fis ,ierul sub
formatul unui s ,ir de caractere, în cazul unei erori, aceasta metod ˘a va returna valoarea
FALSE. Parametrii acestei metode sunt:
1) filename – numele fis ,ierului ce va trebui citit
2) use_include_path – poate fi utilizat pentru a porni c ˘autarea în funct ,ie de o cale
anume.
3) context – se utilizeaz ˘a o resurs ˘a valid ˘a a contextului, creat ˘a cu ajutorul metodei
stream_context_create(). Dac ˘a nu este necesar un context personalizat, acest parametru
poate fi omis, prin setarea cu NULL a sa.
4) offset – offset-ul unde va începe citirea pe cursul original. Un offset negativ este
contorizat de la sfârs ,itul fluxului.
C˘autarea nu este permis ˘a în interiorul fis ,ierelor remote. Încercarea de a c ˘auta în inte-
riorul fis ,ierelor ce nu sunt locale poate funct ,iona pe fluxuri mici, dar exist ˘a posibilitatea
unui es ,ec deoarece functioneaz ˘a prin intermediul fluxurilor salvate in buffer.
5) maxlen – lungimea maxim ˘a a datelor ce vor fi citite. În mod implicit este setat ˘a
modalitatea de a citi pân ˘a când este atins sfârs ,itul documentului. Acest parametru este
aplicat la procesul fluxurilor prin intermediul filtrelor.
Metoda file_get_contents() returneaz ˘a date sau FALSE în cazul unui es ,ec.
O eroare de tipul E_WARNING este generat ˘a dac ˘a nu se poate g ˘asi un nume al
fis,ierului, maxlength este mai mic decât zero sau în cazul în care c ˘autarea cu offset-ul
specificat es ,ueaz ˘a.
Exemplu utilizare metod ˘a file_get_contents():
<?php
$homepage = file_get_contents('http://www.licenta.com/');
echo $homepage;
?>
26
3.1. Prezentare aplicat ,ie
Pentru a putea utiliza DOMDocument, s-a setat variabila $dom ca un nou obiect al
clasei DOMDocument.
O alt ˘a metod ˘a predefinit ˘a este metoda libxml_use_internal_errors() ce este folosit ˘a
pentru a scoate din funct ,iune erorile de libxml s ,i pentru a-i permite programatorului s ˘a
aduc ˘a înformat ,iile din erori în orice mod îi vor fi necesare în dezvoltarea proiectului,
putând s ˘a ignore erorile bibliotecii ce nu impacteaz ˘a în niciun mod codul s ˘au. De ase-
menea, libxml_use_internal_errors(), pe lâng ˘a permiterea dezactiv ˘arii erorilor standard
de libxml, poate utiliza modul de manipulare al erorilor, setând metoda cu argumentul
TRUE, libxml_use_internal_errors(true).
Parametri acestei metode sunt:
1) use_errors – dac ˘a este setat pe TRUE va permite manipularea erorilor, dac ˘a este
setat pe FALSE va dezactiva manipularea erorilor.
Metoda libxml_use_internal_errors() returneaz ˘a ultima valoarea a use_errors.
Exemplu de utilizare:
<?php
var_dump(libxml_use_internal_errors(true));
//[U+FFFD] nc[U+FFFD] rcare documemt
$doc = new DOMDocument;
if (!$doc->load('file.xml')) {
foreach (libxml_get_errors() as $error) {
// tratare excep [U+FFFD] ii
}
libxml_clear_errors();
}
?>
Urm ˘atorul pas important este de a înc ˘arca documentul HTML prin intermediul meto-
dei loadHTML() s ,i a variabilei $dom.
Metoda loadHTML() [17], obt ,inut˘a cu ajutorul DOMDocument, parseaz ˘a documentul
HTML cont ,inut în sursa de tip string. Spre deosebire de înc ˘arcarea unui XML, HTML-ul
nu are o modalitate de înc ˘arcare bine formatat ˘a. Aceast ˘a metod ˘a poate fi apelat ˘a static
pentru a înc ˘arca s ,i crea un obiect de tip DOMDocument. Apelarea de tip static poate fi
utilizat ˘a când nici una dintre propriet ˘at,ile DOMDocument nu necesit ˘a a fi setate înainte
de înc ˘arcare.
Erorile pe care le poate produce metoda loadHTML(): în cazul în care ca surs ˘a va fi
trecut un element de tip string gol, se va genera un mesaj de eroare. Acest avertisment nu
este generat de libxml s ,i nu va putea fi tratat folosind funct ,iile libxml.
Aceast ˘a metod ˘a se poate apela în mod static, îns ˘a va trimite o eroare de tip E_STRICT.
Des ,i codul documentului HTML deteriorat ar trebui s ˘a fie înc ˘arcat cu succes, me-
27
3.1. Prezentare aplicat ,ie
toda loadHTML() poate s ˘a genereze erori de tipul E_WARNING în momentul în care
va întâlni un marcaj gres ,it. Funct ,iile de gestiune a erorilor libxml se vor utiliza pentru a
prelucra erorile ap ˘arute în cazurile except ,ionale.
Parametri metodei sunt:
1) source – string-ul HTML
2) options – este folosit de la varianta 5.4.0 de PHP pentru a specifica parametri auxi-
liari ai Libxml.
Metoda loadHTML() returneaz ˘a valoarea TRUE dac ˘a operat ,iunea s-a încheiat cu suc-
ces, sau FALSE dac ˘a a es ,uat. Dac ˘a va fi apelat ˘a în mod static, va returna DOMDocument
sau FALSE în cazul es ,ecului. Exemplu de utilizare:
<?php
$doc = new DOMDocument();
$doc->loadHTML("<html><body>Test<br></body></html>");
echo $doc->saveHTML();
?>
Urm ˘atorul pas în dezvoltarea metodei este de a elibera bufferul de erori tip libxml cu
ajutorul metodei libxml_clear_errors() [18]. Aceast ˘a metod ˘a nu va returna nicio valoare.
Dup˘a ce bufferul va fi eliberat, pentru a putea obt ,ine informat ,iile necesare, acestea vor
fi ad˘augate în variabila $xmlElement prin intermediul metodei simplexml_load_string().
Aceast ˘a metoda ajut ˘a la transformarea unui document XML bine format de tipul string s ,i
îl returneaz ˘a de tipul unui obiect.
Parametri acestei metode:
1) data – un string XML bine format
2) class_name – acest parametru este opt ,ional, se poate folosi pentru ca libxml_clear_errors()
s˘a returneze un obiect al unei clase specificate. Aceast ˘a clas ˘a ar trebui s ˘a extind ˘a clasa
SimpleXMLElement.
3) options – se foloses ,te pentru a specifica parametri Libxml adit ,ionali
4) ns – prefixul namespace-ului sau URI
5) is_prefix – returneaz ˘a TRUE dac ˘a ns este un prefix, FALSE dac ˘a este tip URI, fiind
setat în mod implicit la FALSE
Metoda returneaz ˘a un obiect al clasei SimpleXMLElement cu propriet ˘at,i ce cont ,in
datele din documentul xml, sau FALSE în cazul es ,ecului.
Va produce un mesaj de eroare de tip E_WARNING pentru fiecare eroare g ˘asit˘a in
datele documentului XML.
Exemplu de utilizare:
<?php
libxml_clear_errors()
?>
28
3.1. Prezentare aplicat ,ie
Pentru ca aceast ˘a metod ˘a s˘a poat ˘a fi folosit ˘a în aplicat ,ia noastr ˘a, ca s ,i prim parametru
va fi apelat ˘a funct ,ia saveXML() prin intermediul DOMDocument.
Metoda saveXML() descarc ˘a arborele intern al XML-ului într-un string.
Aceasta creaz ˘a un document XML prin intermediul reprezent ˘arii DOM-ului. Funct ,ia
este, de obicei, apelat ˘a dup ˘a construirea unui document tip dom de la început.
Parametri funct ,iei saveXML():
1) node – se utilizeaz ˘a acest parametru pentru a afis ,a doar un nod specific f ˘ar˘a decla-
rarea XML-ului
2) options – opt ,iuni suplimentare
Cel de-al doilea parametru al funct ,iei, numele clasei, a fost setat ca "SimpleXMLE-
lement", urmând ca ultimul parametru s ˘a fie "LIBXML_NOCDATA", opt ,iune ce îmbin ˘a
CDATA ca s ,i note de text:
$xmlElement = simplexml_load_string($dom->saveXML(), "SimpleXMLElement",
LIBXML_NOCDATA);
Exemplu de utilizare:
<?php
$doc = new DOMDocument('1.0');
$doc->formatOutput = true;
$title = $doc->createElement('title');
$title = $root->appendChild($title);
$text = $doc->createTextNode('Acesta este titlul');
$text = $title->appendChild($text);
//salvare document
echo $doc->saveXML() . "\n";
//salvare titlu
echo $doc->saveXML($title);
?>
Pentru a colecta informat ,iile din elementul XML pe care l-am modelat înainte, vom
folosi metoda json_encode() [19], ce primes ,te ca parametru variabila $xmlElement.
Aceast ˘a funct ,ie întoarce un s ,ir care cont ,ine o reprezentare tip JSON pentru o valoare
dat˘a. Parametri acestei metode sunt:
1) value – valoarea care trebuie reprezentat ˘a în tipul JSON. Poate fi de orice tip, cu
except ,ia resource. Toate s ,irurile date trebuie s ˘a fie codificate în UTF-8.
29
3.1. Prezentare aplicat ,ie
2) options – o masc ˘a de bit ,i, ce const ˘a în urm ˘atoarele constante: JSON_HEX_APOS,
JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES,
JSON_HEX_TAG, JSON_PRESERVE_ZERO_FRACTION, JSON_HEX_QUOT.
3) depth – este folosit pentru a stabili adâncimea maxim ˘a, el trebuie s ˘a fie mai mare
decât zero.
Metoda json_encode() va întoarce un string, reprezentat tip JSON în cazul unui suc-
ces, sau FALSE în cazul unui es ,ec.
Exemplu de utilizare:
<?php
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
echo json_encode($arr);
?>
Pentru a obt ,ine informat ,iile din site în ultima form ˘a necesar ˘a crawler-ului nostru, vom
utiliza înc ˘a o metod ˘a, anume json_decode() [20].
Aceast ˘a metod ˘a se utilizeaz ˘a la convertirea unui s ,ir reprezentat tip JSON, acest s ,ir
este preluat, parsat, mai apoi fiind convertit într-o variabil ˘a PHP.
Parametrii sunt:
1) json – este s ,irul reprezentat tip json ce va trebui s ˘a fie convertit. Se utilizeaz ˘a doar
string-uri codificate în UTF-8.
2) assoc – dac ˘a va fi specificat ca s ,i TRUE, obiectul va fi convertit într-un array asoci-
ativ
3) depth – reprezint ˘a limita adâncimii de îmbinare care va fi specificat ˘a de programator
sau utilizator
4) options – este masca de bit ,i a opt ,iunilor de decodificare JSON. Exemple de con-
stante: JSON_INV ALID_UTF8_IGNORE, JSON_OBJECT_AS_ARRAY .
Se returneaz ˘a valorile codate în JSON în tipul PHP convenabil. Valorile ce pot fi
returnate sunt TRUE, FALSE sau NULL, NULL fiind returnat dac ˘a json-ul nu va putea fi
decodat sau dac ˘a datele codate sunt mai mari decât limita ment ,ionat ˘a.
Exemplu de utilizare:
<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
?>
30
3.1. Prezentare aplicat ,ie
Aceste valori vor fi introduse în variabila $siteBody, ce urmeaz ˘a a fi modelat ˘a pentru
a se obt ,ine pret ,ul exact din site.
Deoarece în acest stadiu nu sunt necesare mai multe informat ,ii, ci doar pret ,ul, se va
încerca eliminarea a cât mai multor buc ˘at,i din document ce cont ,in informat ,ii suplimen-
tare.
Din acest motiv, se va utiliza funct ,ia de "unset()". Aceast ˘a metod ˘a elimin ˘a din do-
cument o variabil ˘a dat ˘a. Comportamentul metodei unset() în interiorul unei funct ,ii poate
varia depinzând de ce tip de variabil ˘a se va dori a se elimina.
Dac˘a se dores ,te eliminarea unei variabile globale în ˘auntrul unei funct ,ii, doar variabila
local ˘a va fi distrus ˘a, variabila din mediul de apel îs ,i va p ˘astra valoarea pe care a avut-o
pân˘a în momentul în care s-a f ˘acut apel la funct ,ia de unset().
Câmpurile pe care ni le dorim a fi eliminate pentru început din document sunt cele de
@attributes s ,i head.
Exemplu de utilizare:
<?php
// distruge doar o variabil [U+FFFD]
unset($foo);
// distruge un element
unset($bar['quux']);
// distruge mai multe variabile
unset($foo1, $foo2, $foo3);
?>
Dup˘a renunt ,area la aceste dou ˘a câmpuri, documentul în noul format va fi salvat într-
o variabil ˘a numit ˘a $emagSiteContent, ce va prelua doar corpul documentului salvat în
variabila $siteBody.
Pentru a ret ,ine ultima form ˘a a documentului, sunt necesare eliminarea din corp a altor
câmpuri s ,i anume: script, noscript, comment s ,i input.
Decizia elimin ˘arii câmpurilor @attributes, head, script, noscript, comment, dar s ,i in-
put a fost luat ˘a în vederea scurt ˘arii timpului de c ˘autare al c ˘aii c˘atre pret ,urile necesare.
Ultima parte pe care metoda getEmagPriceFromLink() o cont ,ine este cea de baz ˘a,
anume blocul try-catch.
Tratarea except ,iilor este folosit ˘a pentru a schimba fluxul normal al execut ,iei codului
dac˘a o eroare specific ˘a a ap ˘arut. Aceast ˘a condit ,ie se numes ,te except ,ie.
Ce se întâmpl ˘a când o except ,ie este declans ,at˘a:
1) este salvat ˘a starea actual ˘a a codului
2) execut ,ia codului se va schimba c ˘atre o funct ,ie predefinit ˘a de tratare a except ,iilor
31
3.1. Prezentare aplicat ,ie
3) în funct ,ie de situat ,ie, handler-ul poate rezuma execut ,ia codului de la salvare, s ˘a
termine execut ,ia scriptului sau s ˘a continue execut ,ia scriptului dintr-o locat ,ie diferit ˘a a
acestuia.
Exist ˘a multiple metode de tratare ale except ,iilor:
1) utlizarea de baz ˘a a except ,iilor
Când o except ,ie este aruncat ˘a, codul ce urmeaz ˘a nu va fi executat, iar limbajul de
programare PHP va încerca s ˘a g˘aseasc ˘a un bloc tip catch ce se potrives ,te. Dac ˘a o except ,ie
nu va fi prins ˘a, va fi afis ,at˘a eroarea de tipul "Uncaught exception".
Pentru a evita astfel de erori, este necesar s ˘a dezvolt ˘am un cod potrivit pentru a putea
trata except ,ia, ceea ce implic ˘a:
a) try – o funct ,ie ce foloses ,te o except ,ie ar trebui s ˘a fie într-un bloc de tip try. Dac ˘a o
except ,ie nu declans ,eaz˘a, codul codul îs ,i va continua fluxul normal. Dac ˘a except ,ia se va
declans ,a, aceasta va fi aruncat ˘a.
b) throw – aceasta este modalidatea de a declans ,a o except ,ie. Fiecare bloc throw
trebuie s ˘a aib ˘a minim un bloc catch.
c) catch – un bloc catch recupereaz ˘a o except ,ie s,i creaz ˘a un obiect ce cont ,ine informat ,iile
necesare despre except ,ie.
2) Crearea unei clase pesonalizate pentru except ,ii
Pentru a crea un handler pentru except ,ii personalizat, trebuie mai întâi creat ˘a o clas ˘a
special ˘a cu metode ce pot fi apelate când apare o eroare de PHP. Clasa trebuie s ˘a fie o
extensie a clasei de except ,ii.
Clasa personalizat ˘a pentru except ,ii trebuie s ˘a mos ,teneasc ˘a propriet ˘at,ile clasei de except ,ii
definite de PHP, astfel putând fi ad ˘augate de c ˘atre programator noi metode ce vor îndeplini
necesit ˘at,ile aplicat ,iilor.
3) Except ,ii multiple
Exist ˘a posibilitatea ca un script s ˘a utilizeze except ,ii multiple pentru a verifica mai
multe condit ,ii impuse de dezvoltator.
Se pot folosi chiar s ,i blocuri de tip if..else, switch-uri sau integra mai multe except ,ii.
Aceste except ,ii pot utiliza clase de except ,ii diferite si pot s ˘a returneze mesaje de erori
diferite.
4) Re-aruncarea except ,iilor
În unele cazuri, când o except ,ie este aruncat ˘a, se poate dori tratarea acesteia într-un
mod diferit fat ,˘a de modalitatea standard. Exist ˘a posibilitatea de a arunca o except ,ie pentru
a doua oar ˘a prin intermediul blocului de catch.
Un script ar trebui s ˘a ascund ˘a de utilizator erorile provocate de sistem. Aceste mesaje
de erori pot fi importante pentru programatpr, dar nu reprezint ˘a niciun interes pentru un
utilizator obis ,nuit.
Pentru a solut ,iona aceast ˘a problem ˘a, se poate arunca un alt mesaj, care s ˘a îl fac ˘a pe
utilizator s ˘a înt ,eleag ˘a problema cauzat ˘a.
32
3.1. Prezentare aplicat ,ie
5) Setarea unui handler de except ,ii de tipul Top Level
Metoda set_exception_handler() seteaz ˘a o funct ,ie definit ˘a pentru utilizator pentru a
trata toate except ,iile netratate în respectivul moment.
PHP are un model pentru except ,ii similar cu al celorlalte limbaje de programare. O
except ,ie [21] poate fi "aruncat ˘a", dar s ,i "prins ˘a" prin intermediul limbajului de progra-
mare PHP.
Fragmentul de cod dorit poate fi înconjurat de un bloc tip try pentru a facilita prinderea
unor potent ,iale erori. Fiecare bloc try trebuie s ˘a aib ˘a cel put ,in un bloc catch corespondent
la finalul s ˘au.
Pentru a putea pune un obiect în "throw", acesta trebuie s ˘a fie o instant ,˘a a clasei
Exception sau o subclas ˘a a acesteia. Încercarea de a "arunca" un obiect ce nu este o
instant ,˘a a clasei Exception va rezulta într-o eroare de tip fatal în limbajul de programare
PHP.
Se pot utiliza multiple blocuri de tip catch pentru a captura diferite clase de except ,ii.
Execut ,ia normal ˘a(atunci când nicio except ,ie nu este aruncat ˘a prin intermediul blocului
try) va continua dup ˘a ultimul bloc tip catch ce este definit în secvent ,˘a. Except ,iile pot fi
aruncate sau întoarse prin intermediul unui bloc catch.
În momentul în care o except ,ie este aruncat ˘a, codul ce urmeaz ˘a declarat ,iei nu va fi
exclus, iar limbajul PHP va încerca s ˘a g˘aseasc ˘a primul bloc catch corespunz ˘ator. Dac ˘a
o except ,ie nu va fi prins ˘a, o eroare fatal ˘a de PHP va fi afis ,at˘a cu mesajul "Uncaught
Exception..", mai put ,in dac ˘a handler-ul va fi definit cu set_exception_handler().
Reguli pentru tratarea except ,iilor [22]:
– codul trebuie înconjurat de un bloc tip try pentru a ajuta la prinderea potent ,ialelor
except ,ii.
– fiecare bloc try sau throw trebuie s ˘a aib ˘a minim un bloc catch corespunz ˘ator
– blocurile multiple tip catch pot fi folosite pentru a prinde clase diferite de except ,ii
– except ,iile pot fi aruncare sau re-aruncate într-un bloc tip catch prin intermediul unui
bloc tip try
În cazul aplicat ,iei de fat ,˘a dezvoltate, s-a decis utilizarea unui bloc tip try..catch, în
interiorul c ˘aruia s-au returnat cele dou ˘a posibilit ˘at,i de a obt ,ine pret ,ul unui produs dintr-
un site .
Exemplu de utilizare:
<?php
function checkNum($number) {
if($number>1) {
throw new Exception("Valoarea trebuie sa fie egal [U+FFFD] cu 1 sau
mai mic [U+FFFD] ");
}
return true;
33
3.1. Prezentare aplicat ,ie
}
try {
checkNum(2);
}
catch(Exception $e) {
echo 'Message: ' .$e->getMessage();
}
?>
Atât prima, cât s ,i cea de-a doua returnare utilizez ˘a dou ˘a metode, anume "trim()" s ,i
"str_replace()" pentru a putea afis ,a într-o modalitate us ,or de citit pret ,urile obt ,inute dup ˘a
c˘autarea în site.
Metoda trim() este menit ˘a s˘a elimine spat ,ii albe sau alte caractere nedorite de la înce-
putul sau de la sfârs ,itul unui s ,ir.
Aceast ˘a metod ˘a returneaz ˘a un s ,ir ce are extrase spat ,iile albe de la începutul sau
sfârs ,itul unui string. F ˘ar˘a cel de-al doilea parametru, metoda trim() [23] va extrage urm ˘a-
toarele caractere: spat ,iu, tab, linie nou ˘a, tab vertical s ,i NULL-byte.
Parametrii metodei sunt:
1) str – s ,irul ce va fi modificat
2) character_mask – opt ,ional, caracterele extrase pot fi, de altfel, specificate utilizând
acest parametru. Se listeaz ˘a caracterele care se doresc a fi s ,terse.
Exemplu de utilizare:
<?php
$str = "Hello World!";
echo $str . "<br>";
echo trim($str,"Hed!");
?>
Cea de-a doua metod ˘a utilizat ˘a pentru a returna valorile pret ,urilor este str_replace().
Aceast ˘a metod ˘a înlocuies ,te toate aparit ,iile unui s ,ir c˘autat cu un s ,ir de înlocuire.
Str_replace() returneaz ˘a un s ,ir sau un array cu toate aparit ,iile parametrului de c ˘autare
în parametrul de subiect, înlocuit cu o valoare stabilit ˘a.
Dac˘a parametrii "search" s ,i "replace" sunt array-uri, atunci metoda str_replace() ia o
valoare din fiecare array s ,i le utilizeaz ˘a pentru c ˘autare s ,i înlocuire.
Dac˘a parametrul replace are mai put ,ine valori decât parametrul search, atunci un s ,ir
gol va fi folosit pentru restul valorilor de înlocuit. Dac ˘a parametrul search este un array,
iar parametrul replace este un string, atunci s ,irul de înlocuire este utilizat pentru fiecare
valoare a parametrului search. Dac ˘a search sau replace sunt array-uri, elementele lor sunt
34
3.1. Prezentare aplicat ,ie
procesate de la primul pân ˘a la ultimul.
Parametrii metodei:
1) search – valoarea care se va c ˘auta.
2) replace – valoarea cu care se vor înlocui valorile g ˘asite în parametrul search. Se
poate utiliza un array pentru a folosi înlocuirile multiple.
3) subject – un s ,ir sau un array c ˘autat s ,i inlocuit, de altfel s ,tiut s ,i ca haystack
Daca parametrul subject este un array, atunci c ˘autarea s ,i înlocuirea sunt executate cu
fiecare intrare a parametrului subject, iar valoarea returnat ˘a este un array, de asemenea.
4) count – dac ˘a este trecut, acesta va fi setat ca num ˘arul de înlocuiri efectuate.
Aceast ˘a metod ˘a returneaz ˘a un string sau un array al valorilor înlocuite.
Exemplu de utilizare:
<?php
// Ar trebui s [U+FFFD] m[U+FFFD] n[U+FFFD] nci pizza, bere [U+FFFD] i
[U+FFFD] nghe [U+FFFD] at[U+FFFD] zilnic.
$phrase = "Ar trebui s [U+FFFD] m[U+FFFD] n[U+FFFD] nci fructe, legume
[U+FFFD] i fibre zilnic.";
$healthy = array("fructe", "legume", "fibre");
$yummy = array("pizza", "bere", " [U+FFFD] nghe [U+FFFD] at[U+FFFD] ");
$newphrase = str_replace($healthy, $yummy, $phrase);
echo $count;
?>
Cu ajutorul json-ului obt ,inut s ,i prin intermediul c ˘aii luate din variabila $emagSite-
Content, am putut s ˘a obt ,inem pret ,urile din site.
Cele dou ˘a return-uri din interiorul blocului try..catch reprezint ˘a pret ,ul redus al produ-
sului, dar s ,i pret ,ul întreg al unui produs în cazul în care nu exist ˘a nicio reducere aplicat ˘a
asupra acestora.
Cele trei metode aflate în clasa SiteContentTranslator, anume getEmagPriceFrom-
Link(), getAltexPriceFromLink() s ,i getFlancoPriceFromLink() difer ˘a doar prin cele dou ˘a
secvent ,e de return din interiorul blocurilor try..catch, calea c ˘atre fiecare produs depinzând
în funct ,ie de structura fiec ˘arui site ales, în principal de as ,ezarea pret ,urilor produselor într-
o pagin ˘a.
Urm ˘atorul pas în dezvoltarea aplicat ,iei a fost introducerea pret ,urilor în baza noastr ˘a
de date.
Astfel, cu ajutorul consolei MTPutty s ,i a beneficiilor aduse de framework-ul Symfony,
am putut crea trei repository-uri.
Symfony nu ofer ˘a o component ˘a pentru a putea lucra cu bazele de date, dar ofer ˘a o
35
3.1. Prezentare aplicat ,ie
Figura 3.9: Configurare variabil ˘a DATABASE_URL
integrare bun ˘a cu o bibliotec ˘a tip third-party numit ˘a Doctrine.
Mai întâi, a trebuit instalat suportul Doctrine prin intermediul pachetului ORM, pentru
a putea genera codul de lucru.
Informat ,iile referitoare la conexiunea bazei de date sunt stocate într-o variabil ˘a numit ˘a
"DATABASE_URL". Pentru dezvoltare, aceasta se poate g ˘asi s ,i modifica din interiorul
fis,ierului .env Figura 3.9.
Dup˘a ce parametrii de conexiune sunt setat ,i, Doctrine poate crea baza de date cu
ajutorul comenzii : php bin/console doctrine:database:create.
Exist ˘a mai multe variante în interiorul fis ,ierului config/packages/doctrine.yaml care
pot fi configurate, incluzând versiunea serverului prin intermediul "server_version", lucru
care poate influent ,a funct ,iile Doctrine.
Pentru a crea o clas ˘a, dar s ,i câmpurile de care avem nevoie, se poate utiliza comanda
"make:entity". Aceast ˘a comand ˘a va genera o serie de întreb ˘ari Figura 3.10.
Dup˘a aceast ˘a configurare, se va crea un nou fis ,ier src/Entity/Product.php.
Aceast ˘a clas ˘a este numit ˘a entitate, folosindu-se, mai departe pentru a putea salva s ,i
ordona obiecte tip Produs în tabela corespondent ˘a într-o baz ˘a de date. Fiecare proprietate
din entitate poate fi mapat ˘a la o coloan ˘a din tabel ˘a. Acest lucru se face, de obicei cu
ajutorul annot ˘arilor(@ORM˙..), comentarii ce se pot ad ˘auga deasupra fiec ˘arei propriet ˘at,i.
Comanda make:entity este un instrument pentru a ajuta programatorul.
În cazul de fat ,˘a exist ˘a trei entit ˘at,i create: Adresses.php, PriceHistory.php s ,i Pro-
duct.php, cu repository-urile corespondente AdressesRepository.php, PriceHistory.php s ,i
ProductRepository.php.
Entitatea Adresses:
/**
* @ORM\Entity(repositoryClass="App\Repository\AddressesRepository")
*/
class Addresses
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
36
3.1. Prezentare aplicat ,ie
Figura 3.10: Configurare câmpuri
37
3.1. Prezentare aplicat ,ie
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var Product
*
* @ORM\ManyToOne(targetEntity="Product", inversedBy="addresses")
*/
private $product;
/**
* @ORM\Column(type="string", length=255)
*/
private $emagLink;
/**
* @ORM\Column(type="string", length=255)
*/
private $flancoLink;
/**
* @ORM\Column(type="string", length=255)
*/
private $altexLink;
Aceast ˘a entitate cont ,ine cinci câmpuri, $id, $product, $emagLink, $flancoLink s ,i $al-
texLink, care vor fi utilizate dup ˘a cum urmeaz ˘a:
1) $id – este utilizat pentru a salva id-ul unic al fiec ˘arui produs din list ˘a
2) $product – este utilizat pentru a salva produsul pe care magazinul det ,in˘ator vrea s ˘a
îl urm ˘areasc ˘a
3) $emagLink – este link-ul c ˘atre produsul c ˘autat de det ,in˘atorul aplicat ,iei, aflat pe
site-ul eMAG
4) $flancoLink – este link-ul c ˘atre produsul c ˘autat de det ,in˘atorul aplicat ,iei, aflat pe
site-ul Flanco
5) $altexLink – este link-ul c ˘atre produsul c ˘autat de det ,in˘atorul aplicat ,iei, aflat pe
site-ul Altex.
În interiorul acestei clase se mai afl ˘a s,i funct ,iile de a seta s ,i de a lua link-urile, produ-
sele s ,i id-urile corespondente: getId(), getProduct(), setProduct(), getEmagLink(), setE-
magLink(), getAltexLink(), setAltexLink(), getFlancoLink(), setFlancoLink().
Entitatea PriceHistory:
38
3.1. Prezentare aplicat ,ie
/**
* @ORM\Entity(repositoryClass="App\Repository\PriceHistoryRepository")
*/
class PriceHistory
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var Product
*
* @ORM\ManyToOne(targetEntity="Product", inversedBy="addresses")
*/
private $product;
/**
* @ORM\Column(type="float")
*/
private $lastEmagPrice;
/**
* @ORM\Column(type="float")
*/
private $lastAltexPrice;
/**
* @ORM\Column(type="float")
*/
private $lastFlancoPrice;
/**
* @ORM\Column(type="datetime")
*/
private $created;
public function getId(): ?int
{
39
3.1. Prezentare aplicat ,ie
return $this->id;
}
Entitatea PriceHistory cont ,ine s ,ase câmpuri: $id, $product, $lastEmagPrice, $last-
FlancoPrice, $lastAltexPrice s ,i $created.
Utilizare câmpuri:
1) $id – este folosit pentru a salva id-ul unic al fiec ˘arui produs, la fel ca în entitatea
Adresses
2) $product – este utilizat pentru a salva produsul pe care magazinul det ,in˘ator vrea s ˘a
îl urm ˘areasc ˘a
3) $lastEmagPrice – este utilizat pentru a ret ,ine ultimul pret ,salvad din magazinul
urm˘arit, eMAG
4) $lastAltexPrice – este utilizat pentru a ret ,ine ultimul pret ,salvad din magazinul
urm˘arit, Altex
5) $lastFlancoPrice – este utilizat pentru a ret ,ine ultimul pret ,salvad din magazinul
urm˘arit, Flanco
6) $created – este utilizat pentru a ret ,ine data la care a fost creat ˘a baza
Aceast ˘a entitate cont ,ine, la fel ca cea Adresses, gettere s ,i settere: getId(), getPro-
duct(), setProduct(), getLastEmagPrice(), setLastEmagPrice(), getLastAltexPrice(), se-
tLastAltexPrice(), getLastFlancoPrice(), setLastFlancoPrice().
Cea de-a treia entitate este cea de Product:
/**
* @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
*/
class Product
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="float")
*/
private $acquisitionPrice;
/**
* @ORM\Column(type="float")
40
3.1. Prezentare aplicat ,ie
*/
private $lastModifiedPrice;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\Column(type="float")
*/
private $actualPrice;
/**
* @ORM\Column(type="datetime")
*/
private $priceLastModified;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="Addresses", mappedBy="product",
cascade={"persist", "remove"})
*/
private $addresses;
Câmpurile cont ,inute de aceast ˘a entitate sunt: $id, $acquisitionPrice, $lastModified-
Price, $name, $actualPrice, $priceLastModified, $adresses.
Utilitatea celor s ,apte câmpuri:
1) $id – asem ˘an˘ator celorlalte dou ˘a entit ˘at,i, este utilizat pentru a seta un id unic al
produselor urm ˘arite.
2) $acquisitionPrice – este utilizat pentru a salva pret ,ul de achizit ,ie al fiec ˘arui produs
propriu
3) $lastModifiedPrice – folosit pentru a salva ultimul pret ,modificat în funct ,ie de
variat ,ia pret ,urilor celorlalte magazine
4) $name – utilizat pentru a salva denumirea produsului
5) $actualPrice – folosit pentru a salva pret ,ul actual al fiec ˘arui produs
6) $priceLastModified – utilizat pentru a salva ultimul pret ,modificat deoarece în cazul
în care nu vor exista fluctuat ,ii ale pret ,urilor magazinelor concurente, pret ,ul propriu îs ,i va
p˘astra valoarea actual ˘a. De asemenea, în cazul în care nu va exista profit de 5%, produsele
îs,i vor p ˘astra ultimul pret ,salvat.
41
3.1. Prezentare aplicat ,ie
7) $adresses – pentru a face leg ˘atura cu entitatea Adresses.
Ca s ,i metode ale clasei Product, pe lând ˘a getterele s ,i setterele asem ˘an˘atoare celorlalte
dou˘a entit ˘at,i, avem si un constructor, unde folosim variabila $adresses ca un obiect de
tipul ArrayCollection.
Getterele s ,i setterele utilziate sunt: getId(), getAcquisitionPrice(), setAcquisition-
Price(), getLastModifiedPrice(), setLastModifiedPrice(), getName(), setName(), getAc-
tualPrice(), setActualPrice(), getPriceLastModified(), setPriceLastModified(), getAdres-
ses(), setAdresses().
Conform documentat ,iei Symfony, fiec ˘arei entit ˘at,i îi va corespunde un repository.
Cele trei repository-uri pe care proiectul le cont ,ine, det ,in câte o clas ˘a cu acelas ,i nume
ca al fis ,ierului, fiecare dintre ele extinzând serviciul ServiceEntityRepository.
În interiorul clasei exist ˘a un contructor ce are ca parametru o variabil ˘a $registry de
tipul RegistryInterface.
Pentru a putea avea control asupra aplicat ,iei, framework-ul Symfony pune la dispozit ,ie
src/Controller în care se pot ad ˘auga controllere pentru site-urile pe care le urm ˘arim, con-
trollerele respective extinzând controllerul abstract al Symfony-ului, s ,i anume Abstract-
Controller.
Acest controller cont ,ine în interiorul clasei corespondente o metod ˘a tip public func-
tion, ce are ca parametru variabila $translator de tipul SiteContentTranslator, pentru a
putea lua informat ,iile necesare din acesta.
Pentru început i se atribuie variabilei $date calitatea de obiect de tipul DateTime, pe
care mai apoi il modific ˘am cu ajutorul metodei predefinite modify() cu 30 de zile.
Metoda modify ajut ˘a la alterarea timestamp-ului.
Exist ˘a dou ˘a tipuri, stilul orientat pe obiecte, cu definirea: public DateTime::modify
( string $modify ) : DateTime, cel de-al doilea stil fiind cel procedural, cu definirea:
date_modify ( DateTime $object , string $modify ) : DateTime.
Aceast ˘a metod ˘a altereaz ˘a timestamp-ul obiectului de tipul DateTime prin incremen-
tarea sau decrementarea, aducând într-un format acceptat de strtotime().
Parametrii metodei modify():
1) object – folosit doar pentru stilul procedural, fiind un obiect DateTime întors de
metoda date_Create(). Astfel, metoda modific ˘a acest obiect.
2) modify = este un string pentru dat ˘a s,i or˘a.
Metoda modify() întoarce obiectul DateTime pentru înl ˘ant,uirea metodelor sau în-
toarce valoarea FALSE în cazul es ,ecului.
Urm ˘atorul pas pentru crearea metodei este de a seta variabila $products la valorile
produselor g ˘asite în repository-ul creat, c ˘autând s ,i salvând ultimul pret ,modificat al acelor
produse.
Pentru fiecare produs se vor lua pret ,urile cele mai mici g ˘asite în fiecare platform ˘a on-
line, pentru ca mai apoi s ˘a se modifice în funct ,ie de preferint ,e strategia pe care det ,in˘atorul
42
3.2. Implement ˘ari viitoare
magazinului va dori s ˘a o abordeze.
Dup˘a ce aplicat ,ia a salvat atât pret ,urile propriului magazin, link-urile c ˘atre produsele
concurent ,ilor, pret ,urile de achizit ,ie, pret ,urile magazinelor concurente, dar s ,i pret ,urile
obt,inute dup ˘a ce s-au f ˘acut verific ˘ari pe piat ,˘a pentru ca mai apoi s ˘a fie aplicate diferite
strategii de marketing, aplicat ,ia va face verific ˘arile de cost necesare.
3.2 Implement ˘ari viitoare
3.2.1 Utilizare MongoDB
Una dintre cele mai utile îmbun ˘at˘at,iri pe care le putem aduce aplicat ,iei "Alinieri în
comert ,ul on-line" este cres ,terea num ˘arului de site-uri urm ˘arite s ,i totodat ˘a, a num ˘arului de
produse atât c ˘autate cât s ,i det ,inute.
Utilizând un num ˘ar mare de produse, este necesar ˘a utilizarea unei baze de date tip
NOSQL, pentru a salva toate informat ,iile despre produse.
O posibilitate de utilizare este MongoDB.
Acesta salveaz ˘a date în documentele tip JSON, ceea ce înseamn ˘a c˘a exist ˘a o variat ,ie
mare a câmpurilor de la document la document, iar structura datelor poate fi schimbat ˘a
peste timp.
Este o baz ˘a de date distribuit ˘a, cu disponibilitate mare, scalare orizontal ˘a s,i împ ˘art,iri
orizontale ce sunt us ,or de dezvoltat s ,i utilizat.
MongoDB este o baz ˘a de date utilizat ˘a pentru documente, proiectat ˘a pentru a us ,ura
dezvoltarea s ,i scalabilitatea.
O înregistrare in MongoDB este un document, ceea ce este o structur ˘a de date cum-
pus˘a din câmpuri s ,i perechi de valori. Documentele MongoDB sunt similare obiectelor
tip JSON. Valorile câmpurilor pot include alte documente, arrayuri s ,i arrayuri de docu-
mente.
Avantajul de a utiliza documentele este:
1) documentele corespund cu tipuri de date native în majoritatea limbajelor de pro-
gramare
2) documentele tip embedded s ,i arrayurile reduc nevoia de a crea join-uri costisitoare
în materie de timp
3) schemele dinamice sprijin ˘a polimorfismul
MongoDB ofer ˘a o persistent ,˘a a datelor de foarte mare calitate.
1) suportul pentru modelele de date tip embedded reduce activitatea I
O pe un sistem de baze de date.
2) indecs ,ii suport ˘a interog ˘ari rapide s ,i pot include chei pentru documentele tip embe-
dded s ,i arrayuri
43
3.2. Implement ˘ari viitoare
MongoDB suport ˘a un limbaj vast de interog ˘ari pentru a ajuta operat ,iile de scriere s ,i
citire, astfel:
1) agregare
2) c˘autare în text s ,i interog ˘ari geospat ,iale
Facilitatea de replicare a MongoDB, numit ˘a s,i "replica set" ofer ˘a:
1) blocarea automat ˘a a erorilor
2) redundant ,˘a
Replica set este un grup de servere MongoDB ce întret ,in acelas ,i set de date, oferind
redundant ,˘a s,i crescând disponibilitatea datelor.
Baza de date tip NOSQL MongoDB ofer ˘a scalabilitate orizontal ˘a ca parte a funct ,ionalit ˘at,ii
sale de baz ˘a.
3.2.2 Utilizare cron-urilor
În vederea automatiz ˘arii complete a aplicat ,iei se va putea utiliza conceptul de cronuri
pentru a ajuta aplicat ,ia s˘a ruleze chiar s ,i în momentul în care dezvoltatorii sau det ,in˘atorii
nu sunt prezent ,i, pentru a colecta un num ˘ar mai mare de date, astfel rezultatele proceselor
de aliniere s ,i de verificare de pret ,vor putea fi cât mai exacte.
Cronurile [24] manipuleaz ˘a s,iruri de date, ordoneaz ˘a o varietate de baze de date ,tri-
mite multiple mesaje tip mail s ,i parseaz ˘a documente tip XML.
Un cron este un simplu modul de Linux ce permite rularea unor comenzi la perioade
sau intervale de timp predefinite. De asemenea, un Cron defines ,te un proces ce este
utilizat pentru a executa un script, a porni un program, trimite informat ,ii, salva baze de
date, afis ,are de mesaje, s ,tergerea unor fis ,iere nedorite la o anumit ˘a or˘a sau dat ˘a, sau pentru
a seta un interval.
În general, orice proces dorit a fi executat în mod automat de c ˘atre un calculator, este
un Cron.
Cronurile în PHP s ,i Linux [25]
Linux are multe solut ,ii utile pentru administrarea proceselor ce se execut ˘a la anumite
perioade de timp, anume daemon-ul de cron, numit s ,i "crond". Scripturile sau comenzile
dorite spre a fi executate se ruleaz ˘a în fis ,ierele de crontab 3.11.
. Crontab-urile reprezint ˘a un set de task-uri efectuate în ordine cronologic ˘a, astfel c ˘a
fiecare linie reprezint ˘a o intrare. Fiecare intrare ofer ˘a informat ,ii despre cum ar trebui s ˘a
fie îndeplinit fiecare task, cum ar fi executarea unui script. Aceste task-uri individuale se
numesc "cron jobs(job-uri ale cron-urilor)".
Executia unui crontab se face utilizând sintaxa:
# crontab [–e [-u username] | -l [-u username] | -r [-u username] | file]
Argumentul -e reprezint ˘a posibilitatea de a edita fis ,ierul utilizând editorul implicit(de
exemplu, editorul vi). Dup ˘a editare, fis ,ierul este instalat ca s ,i fis ,ier de crontab pentru
44
3.2. Implement ˘ari viitoare
Figura 3.11: Setare Cron
usilizatorul actual în directorul Cron-ului. Dac ˘a fis ,ierul de crontab exist ˘a deja, acesta va
fi suprascris.
Argumentul -l listeaz ˘a cont ,inutul fis ,ierului, iar argumentul -r s ,terge fis ,ierul din direc-
torul de crontab.
Numele de utilizator ce urmeaz ˘a dupa argumentul -u(username) este opt ,ional, dar
specific ˘a ce fis ,ier de crontab este afectat de comand ˘a. De exemplu, un utilizator de baz ˘a
poate include numele de utilizator pentru a specifica posesorul unui anumit fis ,ier crontab.
Dac˘a argumentul ce cont ,ine numele de utilizator este invalid, comanda va genera o eroare.
Argumentul fis ,ierului din exemplul de mai sus înlocuies ,te fis ,ierul crontab specificat
cu fis ,ierul numit în argument. Cont ,inutul fis ,ierului de înlocuire trebuie s ˘a fie conform
formatului cronului daemon, pentru buna funct ,ionare a comenzilor crontab-ului.
Sintaxa fis ,ierului crontab
Sintaxa acestui fis ,ier este foarte important ˘a deoarece, în cazul în care exist ˘a erori de
sintax ˘a, crontab-ul utilizat nu va funct ,iona cum trebuie. Fiecare linie a fis ,ierului trebuie
s˘a cont ,in˘a s,ase câmpuri, în ordine secvent ,ial˘a. Acestea rânduri trebuie separate cu un
caracter special ce separ ˘a liniile Figura 3.12.
.
a) minute – numere de la 0 la 59
b) ore – numere de la 0 la 23
c) zile ale lunii – numere de la 1 la 31
d) luni – numere de la 1 la 12
e) zile ale s ˘apt˘amânii – numere de la 0 la 6, unde 0 reprezint ˘a ziua de duminic ˘a, iar 6
reprezint ˘a ziua de sâmb ˘at˘a
45
3.2. Implement ˘ari viitoare
Figura 3.12: Setare Cron
f) comanda – numele scriptului sau comanda de executat
Cont ,inutul primelor cinci câmpuri pot fi setate în câteva moduri:
1) ca num ˘ar în domeniul specificat: de exemplu, setând câmpul de minute la 6 în-
seamn ˘a c˘a scriptul va fi executat la al s ,aselea minut
2) ca list ˘a separat ˘a prin virgul ˘a pentru domeniu specificat: se poate seta câmpul ore la
2, 4, 16 pentru a executa scriptul la orele 2:00, 5:00 si 16:00
3) ca interval într-un domeniu: de exemplu, se poate seta câmpul ore de la 3-8, astfel
c˘a scriptul se va executa în fiecare or ˘a de la 3:00 la 8:00
4) ca asterisc(*): asterisc-ul este o carte de salvare ce se potrives ,te oric ˘arui num ˘ar din
domeniu
5) ca asterisc acompaniind o caloare: de exemplu, */5 plasat în câmpul de minute,
însemnând c ˘a scriptul se va executa o dat ˘a la 5 minute.
Cel de-al s ,aselea s ,i ultimul argument al comenzii specific ˘a numele scriptului sau co-
manda de executat.
În plus, fat ,˘a de câmpurile necesare, se poate opta s ˘a se genereze un fis ,ier de log sau
un fis ,ier de eroare, utilizând aceste argumente opt ,ionale:
1) fis ,ierul de log: specific ˘a un fis ,ier utilizând "»" urmate de numele fis ,ierului.
2) fis ,ierul de eroare: specific ˘a un fis ,ier de eroare utilizând "2»" urmate de numele
fis,ierului.
Denumirea de Cron este, de fapt, derivat ˘a din cuvântul de baz ˘a, "cronologie", ce
înseamn ˘a ordinea timpului.
Utilizând un Cron, un programator poate automatiza task-uri precum trimiterea de
mail-uri ce poate fi f ˘acut˘a în afara orelor de program, actualizare automat ˘a de statusuri,
sau regenerarea paginilor statice din resurse dinamice. Administratorii de sistem si ga-
zdele web este posibil s ˘a îs ,i doreasc ˘a s˘a genereze rapoarte privind cotele client ,ilor, s ˘a
completeze automat facturile cardurilor de credit sau alte task-uri similare.
Înainte s ˘a ne gândim la rularea unui program, avem nevoie de un script pentru a-l rula.
46
3.2. Implement ˘ari viitoare
Scriptul poate fi de tipul unui mail.
Pentru a seta rularea automat ˘a a unui fis ,ier, spre exemplu, „mailstock.php”, dac ˘a sun-
tem administratorul unui sistem, vom fi capabili s ˘a avem interfat ,a direct ˘a cu un Cron. La
un setup standard de Redhat, lucrurile sunt executate din /etc/crontab la intervale prede-
finite. Se seteaz ˘a anumite intervale din patru directoare diferite ce sorteaz ˘a task-urile pe
intervale de ore, zile, s ˘apt˘amâni s ,i luni.
Uneori, se dores ,te executarea unor scripturi pe parcursul noptii, în timpul weekendu-
lui sau în alte momente unde serverul nu este la fel de înc ˘arcat ca atunci când este folosit
la maxim. Aici este momentul în care un cron intr ˘a în funct ,iune.
Multe domenii gazd ˘a over ˘a interfet ,e pentru a putea administra cronurile. Aceasta
poate simplifica procesul de setare al cronurilor.
Procesul de setare a Cronurilor este asem ˘an˘ator atât pentru un utilizator normal, cât s ,i
pentru un administrator al sistemului.
Cea mai us ,oar˘a modalitate pentru a utiliza un crontab este prin comanda "crontab",
comand ˘a ce ajuta la editare. Prin intermediu acestei comenzi se face accesul c ˘atre editorul
în care se pot introduce comenzile dorite pentru rulare.
Sintaxa comenzilor este foarte important ˘a, în urma unor gres ,eli crontab-ul nu va
funct ,iona corect.
Pentru a putea lucra eficient cu Cron-urile prin intermediul limbajului de programare
PHP, utilizatorii trebuie s ˘a t,in˘a cont de reguli precise ale program ˘arii deoarece lucrul
într-o consol ˘a cu Cronurile este keysensitive.
Dac˘a se va încerca rularea unui script în PHP în aceeas ,i maniera ca a rul ˘arii Cron-
urilor, nu va avea niciun rezultat deoarece pentru ca un cod în limbajul PHP s ˘a fie parsat
va avea nevoie s ˘a treaca prin Apache. Cu alte cuvinte, pagina va trebui s ˘a fie chemat ˘a
printr-un browser web sau prin alte modalit ˘at,i de recuperare ale cont ,inutului web.
Pentru scopurile unui programator, se poate presupune configurat ,ia unui server ca
incluzând wget, la fel ca în cazul majorit ˘at,ii configurat ,iilor prestabilite. Pentru a putea
testa configurat ,ia dezvoltat ˘a, este necesar ˘a logarea în shell. Dac ˘a se foloses ,te un sistem
RPM(Redgatsau Mandrake), este necesar ˘a comanda "wget –help", dac ˘a exist ˘a un pachet
de identificare tip wget, acesta este instalat deja în sistem. Se pot executa comenzi de PHP
apelând "wget" al ˘aturi de URL-ul paginii: "wget https://www.proiect.com/licenta.php".
Dac˘a exist ˘a un fis ,ier php salvat în root-ul documentului, acesta ar trebui s ˘a poat ˘a
fi accesat prin intermediul Internetului. Comanda unui Cron ce se dores ,te s˘a ruleze la
ora 4 dup ˘a-masa, fusul orar de Est, trimit ,ând raportul de închidere al unui restaurant, în
contextul în care deja fusul orar este setat pe partea de Est, va ar ˘ata as ,a: "0 4 * * 1,2,3,4,5
wget http://www.example.com/mailstock.php".
47
3.3. Testarea
3.2.3 Anti-spider
Deoarece cu timpul aceast ˘a metod ˘a începe s ˘a fie din ce în ce mai utilizat ˘a de comerciant ,i,
au ap ˘arut cu timpul s ,i strategii anti-spideri.
Strategiile anti-spideri sunt utilizate de magazinele on-line în vederea opririi posibilit ˘at,ii
concurent ,ilor de a aduna pret ,urile lor, mai ales în contextul în care aces ,tia det ,in cele mai
bune pret ,uri de pe piat ,˘a.
Dezvoltarea de anti-spideri se face pe baza unor tool-uri ce opresc activitatea utiliza-
torilor ce fac mai multe request-uri pe paginile acestora într-un timp scurt.
3.3 Testarea
Testarea aplicat ,iei "Alinieri în comert ,ul on-line" s-a f ˘acut în funct ,ie de verific ˘arile de
cost aplicate la finalul procesului de aliniere.
Pentru a putea stabili un pret ,corect al produselor ce vor urma a fi afis ,ate în site, este
necesar ca acestea s ˘a respecte anumite reguli pe care fiecare magazin on-line va decide la
început s ˘a le urmeze.
O verificare de cost va consta în diverse calcule aplicate asupra pret ,urilor produselor
pentru a observa diferent ,a dintre pret ,urile de achizit ,ie s,i pret ,urile de baz ˘a, dintre pret ,urile
de baz ˘a s,i pret ,urile concurent ,ei s ,i diferent ,a dintre pret ,ul aliniat la magazinele aflate pe
piat ,˘a s,i pret ,ul de achizit ,ie al produselor det ,in˘atorului aplicat ,iei.
În cazul în care pret ,ul de achizit ,ie va fi mai mare decât pret ,ul obt ,inut în urma alinie-
rilor, pret ,ul produsului va r ˘amâne acelas ,i ca la ultima verificare.
În cazul în care pret ,ul obt ,inut în urma alinierii la piat ,a de comert ,on-line, mai specific
la magazinele urm ˘arite va produce un profit mai mic de 5% de asemenea, se va p ˘astra
pret ,ul la fel ca cel obt ,inut la ultima verificare.
Astfel, testarea aplicat ,iei este inclus ˘a în dezvoltarea aplicat ,iei, utilizând verific ˘ari
matematice pentru a observa cres ,terea sau sc ˘aderea pret ,urilor, diferent ,ele majore, sc ˘a-
derile pret ,urilor concurent ,ilor, ce pot afecta într-un mod negativ pret ,urile magazinului
det,in˘atorului, dar s ,i posibilitatea ca profitul unor produse s ˘a fie negativ, ceea ce înseamn ˘a
o pierdere mare pentru comerciant.
3.4 Concluzii
În prezent, piat ,a de comert ,on-line are o cres ,tere exponent ,ial˘a, majoritatea magazi-
nelor noi ap ˘arute preferând s ˘a ofere cump ˘ar˘atorilor s ,i posibilitatea de a vinde on-line,
posibilitate ce îi scutes ,te pe aces ,tia de multe nepl ˘aceri.
Des ,i fiecare comerciant este liber s ˘a îs ,i aleag ˘a singur pret ,ul pe care dores ,te s˘a îl ex-
pun˘a în site, aces ,tia trebuie s ˘a fie cons ,tient ,i de posibilitate unui es ,ec deoarece marii com-
48
3.4. Concluzii
petitori prefer ˘a s˘a cunoasc ˘a îndeaproape pret ,urile concurent ,ei pentru a ajunge la o balant ,˘a
între propriile dorint ,e s,i dorint ,ele client ,ilor.
Astfel, este recomandat în special noilor competitori pe piat ,a de comert ,on-line s ˘a
utilizeze metode prin care s ˘a cunoasc ˘a evolut ,ia pret ,urilor concurent ,ilor, fie low-level, fie
de nivel expert.
Aplicat ,ia "Alinieri în comert ,ul on-line" dezvoltat ˘a ofer ˘a posibilitatea micilor între-
prinz ˘atori de a urm ˘ari atât un num ˘ar relativ redus de concurent ,i s,i produse, dar s ,i posibi-
litate dezvolt ˘arii în vederea extinderii.
Problema rezolvat ˘a de aceast ˘a aplicat ,ie a fost sesizat ˘a în urma analizei piet ,ei comert ,ului
on-line, fiind sesizate diferent ,e mari de pret ,uri între mult ,i din competitori, dar s ,i din
nemult ,umirea cump ˘ar˘atorilor fat ,˘a de acest fapt.
Cele mai mari avantaje pe care aplicat ,ia le aduce sunt:
1) din punctul de vedere al comerciant ,ilor – profit mai mare în contextul în care ale-
gerile strategiilor vor fi f ˘acute corespunz ˘ator s ,i în funct ,ie de strategiile concurent ,ei
2) din punctul de vedere al cump ˘ar˘atorilor – vor avea s ,ansa de a alege dintr-o gam ˘a va-
riat˘a de magazine de încredere, cu pret ,uri asem ˘an˘atoare în momentul în care majoritatea
magazinelor on-line vor adopta aceast ˘a strategie.
Des ,i cei mai mari juc ˘atori ai acestei piet ,e utilizeaz ˘a deja metode de alinieri, pentru
a ajunge la o uniformizare ce va aduce beneficii c ˘atre ambele p ˘art,i, este necesar ca atât
marii cât s ,i micii comerciant ,i s˘a adopte aceste strategii.
49
Bibliografie
[1] J. Williams, “Why Web Crawling is Crucial For The Success of e-Commerce,”
https://www.probytes.net/blog/why-web-crawling-crucial-success-of-ecommerce/,
2018, [Online; accessed 20-July-2018].
[2] ——, “Web Crawling – The Backbone of E-commerce Applications,” https://www.
promptcloud.com/blog/web-crawling-in-ecommerce-applications/, 2015, [Online;
accessed 22-January-2015].
[3] F. Zaninotto, “The definitive guide to symfony,” 2007.
[4] M. Noback, “Best intro to symfony,” 2013.
[5] F. Potencier, “The definitive guide to symfony,” 2007.
[6] “About Symfony Project,” https://symfony.com/about, 2019.
[7] “7 Good Reasons to Use Symfony Framework for Your Project,” https://hackernoon.
com/7-good-reasons-to-use-symfony-framework-for-your-project-265f96dcf759,
2018.
[8] “The Lightning-Smart PHP IDE,” https://www.jetbrains.com/phpstorm/, 2019.
[9] “Quick Start Guide,” https://www.jetbrains.com/help/phpstorm/
quick-start-guide-phpstorm.html, 2019.
[10] “Easily manage multiple ssh sessions through mtputty.”
[11] “HeidiSQL-What’s this?” https://www.heidisql.com/, 2015.
[12] “Free and popular NoSQL databases,” https://bigdata-madesimple.com/
18-free-and-widely-used-open-source-nosql-databases/, 2014.
[13] “HeidiSQL-More about,” https://en.wikipedia.org/wiki/HeidiSQL, 2019.
[14] “What can RabbitMQ do for you?” https://www.rabbitmq.com/features.html, 2017.
50
Bibliografie
[15] “What Is RabbitMQ? What Does It Do For Me?” https://derickbailey.com/2016/10/
12/what-is-rabbitmq-what-does-it-do-for-me/, 2016.
[16] “PHP DOM: Working with XML,” https://www.sitepoint.com/
php-dom-working-with-xml/, 2012.
[17] “DOMDocument::loadHTML,” https://www.php.net/manual/ro/domdocument.
loadhtml.php, 2001-2019.
[18] “PHP: simplexml load string,” https://www.php.net/manual/ro/function.
simplexml-load-string.php/, 2001-2019.
[19] “PHP: JSON Encode,” https://www.php.net/manual/ro/function.json-encode.php,
2001-2019.
[20] “PHP: JSON Decode,” https://www.php.net/manual/ro/function.json-decode.php,
2001-2019.
[21] “PHP: Exceptions,” https://www.php.net/manual/ro/language.exceptions.php,
2001-2019.
[22] “PHP: Exception Handling,” https://www.w3schools.com/php/php_exception.asp,
2018.
[23] “PHP: Trim,” https://www.php.net/manual/ro/function.trim.php, 2018.
[24] “Introducing Cron,” https://www.sitepoint.com/introducing-cron/, 2003.
[25] “Writing an automating PHP Crons in Windows and Linux,” http://www.devx.com/
DevX/Article/39900, 2008.
51
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Licenta Larisa (3) [619474] (ID: 619474)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
