завдання
Потрібно знайти простий спосіб зберігання інформації в проміжках між виконанням запитів.
Рішення
Використовуйте текстовий файл з необов'язковою блокуванням для запобігання конфліктам. Можна зберігати дані в будь-якому зручному форматі (CSV, з роздільником - вертикальною лінією і т. Д.) Один із зручних способів зберігання даних складається в їх розміщенні в одній змінної (великому асоціативному масиві), з подальшим збереженням шляхом застосування до цієї змінної функції serialize ():
$ Data_file = '/ tmp / data';
// відкриваємо файл для читання і запису
$ Fh = fopen ($ data_file, 'a +') or die ($ php_errormsg);
rewind ($ fh) or die ($ php_errormsg);
// встановлюємо монопольну блокування файлу
flock ($ fh, LOCK_EX) or die ($ php_errormsg);
// читаємо і виконуємо зворотне перетворення даних
// з послідовної форми
$ Serialized_data = fread ($ fh, filesize ($ data_file)) or die ($ php_errormsg);
$ Data = unserialize ($ serialized_data);
/ *
* Виконуємо необхідні дії з даними
* /
// повторно переводимо дані в послідовну форму
$ Serialized_data = serialize ($ data);
// очищаємо файл
rewind ($ fh) or die ($ php_errormsg);
ftruncate ($ fp, 0) or die ($ php_errormsg);
// записуємо дані назад в файл і знімаємо блокування
if (-1 == (fwrite ($ fh, $ serialized_data)))
fflush ($ fh) or die ($ php_errormsg);
flock ($ fh, LOCK_UN) or die ($ php_errormsg);
fclose ($ fh) or die ($ php_errormsg);
Обговорення
Зберігання даних в текстовому файлі не вимагає інсталяції додаткового програмного забезпечення баз даних, але це практично єдина перевага цього способу.
Його головні недоліки - неповороткість і неефективність. Спочатку необхідно заблокувати файл, а потім отримувати з нього всі дані поспіль, навіть якщо
потрібно лише мала їх частина. Поки блокування не буде знято, всі інші процеси, а, отже, і всі інші користувачі будуть змушені чекати, тиняючись без діла. Одне з цінних властивостей бази даних полягає в тому, що вона надає структурований доступ до інформації, що дає можливість блокувати (і завантажувати
в пам'ять) тільки ті дані, які дійсно потрібні. Рішення на основі текстових файлів цього не дозволяє.
Гірше те, що блокування, яку можна застосовувати до текстових файлів, далеко не так стійка, як блокування в базі даних. Функція flock () здійснює блокування файлів, яка називається необов'язковою, тому єдине, що може перешкодити численним процесам передавити один одного і зіпсувати ваші дані, це хороші манери і акуратне програмування. Але немає захисту від злочинних або добропорядних, але погано написаних програм.