În ultimul timp, este posibil să fi auzit de o nouă extensie pentru PHP: SQLite. Există multe motive pentru care SQLite poate părea cea mai bună realizare de când ați învățat cum să tăiați pâinea. SQLite oferă o interfață solidă SQL la o bază de date non-relațională și creează o alternativă elegantă la interfețele greoaie ale altor baze de date, fără a sacrifica funcționalitatea sau viteza, așa cum ne-am aștepta. Vom analiza această extensie uimitoare în articol și sperăm că vom putea confirma beneficiile pe care le-ați auzit.
Ce este SQLite?
SQLite - a construit o bibliotecă care pune în aplicare o mulțime de standard SQL 92. sa pretind că faima este ca motorul real a bazei de date în sine și interfața sa (sau mai degrabă motorul său), într-o bibliotecă, precum și capacitatea de a stoca toate datele într-un singur fișier. Am atribuit poziția funcției SQLite undeva între MySQL și PostgreSQL. Cu toate acestea, în practică, SQLite este mai rar de 2-3 ori (și chiar mai mult) mai rapid. Acest lucru este posibil datorită arhitecturii interne foarte ordonate și eliminării nevoii de conexiuni server-client și client-server.
Toate acestea, asamblate într-un pachet, sunt doar puțin mai mari decât partea client a bibliotecii MySQL, este o realizare impresionantă pentru o bază de date cu drepturi depline. Folosind o infrastructură extrem de eficientă, SQLite poate lucra într-o cantitate mică de memorie alocată acesteia, mult mai mică decât în orice alt sistem de baze de date. Acest lucru face SQLite un instrument foarte convenabil, cu capacitatea de a folosi aproape orice sarcină atribuită bazei de date.
De ce am nevoie de SQLite?
În plus față de viteză și eficiență, SQLite are și alte avantaje care îl fac o soluție ideală pentru multe sarcini. Deoarece baza de date SQLite este în esență fișiere obișnuite, nu este nevoie de instrumente suplimentare de administrare care necesită mult timp pentru a crea o structură complexă de drepturi de acces pentru a proteja bazele de date ale utilizatorilor. Toate acestea sunt deja suportate automat de organizarea drepturilor de acces în sistemul de fișiere în sine, implică (în zona de limitare a spațiului) că nu sunt necesare reguli speciale pentru a urmări spațiul de pe disc al utilizatorului. Avantajul pentru utilizatori este că este posibil să se creeze cât mai multe baze de date pe care le doresc, plus un control absolut asupra tuturor acestor baze de date.
Faptul că baza de date este singurul fișier face ușor portabil. SQLite elimină, de asemenea, necesitatea de a rula daemoane suplimentare care ar putea "mânca" o cantitate semnificativă de memorie și alte resurse, chiar dacă baza de date este folosită moderat.
Ca cea mai recentă extensie DB, SQLite a avut norocul de a nu avea cod pentru compatibilitate înapoi, spre deosebire de extensiile mai vechi, cum ar fi MySQL. care sunt necesare pentru a menține funcționalitatea depășită din motive de compatibilitate înapoi. Acest lucru permite, de asemenea, extinderii noi să utilizeze ultimele evoluții din PHP pentru a atinge cel mai înalt nivel de performanță și funcționalitate. Dezvoltatorii au făcut mai ușor utilizatorilor să creeze o extensie ușor de navigat la acesta din alte sisteme de baze de date, lăsând interfața similară celor deja implementate în PHP.
SQLite sprijină, de asemenea, un mecanism flexibil pentru transferul de date a resurselor în interfețele procedurale, făcându-l la fel de ușor pentru a comuta de la MySQL, în cazul în care resursa este transferată către acesta din urmă, și PostgreSQL, unde a trecut primul.
SQLite oferă, de asemenea, o interfață puternică orientată spre obiect, care poate fi utilizată pentru a extrage eficient datele din baza de date, eliminând necesitatea executării propriului shell pentru o interfață procedurală. După cum se arată în exemplul de mai jos, interfața orientată pe obiecte vă permite, de asemenea, să evitați transferul tuturor resurselor într-o grămadă.
În PHP 5.0, instalarea SQLite are propriile particularități, deoarece extensia și biblioteca sunt conectate împreună, deci tot ce trebuie să faceți este să adăugați -with-sqlite în linia de configurare. Încă aș recomanda instalarea SQLite, dar numai dacă este un fișier binar compilat care vă va permite să deschideți baza de date și să o gestionați fără a utiliza PHP. Acest lucru este foarte util pentru depanarea și executarea diferitelor comenzi simultane și este, de asemenea, util pentru testarea codului interogării. În viitor, destul de des veți descoperi că biblioteca SQLite asociată este puțin "depășită", deci o grămadă de PHP cu o bibliotecă externă vă va permite să beneficiați de cele mai recente soluții și inovații de la SQLite. Acest lucru vă va permite de asemenea să vă actualizați SQLite-ul în viitor fără a recompila PHP.
Pentru a construi extensia SQLite ca o bibliotecă externă, pur și simplu utilizați -with-sqlite = / path / to / lib /.
De asemenea, ar trebui să menționez că extensia SQLite trece printr-o serie exhaustivă de teste, atât pentru interfețe orientate pe obiecte, cât și pentru proceduri. Fiecare funcție individuală este testată și fiecare metodă este suportată de SQLite. Aceasta este o sursă excelentă de exemple nu numai despre modul în care funcționează fiecare metodă și fiecare funcție SQLite, dar și despre rezultatul așteptat, permițându-vă să vedeți rezultatul final al fiecărei operații.
Interfața procedurală cu SQLite este aproape identică cu cea a MySQL și a altor extensii de baze de date. În cea mai mare parte tranziția la SQLite va necesita doar schimbarea mysql / pq / etc ... prefixul funcției pe sqlite.
De fapt, diferențele semnificative între SQLite și alte baze de date se află în motorul propriu-zis. Spre deosebire de alte baze de date din SQLite, nu există legare la tipuri; toate datele sunt stocate ca șiruri care se termină cu un caracter NULL, ceea ce este mai bun decât reprezentarea binară a datelor în coloanele de tip special. Din cauza compatibilității, SQLite suportă încă tipul de specificație în construcțiile CREATE TABLE, de exemplu INT, CHAR, FLOAT, TEXT și altele asemenea, dar nu le utilizează cu adevărat. În interiorul bazei de date, SQLite distinge numai între date de tip șir și întreg în timpul sortimentului. Prin urmare, dacă nu veți sorta datele, puteți face acest lucru fără a specifica un tip special de câmpuri atunci când creați tabele în SQLite.
„Natura Beztipovaya“ SQLite face sortarea și compararea datelor într-un mod mai lent, deoarece SQLite de fiecare dată când va trebui să determine tipul de date și se aplică un șir de sortare / mecanism de comparare sau numerică. Tabelele SQL necesită adesea o cheie atribuită automat pentru accesul rapid la celule, adică întoarcerea unui link către ultima celulă adăugată. Pentru SQLite, această sintaxă este inutilă, pentru ao pune ușor. Pentru a crea o astfel de tabelă, va trebui să declare câmpul ca INTEGER KEY PRIMARY, ceea ce este mai convenabil decât specificarea unui tip specializat sau atribuirea unor proprietăți suplimentare care indică faptul că câmpul este autoincremenit.
După cum vă puteți aștepta, SQLite are multe caracteristici noi care îmbunătățesc performanța și extind funcționalitatea. O astfel de caracteristică este capacitatea de a efectua interogări similare care implică executarea mai multor solicitări prin intermediul funcției de executare a unei interogări. Aceasta reduce numărul de funcții implicate în PHP și crește astfel viteza scenariului. De asemenea, vă permite să grupați ușor blocurile de interogări în cadrul tranzacțiilor, îmbunătățind execuția în viitor. Această posibilitate poate fi un factor semnificativ în timpul executării mai multor solicitări de scriere în baza de date. Cu toate acestea, există câteva caracteristici pictate, care nu trebuie uitate.
Dacă orice interogare din SQLite utilizează ceva introdus direct de utilizator, ar trebui să luați măsuri de precauție suplimentare pentru a testa această intrare pentru a opri interogarea nedorită. Spre deosebire de MySQL, în cazul în care acest lucru poate duce la o neînțelegere cu interogarea bazei de date și de a genera o eroare în SQLite va permite atacatorului sa execute orice interogare pe server, cu posibile consecințe dezastruoase. Dacă adăugați o înregistrare printr-o casetă de interogare și ar dori să se întoarcă ID-ul sqlite_last_insert_rowid () făcut față cu bine această sarcină, dar returnează numai identificatorul ultimei înregistrări. Pe de altă parte, atunci când încearcă să determine cât de multe celule au fost schimbate cu ajutorul sqlite_changes (), vom obține un rezultat care conține numărul total de celule modificate de către toate interogare. Dacă interogarea conține blocul SELECT, asigurați-vă că aceasta este prima cerere, în caz contrar proba finală nu va conține celule care sunt returnate pentru această interogare.
În plus față de noile caracteristici interne, SQLite oferă o serie de funcții noi care simplifică și accelerează extragerea datelor din baza de date.
Aceasta vă permite să executați o interogare și să preluați date printr-un singur apel, eliminând toate lucrările inutile ale PHP. Scriptul PHP în sine este simplificat, folosind o singură funcție în cazul în care altfel ar trebui să utilizați mai multe funcții pentru a prelua datele care lucrează în bucla. În cazurile în care rezultatul unei singure coloane este returnat, puteți folosi sqlite_single_query (), care returnează instantaneu un șir sau o serie de rânduri, în funcție de numărul de celule din care sunt extrase informațiile.
Ca și în cazul altor funcții, îl puteți folosi, dar nu trebuie să-l abuzați. În cazul eșantionării tuturor datelor, o interogare cu o singură trecere, trebuie să vă amintiți că toate rezultatele vor fi stocate în memorie. Dacă rezultatul eșantionului conține o cantitate mare de date, costul memoriei va neglija cu siguranță toate beneficiile obținute prin reducerea numărului de apeluri funcționale. Prin urmare, trebuie să rezervați utilizarea acestor funcții pentru cazuri de eșantionare a unei cantități mici de date.
Iteratori în SQLite
În PHP 5.0 există o altă modalitate de a prelua datele utilizând o interogare folosind iteratori.
Obținerea de rezultate în bucla funcționează exact în același mod ca și matrice care se extinde într-o buclă prin foreach (), cu excepția faptului că în acest moment nu au acces la cheile și valoarea este o matrice care conține datele din celule specifice. Deoarece iteratorii nu funcționează, și indicii interne în motor, acestea necesită mult mai puține resurse decât funcțiile sqlite_fetch _ * (), și nu necesită ca rezultatele sunt trecute în memoria cache. Rezultatul final va fi extrem de rapid, este o metodă mai simplă și mai accesibilă de extragere a datelor. Nu există nici efecte secundare la folosirea iteratorii în obiectele SQLite, și ori de câte ori este nevoie pentru a obține un rezultat sub forma unei multitudini de rânduri, trebuie să fie sigur de a păstra în minte cu privire la această posibilitate.
SQLite distinge, de asemenea, o serie de funcții auxiliare care pot fi utile în timpul lucrului cu baza de date. Una dintre aceste funcții, sqlite_num_fields (), poate fi utilizată pentru a determina numărul de coloane din rezultatele probelor speciale. Alternativ, dacă doriți să extrageți datele, trebuie doar să utilizați numărul () cu primul rezultat, care va reveni la același număr. Dacă se extrage atât șirul, cât și cheile numerice, va trebui să separați rezultatul, deoarece în tabela rezultată vor apărea cât mai multe evenimente, deoarece există câmpuri în tabel. Acest număr poate fi important dacă scriptul dvs. trebuie să obțină numele câmpurilor dintr-o anumită masă. În acest caz, ați putea folosi sqlite_field_name () într-o buclă pentru a accesa aceste informații, așa cum se arată în exemplul de mai jos.
Desigur, aceasta nu este o modalitate ideală de a obține numele coloanelor din tabel, pur și simplu pentru că va eșua atunci când tabela nu conține nici o celulă și, de asemenea, pentru că vă va cere să preluați datele pe care nu intenționați să le utilizați . O soluție mult mai bună este să utilizați funcția sqlite_fetch_column_types (), care obține coloanele împreună cu tipurile acestora din tabel, indiferent dacă există date acolo sau nu.
În majoritatea cazurilor, din motive de funcționare sau de utilizare a memoriei, nu doriți să utilizați interogări fără cache. Acest lucru poate duce la o mică pierdere de funcționalitate, care poate fi necesară în anumite cazuri pentru care cererile fără cache nu sunt întotdeauna cea mai bună alegere.
De exemplu, să presupunem că doriți să aflați numărul real de celule selectate de interogarea dvs. Într-o interogare fără caching, va trebui să examinați fiecare celulă individuală înainte de ao determina. Mesajele cache sunt o modalitate mai ușoară, folosind funcția sqlite_num_rows (), care va obține cu ușurință această informație din rezultatul selecției. Interogările fără caching sunt, de asemenea, limitate la recuperarea directă a datelor, ceea ce înseamnă că trebuie să selectați date dintr-o singură trecere a tuturor celulelor. În interogările memorate în cache, nu există nicio restricție, puteți utiliza sqlite_seek () pentru a vă deplasa la orice celulă și pentru a prelua date din ea sau chiar pentru a accesa celulele în ordine inversă, dacă este necesar.
Una dintre cele mai interesante caracteristici este că extensia SQLite oferă o tabelă pentru capacitatea de a-și crea propriile funcții utilizate în SQL. Acest lucru este posibil datorită faptului că SQLite conține într-o singură bibliotecă o interfață legată de PHP, precum și motorul bazei de date în sine. Folosind sqlite_create_function (), puteți crea funcții care pot fi ulterior aplicate la rezultatul selecției sau utilizate în interiorul oricărei clauze WHERE.
Posibilitatea de a utiliza PHP în SQL vă permite să simplificați acest script, făcându-l accesibil unui public mai mare de dezvoltatori. Acest lucru vă permite să utilizați PHP ca motor de șablon, care va introduce codul HTML în datele din baza de date. În multe cazuri, acest lucru poate simplifica codul atât de mult încât nu este nevoie să utilizați un motor de șablon suplimentar. În plus față de simplificarea codului, îmbunătățește de asemenea execuția programului și reduce costul scriptului pentru memorie, datorită faptului că nu există nicio acțiune cu datele care apar în spațiul utilizator.
Nu uitați că, dacă datele cu care lucrați pot conține cod binar, ar trebui să utilizați funcția sqlite_udf_decode_binary () pentru a le traduce din codificarea internă în care sunt stocate în SQLite înainte de a lucra cu ele. Dacă ați făcut-o, va trebui să codificați datele binare folosind sqlite_udf_encode_binary () pentru a vă asigura că datele nu vor fi deteriorate la următoarea accesare a acestora.
Acum, uitandu-te la modul in care SQLite functioneaza si ce are de oferit, s-ar putea sa-i acordati atentie pentru utilizarea in aplicatiile curente sau viitoare. Sper că această scurtă trecere în revistă ți-a oferit o privire asupra funcționalității SQLite și nu a risipit nimic despre ceea ce ai auzit despre asta.
Ca orice alt instrument, SQLite are punctele tari si slabiciunile sale. Fiind o soluție ideală pentru aplicații mici și / sau mai ușor de citit de date, aceasta nu este foarte potrivită pentru aplicațiile pe scară largă care adesea scriu în baza de date. Această limitare este o consecință a faptului că arhitectura SQLite se bazează pe un singur fișier care nu prevede distribuirea de date către fișiere create în mod repetat și utilizează, de asemenea, o blocare de scriere.