Останнім часом, ви, можливо, чули про нове розширення для PHP: SQLite. Є багато причин, за якими SQLite може здатися кращим досягненням з тих пір, як навчилися різати хліб. SQLite пропонує добротний SQL інтерфейс до нереляційних базі даних і створює елегантну альтернативу громіздким інтерфейсів інших баз даних без втрати функціональності або швидкості, як можна було б очікувати. Ми розглянемо в статті це дивовижне розширення і, будемо сподіватися, нам вдасться підтвердити ті переваги, про які, можливо, ви чули.
Що таке SQLite?
SQLite - це вбудована бібліотека в якій реалізовано багато з стандарту SQL 92. Її домаганням на популярність є як власне сам движок бази, так і її інтерфейс (точніше його движок) в межах однієї бібліотеки, а також можливість зберігати всі дані в одному файлі. Я відношу позицію функціональності SQLite десь між MySQL і PostgreSQL. Однак, на практиці, SQLite нерідко виявляється в 2-3 рази (і навіть більше) швидше. Таке можливо завдяки високоупорядоченной внутрішньої архітектурі і усунення необхідності в з'єднаннях типу «сервер-клієнт» і «клієнт-сервер».
Все це, зібране в один пакет, лише небагато чим більше за розміром клієнтської частини бібліотеки MySQL, є вражаючим досягненням для повноцінної бази даних. Використовуючи високо ефективну інфраструктуру, SQLite може працювати в крихітному обсязі виділеної для неї пам'яті, набагато меншому, ніж в будь-яких інших системах БД. Це робить SQLite дуже зручним інструментом з можливістю використання практично в будь-яких завданнях покладених на базу даних.
Що мені користі від SQLite?
Крім швидкості і ефективності у SQLite є ряд інших переваг, які роблять її ідеальним рішенням для багатьох завдань. Так як база даних SQLite по суті своїй - звичайні файли, немає ніякої необхідності в додаткових коштах адміністрування вимагають багато часу на створення складної структури прав доступу для захисту користувальницьких баз даних. Все це вже автоматично підтримується організацією прав доступу в самій файлової системи, це також має на увазі (в області обмеження простору), що не потрібно ніяких спеціальних правил для відстеження заповнення дискового простору користувачем. Перевага для користувачів в тому, що є можливість створити таку кількість баз даних, яке вони собі побажають плюс абсолютний контроль над усіма цими базами даних.
Факт, що база даних - це єдиний файл, робить її легко переноситься. SQLite до того ж, усуває необхідність у запуску додаткових службових процесів (daemons), які могли б «від'їдатися» значна кількість пам'яті і інших ресурсів, навіть в разі помірного використання бази даних.
Як новітнього розширення БД, SQLite пощастило бути вільним від коду для забезпечення сумісності, на противагу старішим розширень, таким як MySQL. які зобов'язані підтримувати застарілу функціональність з причин забезпечення сумісності. Це також дозволяє новому розширенню використовувати найновітніші розробки в PHP для досягнення найвищого рівня виконання і функціональності. Розробники полегшили завдання користувачам, створивши розширення легким для переходу до нього від інших систем БД, залишивши інтерфейс схожим на ті, що вже були реалізовані в PHP.
SQLite також підтримує гнучкий механізм для передачі ресурсів бази даних в процедурні інтерфейси, роблячи це однаково легким для переходу з MySQL, де ресурс передається останнім, і PostgreSQL, де він передається першим.
SQLite також відрізняє потужний об'єктно-орієнтований інтерфейс, який може бути використаний для ефективного вилучення даних з бази, позбавляючи вас від необхідності виконання вашої власної оболонки для процедурного інтерфейсу. Як показано в прикладі нижче, об'єктно-орієнтований інтерфейс також дозволяє вам уникнути передачі всіх ресурсів купою.
У PHP 5.0 установка SQLite має свою особливість, так як і розширення і бібліотека пов'язані разом, тому все, що вам необхідно зробити - це додати -with-sqlite в рядку конфігурації. Я б ще порекомендував встановити SQLite, але тільки в разі якщо мова про відкомпілювався бінарному файлі, що дозволить вам відкривати базу і управляти нею без використання PHP. Це дуже корисно для налагодження і виконання різних одночасних команд, а також корисно для тестування коду запитів. В майбутньому, досить часто ви зможете виявити, що пов'язана бібліотека SQLite трохи "застаріла", тому зв'язка вашого PHP з зовнішньої бібліотекою дозволить вам отримати вигоду з останніх виправлень і нововведень SQLite. Це також дозволить вам в майбутньому оновлювати вашу SQLite без перекомпіляції PHP.
Щоб зібрати розширення SQLite як зовнішньої бібліотеки, просто використовуйте -with-sqlite = / path / to / lib /.
Мені також слід згадати, що розширення SQLite проходить вичерпну серію тестів, як для об'єктно-орієнтованого, так і для процедурного інтерфейсів. Тестуються кожна окрема функція, і кожен метод підтримуваний SQLite. Це чудове джерело прикладів не тільки того, як працює кожен метод і кожна функція SQLite, але й очікуваного виведення, що дозволяє вам бачити кінцевий результат кожної операції.
Процедурний інтерфейс до SQLite майже такий же, як у MySQL та інших розширень БД. Здебільшого перехід до SQLite зажадає тільки змінити mysql / pq / etc ... префікс функції на sqlite.
Власне значні відмінності між SQLite і іншими базами даних знаходяться в самому двигуні. На відміну від інших БД в SQLite немає прив'язки до типів; всі дані зберігаються як рядки закінчуються символом NULL, що краще, ніж двійкове подання даних в стовпчиках спеціального типу. Унаслідок сумісності SQLite поки підтримує тип специфікації в конструкціях CREATE TABLE, наприклад, такий як INT, CHAR, FLOAT, TEXT і тому подібні, але реально їх не використовує. Всередині бази, SQLite тільки робить відмінність між строковими і цілочисельними даними під час сортування. Тому, якщо ви не збираєтеся сортувати дані, ви можете обійтися без вказівки спеціального типу полів при створенні таблиць в SQLite.
"Безтіповая природа" SQLite робить сортування і зіставлення даних в деякому роді повільніше, так як кожен раз SQLite буде змушена визначати тип даних і застосовувати або строковий механізм сортування / порівняння або числовий. SQL таблиці часто вимагають автоматично присвоюється ключ для швидкого доступу до осередків, маючи на увазі повернення посилання на останню додану осередок. Для SQLite цей синтаксис, м'яко кажучи, не потрібен. Щоб створити таку таблицю, вам знадобиться оголосити поле як INTEGER PRIMARY KEY, що більш зручно ніж вказівку спеціалізованого типу або привласнення додаткових властивостей, які вказують на те, що поле є Автоінкрементний.
Як ви можете очікувати, SQLite несе в собі багато нових особливостей поліпшують виконання і розширюють функціональність. Одна з таких особливостей - можливість виконувати пов'язані запити, які мають на увазі виконання множинних запитів через функцію виконання одного запиту. Це знижує кількість задіяних функцій PHP і таким чином збільшує швидкість роботи скрипта. А також дозволяє вам легко групувати блоки запитів всередині транзакцій, покращуючи виконання в подальшому. Така можливість може бути значним фактором під час виконання множинних звернень на запис в базу. Однак існує кілька пікантних особливостей, про які не слід забувати.
Якщо який-небудь запит в SQLite використовує щось введене користувачем безпосередньо, вам слід вжити додаткових заходів обережності для перевірки такого введення, щоб припинити небажаний запит. На противагу MySQL, де таке може спричинити за собою лише непорозуміння при запиті до БД і видати помилку, в SQLite це дозволить атакуючому виконати який-небудь запит на вашому сервері з можливими плачевними наслідками. Якщо ви додаєте записи через блок запитів і хотіли б повертати ідентифікатор, то sqlite_last_insert_rowid () добре впорається з таким завданням, але поверне ідентифікатор тільки останнього запису. З іншого боку, при спробі визначити скільки осередків було змінено, використовуючи sqlite_changes (), ми отримаємо результат, який містить загальне число осередків змінених усіма виконаними запитами. Якщо ваш блок запитів містить SELECT, переконайтеся що це найперший запит, в іншому випадку ваша остаточна вибірка не буде містити осередків, повертаються цим запитом.
Крім своїх нових внутрішніх особливостей, SQLite пропонує ряд нових функцій, які спрощують і прискорюють вилучення даних з бази.
Це дозволяє і виконувати запит і отримувати дані одним викликом функції, зводячи нанівець всю зайву роботу PHP. Сам по собі PHP скрипт спрощується, за рахунок використання всього однієї функції там, де інакше б Вам довелося використовувати кілька функцій для отримання даних працюють в циклі. У тих випадках, коли повертається результат тільки одного стовпчика, можна використовувати sqlite_single_query (), яка миттєво повертає рядок або масив рядків в залежності від числа осередків, з яких витягується інформація.
Як і у випадку з іншими особливостями, ви можете цим користуватися, але вам не слід цим зловживати. У разі вибірки всіх даних, запитом до один прохід, ви повинні пам'ятати, що всі результати будуть зберігатися в пам'яті. Якщо результат вибірки містить велику кількість даних, ціна витрат на пам'ять безумовно зведе нанівець всі переваги отримані шляхом зниження числа викликів функцій. Отже, вам потрібно приберегти використання цих функцій для випадків вибірки невеликої кількості даних.
Ітератори в SQLite
У PHP 5.0 є інший спосіб вибірки даних запитом з використанням ітераторів.
Отримання результатів в циклі працює точно так само, як і прохід по масиву в циклі через foreach (), за винятком того, що в цей час у вас немає доступу до ключів і значення є масивом, що містить дані в особливих осередках. Так як ітератори це не функції, а внутрішні покажчики в самому двигуні, вони вимагають набагато менше ресурсів у порівнянні з функціями sqlite_fetch _ * (), і не вимагають, щоб результати кешуватися в пам'яті. Кінцевий результат буде надзвичайно швидким, це більш простий і доступний метод отримання даних. Немає ніяких побічних ефектів у використанні ітераторів об'єктів в SQLite, і коли б вам не знадобилося отримати результат у вигляді безлічі рядків, вам потрібно обов'язково пам'ятати про таку можливість.
SQLite також відрізняє ряд допоміжних функцій, які можуть стати в нагоді під час роботи з базою даних. Одна з таких функцій, sqlite_num_fields (), може бути використана для визначення кількості стовпців в спеціальних результатах вибірки. Як варіант, якщо ви збираєтеся витягувати дані, просто використовуйте count () з першим результатом, яка поверне вам те ж саме число. Якщо вилучені як строковий, так і числовий ключі, вам знадобиться відокремити результат, оскільки в результуючому масиві буде стільки входжень скільки існує полів в таблиці. Це число може бути важливо, якщо вашому скрипту необхідно отримати назви полів всередині якоїсь таблиці. В такому випадку ви могли б використовувати sqlite_field_name () в циклі, для доступу до цієї інформації, як показано в прикладі нижче.
Звичайно, це не ідеальний спосіб для отримання імен стовпців з таблиці, просто по тому, що він виявиться невдалим у разі, коли таблиця не містить жодної клітинки, а також по тому, що це зажадає від вас вилучення даних, які ви не збираєтеся використовувати . Набагато кращим рішенням буде використання функції sqlite_fetch_column_types (), яка отримує стовпці разом з їх типами з таблиці не залежно від того, чи є там дані чи ні.
У більшості випадків, з причин виконання або використання пам'яті, ви не захочете використовувати запити без кешування. Це може привести до невеликої втрати функціональності, що може бути необхідно в певних випадках, для яких запити без кешування не завжди найкращий вибір.
Наприклад, припустимо, ви хотіли б з'ясувати реальну кількість осередків, вбрання Вашим запитом. У запиті без кешування, вам доведеться робити вибірку кожної окремої комірки, перш ніж ви зможете її визначити. Кешовані ж запити - більш простий спосіб, що полягає у використанні функції sqlite_num_rows (), яка легко отримає цю інформацію з результату вибірки. Запити без кешування також обмежені в прямій вибірці даних, маючи на увазі, що ви зобов'язані вибрати дані з усіх осередків за один прохід. В кеш запитах такого обмеження немає, ви можете використовувати sqlite_seek () для зсуву на будь-яку клітинку та вибірки з неї даних, або навіть для доступу до осередків в зворотному порядку, якщо це необхідно.
Одна з найбільш цікавих можливостей в тому, що розширення SQLite надає таблицю для можливості створення своїх власних функцій використовуваних в межах SQL. Це можливо завдяки тому, що SQLite містить в одній бібліотеці пов'язаної з PHP, як інтерфейс, так і сам движок бази. Використовуючи sqlite_create_function () ви можете створювати функції, які в подальшому можуть бути застосовані до результату вибірки або використані всередині якогось умови WHERE.
Можливість використання PHP в SQL дозволяє вам спростити даний скрипт, роблячи його доступним більшій аудиторії розробників. Це дозволяє використовувати PHP в якості движка шаблонів, який буде вставляти HTML код в дані з бази. У багатьох випадках це може спростити код так сильно, що не виникне необхідності у використанні додаткового движка шаблонів. Крім спрощення коду, це також покращує виконання програми і знижує витрати скрипта на пам'ять внаслідок того, що немає ніяких дій з даними, що відбуваються в просторі користувача.
Не забувайте, що в тому випадку, якщо дані, з якими ви працюєте, можуть містити двійковий код, вам слід використовувати функцію sqlite_udf_decode_binary () для перекладу їх з внутрішньої кодування, в якій вони зберігаються в SQLite, перш ніж працювати з ними. Якщо ви так вчинили, вам знадобиться закодувати двійкові дані, використовуючи sqlite_udf_encode_binary () для того, щоб бути впевненим, що дані не будуть пошкоджені при наступному до них доступ.
Тепер, подивившись як працює SQLite, і що вона може запропонувати, ви, можливо, зверніть на неї увагу для використання в своїх поточних або майбутніх додатках. Сподіваюся, цей короткий огляд дав вам деяке уявлення про функціональність SQLite, і не розвіяв нічого з того, що ви чули про неї хорошого.
Як і будь-який інструмент, SQLite має свої сильні і слабкі сторони. Будучи ідеальним рішенням, для додатків невеликих і / або призначених головним чином для зчитування даних, вона не дуже добре підходить для великомасштабних додатків, часто виконують запис в базу. Це обмеження - наслідок того, що архітектура SQLite заснована на одному єдиному файлі, яка не передбачає розподілу даних на багаторазово створювані файли, а також використовує блокування на запис.