ASUPRA OPTIMIZĂRII PROCESĂRII CERERILOR MYSQL PENTRU CREŞTEREA CALITĂŢII PLATFORMELOR E-LEARNING. Vasile MOLDOVAN * Florin POPENTIU-VLADICESCU ** The paper presents some aspects concerning the quality improvement of the script design, using MySQL for the development of the e-learning platforms. Also some methods and techniques are proposed for the optimisation of the execution time for query processing using these data bases. The performances of these methods and techniques are illustrated by experimental results. Key words: E-learning,Web Based Learning, query optimization, execution time, databases. 1. Introducere Dezvoltarea explozivă a internetului a permis extinderea acestuia si pentru domeniul învăţământului la distantă. Această nouă abordare a constituit începutul unei schimbări fundamentale a modului în care se învaţă, se predă sau se auto-învaţă, cu scopul formării continue a studenţilor, a căror vârstă nu mai constituie a barieră. Faţă de învăţământul tradiţional, care este organizat pe grupe de vârstă, cel on-line este axat pe subiecte. In noua viziune la acelaşi curs on-line, pot participa studenţi de vârste, pregătiri, si experienţe profesionale diferite, provenind din zone geografice distincte. În esenţă, învăţământul la distanta (E-learning-ul) oferă accesul comod şi eficient al studenţilor la informaţii şi cunoştinţe de ultimă ora, metode moderne şi eficiente de predare si învăţare. In această nouă abordare studenţii pot beneficia de o instruire şi o formare permanentă precum şi o evaluarea on-line a cunoştinţelor lor. În acest sens, E-learning-ul este o alternativă la educaţia permanentă în societatea informatizată de azi sau de mâine.[1] Pentru termenul de E-learning nu se poate afirma că există un consens clar privind înţelesul intrinsec, dar in general E-learning este sinonim cu: Online Learning, Distance Learning sau Web Based Learning Web-Based Training (WBT).[12] În cele ce urmează, se va face referire la E-learning în sensul de Web Based Learning, utilizând facilităţile oferite de câtre internet. Referindu-ne la aceste sisteme putem afirma cu certitudine ca regulile generale pentru o pagină Page 1 of 10
de web, sunt valabile atât în privinţa realizării cât şi a exploatării ulterioare. In continuare vom prezenta cele 2 aspecte menţionate anterior. 2. Limbajul server-side E-learning-ul fiind bazat pe web, pentru exemplificare am ales unul dintre posibilele limbaje, şi anume cel mai răspândit, PHP-ul deoarece sistemele dedicate acestor procese sunt dinamice. În istoria tehnologiilor utilizate la realizarea site-urilor web, limbajul PHP a apărut in 1994 din nevoia lui Rasmus Lerdof de a afla câte persoane îi vizualizează pagina de internet. El a denumit setul de scripturi create PHP, acronimul pentru Personal Home Page. Evoluţia limbajului a fost spectaculoasă în anii următori, dar adevăratul succes a început să se concretizeze când Zeev Suraski şi Andi Gutmans şi-au adus contribuţia la motorul PHP, motor care poartă de la versiunea 4 a PHP numele Zend, o combinaţie de litere din prenumele creatorilor săi: Zeev şi Andi. [4] Fiind open-source, PHP beneficiază de un suport important şi constant din partea comunităţii on-line, foarte numeroase, fapt care a dus la răspândirea rapidă a paginilor de internet care folosesc acest limbaj. Intre anii 2000 şi 2002 numărul lor a crescut de peste 130 de ori, in timp ce numărul site-urilor bazate pe alte tehnologii cum sunt ASP(Active Server Pages), Java Server Pages (JSP) sau Cold Fusion s-a mărit de maxim 16 ori.[12] Pe lângă multiplele avantaje pe care le are, cum ar fi funcţiile multimedia, manipularea conţinutului, utilizarea variabilelor HTTP[6], cea mai semnificativă rămâne totuşi uşurinţa cu care acesta lucrează cu bazele de date. Programatorul are la îndemână o serie de funcţii dedicate pentru utilizarea bazelor de date şi astfel din codurile PHP poate apela practic toate comenzile MySQL. 3. MySQL. Baze de date. MySQL este cea mai folosita soluţie pentru aplicaţii cu baze de date. Răspândirea pe scară largă se datorează în principiu, faptului că MySQL este open-source dar si contribuţiei, respectiv suportului companiei producătoare [7]. Am putea enumera o serie de firme mari care utilizează popularul MySQL printre care este suficient dacă re-amintim Google sau Yahoo. Se poate afirma că un procent semnificativ dintre aplicaţiile care folosesc această soluţie sunt bazate pe internet sau intranet, pagini de web, portaluri de web, aplicaţii client server. MySQL se poate utiliza şi la aplicaţii desktop, chiar mai mult decât atât, se poate folosi aproape cu toate limbajele de programare de nivel înalt, de la.net până la PHP. Page 2 of 10
Pe lângă versiunea open-source[9], dacă se intenţionează utilizarea platformei în scopuri comerciale, atunci se impune achiziţionarea unei versiuni cu licenţă. Una dintre cele mai răspândite soluţii, ce sta la dispoziţia utilizatorului bazelor de date este popularul PhpMyAdmin, care este realizat în întregime in PHP si are o interfaţă foarte prietenoasă, ca alternativă la linia de comandă pentru executarea comenzilor MySQL[2]. PhpMyAdmin este foarte des utilizat ca şi componentă integrantă în pachetele de administrare ale servere-lor de web (pachetele de găzduire), împreună cu aplicaţia Cpanel. În cazul articolului de faţă au fost utilizate în tandem atât PhpMyAdmin cat şi o aplicaţie care rulează sub Windows, Navicat. Acesta are deja o serie de facilităţi privind exportul şi importul de date în diferite formate şi poate fi chiar generator de query-uri[8]. 4. Despre platformele E-learning. În cazul învăţământului bazat pe internet, au apărut o serie de soluţii comerciale, dar şi gratuite sub incidenţa licenţei open-source, dezvoltate de diferite firme sau comunităţi, soluţii care se pot defini mai exact prin denumirea de Learning (Content) Management System - L(C)MS. Un sistem de management al conţinutului (SMC.) este procesul de aprovizionare sistematică şi structurată, de creare, prelucrare, administrare, prezentare, procesare, publicare şi reutilizare al conţinutului [5]. Avantajele unor astfel de sisteme sunt multiple, dar poate cel mai relevant este acest "anytime, anywhere", adică accesibilă oricând şi de oriunde, necesitând doar un acces la internet prin intermediul unui navigator(browser)[12] de web. Dintre facilităţile, cerinţele ridicate de un astfel de sistem, se pot menţiona: crearea de conţinut - permite generarea la orice moment a unor categorii noi de cursuri (materii), conţinuturi aferente, prin importul cât mai uşor al diferitelor formate electronice (MsWord, MsPowerPoint, Pdf,...)[12]; managementul conţinutului - aceste sisteme trebuie să asigure uneltele necesare organizării eficiente a conţinutului, trecerea la diferite versiuni, stocarea datelor şi arhivarea acestora; compatibilitatea - un alt criteriu, menit să asigure schimbul facil de informaţii între astfel de sisteme; flexibilitatea - modificări în definiţiile entităţilor şi a relaţiilor dintre acestea nu vor necesita modificări esenţiale la nivelul structurii bazei de date; scalabilitatea - nu vor exista probleme de performantă la mărirea volumului de date procesat; Page 3 of 10
abstractizarea - modelul trebuie să asigure gestiunea datelor pentru orice aplicaţie similară orientată spre publicarea informaţiei, structura tabelelor de baza trebuie sa fie similară. In utilizarea bazelor de date, servere de web, sisteme(site-uri) bazate pe web, se poate contura un scenariu limită Acest lucru se datorează accesării prea lente a bazelor de date, a timpilor de răspuns prea mari, a cerinţelor greşite (fără rezultate), a creşterii jurnalelor de erori si in consecinţă utilizatorii încep să fie refuzaţi de la conectare. Aceste neajunsuri se pot ameliora şi chiar elimina, dacă sistemul în cauză este proiectat corespunzător condiţiilor ulterioare de funcţionare. Creşterea calităţii acestor platforme are o serie de parametri de care aceasta caracteristică depinde în mod direct. Satisfacerea cerinţelor clienţilor în acest context, se reflecta prin disponibilitatea continuă a informaţiilor în vederea consultării acestora în cât mai bune condiţii. De multe ori însă acest deziderat este foarte greu de atins în mediul internet. Dacă ne gândim doar la răspândirea pe scară largă a mai multor tipuri (standarde) de motoare de cautare (IExplorer, Mozilla, Opera, etc.) şi aici putem sublinia lipsa unui standard general valabil pentru HTML şi CSS [12]. De asemenea putem remarca diferenţa dintre sistemele de operare, rezoluţii şi de ce nu, diferenţele de codepages, mai exact de caractere specifice unor regiuni sau ţări. De asemenea există in lumea virtuală formate diversificate de documente, nu întotdeauna cele standardizate, cum ar fi pdf-ul. Prin urmare, dacă nu luăm în considerare toţi aceşti factori, este foarte greu să se atingă un nivel de calitate cât mai ridicat. În cadrul lucrării de faţă, se prezintă unele aspecte şi concluzii legate de partea de software (ansamblul de scripturi şi baze de date). Acestea sunt rezultatul preocupării autorilor în direcţia mai sus mentionata, pentru asigurarea unei funcţionări optime, prin care să se atingă nivelul de calitate necesar acestor platforme. Sub aspectul optimizării acestor sisteme, în lucrarea de faţă factorul de interes este timpul de executare al scripturilor care se realizează pe partea de server, informaţia returnându-se utilizatorului prin intermediul unui navigator de internet. In continuare se prezintă câteva dintre rezultatele obţinute în acest sens. 5. Optimizarea procesării Pentru a face o analiză asupra timpilor de executare ai cerinţelor MySQL şi prin intermediul script-urilor PHP, s-a creat o baza de date simbolică, de 2000 de înregistrări a utilizatorilor, de tip e-learning prezentata in Tabelul 1. Page 4 of 10
Tabelul 1: Coloana Tip Lungime Special ID INT 11 Unique NUMELE VARCHAR 255 PRENUMELE VARCHAR 255 EMAIL VARCHAR 255 TELEFON VARCHAR 255 ANUL VARCHAR 255 SECTIA VARCHAR 255 USERNAME VARCHAR 255 PAROLA VARCHAR 255 Măsurarea timpilor de executare ale script-urilor rulate s-a făcut folosind funcţia microtime() din PHP, care returnează timpul UNIX curent. Inserând secvenţa de cod: $mtime = microtime(); $mtime = explode(" ",$mtime); $mtime = $mtime[1] + $mtime[0]; $starttime = $mtime; la începutul fişierelor iar secvenţa $mtime = microtime(); $mtime = explode(" ",$mtime); $mtime = $mtime[1] + $mtime[0]; $endtime = $mtime; $totaltime = ($endtime - $starttime); la sfârşitul acestora, avem posibilitatea să determinăm cu exactitate timpul scurs între cele două secvenţe. Valoarea timpului de executare al script-ului analizat, este regăsită în variabila $totaltime. În general, înainte de a scrie orice aplicaţie web, trebuie foarte bine cunoscute cerinţele şi condiţiile in care aceasta va fi folosită. În cele ce urmează prezentăm câteva dintre rezultatele obţinute, prin teste, folosind structura de baza de date ilustrata anterior. Se pot delimita două direcţii majore prin care se reduc timpii de executare, când se folosesc script-uri server-side, care lucrează cu baze de date şi deservesc utilizatorii prin intermediul unui browser web. 6. Optimizarea liniilor de cod Ne referim în cazul nostru la optimizarea rulării secvenţelor de program PHP. Aceste secvenţe sunt imbricate în codul HTML, sau se regăsesc individual, dar oricum rezultatul este tot un cod HTML. Page 5 of 10
Se poate afirma, ca este bine ca trecerea de la HTML la PHP în cadrul unui script să se facă de cât mai puţine ori, adică secvenţa de deschidere <? > (una dintre cele patru posibile) să se reducă la minim. Pentru a verifica practic acest lucru am măsurat timpii de executare pentru două variante diferite ale unui script PHP, care ia anumite date din baza de date e-learning din Tabelul 1 şi le afişează sub o formă convenabila(cod HTML) într-un browser. Cazul 1. - Neoptimizat În interiorul buclei WHILE care parcurge rezultatele primite din baza de date, la fiecare pas se trece din PHP in HTML de mai multe ori pentru afişarea codului HTML corespunzător rândului de tabel, astfel: while($row=mysql_fetch_array($result)) {?> <tr> <td><? echo $row['id'];?></td> <td><? echo $row['numele'];?></td> <td><? echo $row['prenumele'];?></td> <td><? echo $row['telefon'];?></td> </tr> <??> </table> Cazul 2. - Optimizat În interiorul buclei WHILE, codul HTML aferent rândului din tabel se pune într-un echo, astfel trecerea de la codul PHP la HTML nu se mai realizeaza. while($row=mysql_fetch_array($result)) { echo " <tr> <td>$row[id]</td> <td>$row[numele]</td> <td>$row[prenumele]</td> <td>$row[telefon]</td> </tr> "; Page 6 of 10
?> </table> Rezultatele obţinute pentru cele două variante se prezintă în tabelul de mai jos mai jos. Tabelul 2: Nr. Înregistrări Timp-caz1 [sec] Timp-caz2 [sec] 1 200 0,132285881042 0,215481119156 2 400 0,250323057175 0,233474969864 3 600 0,294636020660 0,261955022812 4 800 1,383291959760 1,307677030560 5 1000 2,022243022920 2,081826925280 6 1200 2,429026126860 2,186830997470 7 1400 2,884603977200 2,667994976040 8 1600 5,217308998110 2,755152940750 9 1800 5,420905876160 3,827739953990 10 2000 6,206202030180 5,991676092150 7. Optimizarea cererilor(query) MySql Prezentăm de asemenea rezultatele obţinute pentru cazul cererii trimise de script-ul PHP către MySQL, în vederea afişării datelor cu care a fost populată[11] Prezentam tabelul utilizatori sub forma de mai jos. Tabelul 3: Id Numele Prenumele Telefon 1 Se porneşte de la premiza că se doreşte afişarea tuturor utilizatorilor care satisfac o anumită condiţie. Greşeala majoră in asemenea cazuri, atunci când avem de a face cu un volum mare de date, este de a selecta toate înregistrările, urmând ca din tabloul în care acestea sunt plasate sa se afişeze numai acelea care satisfac o anumită condiţie. Soluţia optimă este oferită de interogarea optimă a bazei de date cu scopul selectării numai a acelor date care prezintă interes. În cazul de faţă, am modificat înregistrările câmpurilor anul din Tabelul 1, care reprezintă utilizatorii, la jumătatea numărului de înregistrări (1000) In acest mod valoarea conţinută este 2, deoarece se doreşte afişarea acelor utilizatori (studenţi) care sunt înscrişi in anul de studiu 2.( valoarea implicită este 1 ). Page 7 of 10
Cazul 1. - Neoptimizat Cererea MySQL va selecta toate înregistrările din Tabelul 1, dar se vor afişa doar acele rânduri(înregistrări) unde anul este egal cu 2. Cererea are forma: $query="select * FROM utilizatori"; Iar secvenţa de afişare WHILE: while($row=mysql_fetch_array($result)) { if ($row['anul'] == 2) { echo " <tr> <td>$row[id]</td> <td>$row[numele]</td> <td>$row[prenumele]</td> <td>$row[telefon]</td> </tr> "; Pagina cu rezultate a fost generată in 2.37645101547 secunde. Cazul 2. - Optimizat În acest caz cererea MySQL are forma: $query="select * FROM utilizatori WHERE anul=2 "; Iar secvenţa de afişare WHILE: while($row=mysql_fetch_array($result)) { echo " <tr> <td>$row[id]</td> <td>$row[numele]</td> <td>$row[prenumele]</td> <td>$row[telefon]</td> </tr> "; Page 8 of 10
Astfel, pentru optimizarea făcută, am obţinut un timp de generare al rezultatelor in 1.80704913139 secunde. Diferenţa faţă de cererea anterioară este de 0,569401884080. Se poate observa, cum prin analiza atentă a problemelor şi alegerea variantelor optime se pot obţine diferenţe semnificative. În cadrul lucrării de faţă s-a folosit ca platformă de testare un calculator personal IBM, având ca sistem de operare Windows 2000 Profesional + Service Pack 4, cu pachetele necesare pentru realizarea de server web: - Apache 2.0.48 (Win32) ca server de web - PHP Versiunea 4.3.10 - procesor hypertext - MySQL Server 4.1 pentru baza de date Asupra măsurătorilor efectuate cu diferite combinaţii şi sintaxe, atunci cand se ia în considerare si utilizarea script-urior PHP, se pot formula unele recomandări privind obţinerea unor timpi minimi de executare pe platformele de acest gen. (Anexa 1) Concluzii In cazul cererilor optimizate, am obţinut un timp de generare al rezultatelor in 1.80704913139 secunde, câştigul faţa de cererea anterioara fiind 0,569401884080 secunde. Este evident faptul că printr-o analiza atentă a problemelor şi alegerea variantelor optime se pot obţine avantaje semnificative. Bibliografie [1] M. Vlada, E-Learning şi Software educaţional, Conferinţa Naţionala de Învăţământ Virtual, 2003, pag. 1 2 http://fmi.unibuc.ro/cniv/, accesat la 10.01.2007 [2] Matthew Norman, Database Design Manual, PHP şi MySQL, Springer 2004, pag. 199-203 [3] Betsey Bruce, Building Online Learning Applications, Peachpit Press 2002, pag. 420-446 [4] Simon Stobart, Mike Vassileich, PHP and MySQL Manual, Springer 2004, pag. 29-35 [5] Farida Hasanali, Paige Leavitt, A Guide for Your Journey to Knowledge Management, APQC 2003, pag. 63-90 [6] Larry Edward, Php and MySQL for dinamic webpages, Peachpit Press 2003, pag. 107-112 [7] Hugh E. Williams, David Lane, Web Database Applications with PHP & MySQL, O'Reilly 2002, pag. 110-113 [8] Ben Forta. MySQL Crash Course, Computers 2005, pag. 121-131 [9] Andrew M. St. Lauren, Understanding Open Source and Free Software Licensing, O'Reilly 2004, pag. 1-11 [10] Larry Edward Ullman, Php and MySQL for dinamic webpages, Peachpit Press 2003, pag. 185-189 Page 9 of 10
[11] Julie C. Meloni, PHP Essentials, Second edition, Tomson Course Technology 2000, pag. 109-135 [12] E-Learning glossary - World's biggest e-learning glossary - http://www.elearningguru.com/gloss.htm, accesat la 11.01.2007 Anexa 1 1. Se vor selecta, în cadrul unei fraze SELECT, doar câmpurile de interes şi se va evita folosirea SELECT *, ori de cate ori este posibil; 2. Se vor plasa cele mai semnificative argumente cât mai la dreapta posibil deoarece MySQL interpretează interogările de la dreapta la stânga; 3. Se va evite folosirea unor valori care se schimbă foarte rar ca înregistrări în baza de date. Este preferabil ca acestea să fie incluse în fişiere de unde vor fi încărcate la nevoie; 4. Se recomanda folosirea index-urilor,[10] unde este cazul pentru a reduce timpii de acces, mai ales la utilizarea frecventă a SELECT-urilor; 5. Se recomanda folosirea parametrului LIMIT 1; in cazul când se doreşte selectarea unei singure înregistrări, astfel MySQL se opreşte după ce a fost găsită înregistrarea [9]; 6. Selectarea din baza de date de face utilizand: $line=mysql_fetch_array($result), deoarece rezultatele se pot accesa în două moduri: a) $line[0] sau b) $line['numecoloana']; in cazul in care se optează pentru $line['columnname'] este de preferat să se folosească $line = mysql_fetch_assoc($result), deoarece nu va mai exista nici un tablou $line[int_index]; 7. Se va evita interogarea bazei de date de mai multe ori consecutiv pentru aceleaşi date, este recomandabil ca rezultatele sa se salveze în variabile; 8. Se recomandă pe cât posibil, folosirea valorii implicite NOT NULL, deoarece crescând timpul de executare, se economiseste câte un bit; 9. Se vor folosi tipurile de date strict necesare pentru a acoperi plaja acestora, nu foarte mari, de exemplu INT poate acoperi până la 4294967295 fără semn, lucru care de obicei nu este necesar (MEDIUMINT sau SMALLINT este preferabil); 10. Se va evita folosirea a prea multe tag-uri <?...?> fapt care încetineste viteza de rulare; 11. Şirurile de caractere se vor pune între faţă de deoarece PHP-ul nu trebuie să caute după variabile; 12. Funcţia echo este mai rapida decât print; 13. Se vor iniţializa valorile maxime pentru bucle, înainte de a intra în buclă şi în interiorul secvenţei: $valoare_max = 100/10; for($i=0; $i<$ valoare_max; $i++){ // corp ciclu este mai rapid decât, for($i=0; $i<100/10; $i++){ // corp ciclu. * Asist.drd.ing., Universitatea din Oradea ** Prof.univ.dr., Universitatea din Oradea Page 10 of 10