Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Базы данных плоских файлов
Каковы наилучшие методы создания структур базы данных плоских файлов в PHP?
Многие из более зрелых PHP плоских файловых фреймворков, которые я вижу, пытаются реализовать SQL-подобный синтаксис запроса, который в большинстве случаев является избыточным для моих целей (я бы просто использовал базу данных в этой точке).
Есть ли какие-то элегантные трюки, чтобы получить хорошую производительность и функции с небольшими накладными расходами кода?
Ну и какова же природа плоских баз данных. Они большие или маленькие. Это простые массивы с массивами в них? если его что-то простое сказать userprofiles построен как таковой:
$user = array("name" => "dubayou",
"age" => 20,
"websites" => array("dubayou.com","willwharton.com","codecream.com"),
"and_one" => "more");
и сохранить или обновить запись БД для этого пользователя.
$dir = "../userdata/"; //make sure to put it bellow what the server can reach.
file_put_contents($dir.$user['name'],serialize($user));
и загрузить запись для пользователя
function &get_user($name){
return unserialize(file_get_contents("../userdata/".$name));
}
но опять же эта реализация будет варьироваться в зависимости от приложения и характера необходимой Вам базы данных.
Вы могли бы рассмотреть SQLite . Это почти так же просто, как плоские файлы, но вы получаете движок SQL для запросов. Он также хорошо работает с PHP .
По моему мнению, использование "Flat File Database" в том смысле, который вы имеете в виду (и ответ, который вы приняли), не обязательно является лучшим способом решения проблем. Во-первых, использование serialize() и unserialize() может вызвать головную боль MAJOR, если кто-то войдет и отредактирует файл (на самом деле они могут поместить arbritral-код в ваш "database", который будет выполняться каждый раз.)
Лично я бы сказал - почему бы не заглянуть в будущее? Там было так много раз, что у меня были проблемы, потому что я создавал свои собственные файлы "proprietary", и проект взорвался до такой степени, что ему нужна база данных, и я думаю: "знаете, я хотел бы написать это для базы данных для начала" - потому что рефакторинг кода занимает слишком много времени и усилий.
Из этого я узнал, что будущая проверка моего приложения, чтобы, когда оно станет больше, мне не нужно было тратить дни на рефакторинг, - это путь вперед. Как мне это сделать?
SQLite. Он работает как база данных, использует SQL и довольно легко переключается на mySQL (особенно если вы используете абстрактные классы для работы с базой данных, как я!)
На самом деле, особенно с помощью метода"accepted answer", он может резко сократить использование памяти вашего приложения (вам не нужно загружать все "RECORDS" в PHP)
Один из фреймворков, который я рассматриваю, был бы для блог-платформы. Поскольку практически любой возможный вид данных, который вы хотели бы получить, будет отсортирован по дате, я думал об этой структуре:
Один каталог на узел содержимого:
./content/YYYYMMDDHHMMSS/
Подкаталоги каждого узла, включая
/tags
/authors
/comments
А также простые текстовые файлы в Узловой директории для предварительного и последующего рендеринга контента и тому подобное.
Это позволит простому вызову PHP glob() (и, вероятно, обратному массиву результатов) запрашивать практически все, что находится в структуре содержимого:
glob("content/*/tags/funny");
Вернул бы пути, включая все статьи с тегом "funny".
Вот код, который мы используем для Лилины:
<?php
/**
* Handler for persistent data files
*
* @author Ryan McCue <cubegames@gmail.com>
* @package Lilina
* @version 1.0
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/
/**
* Handler for persistent data files
*
* @package Lilina
*/
class DataHandler {
/**
* Directory to store data.
*
* @since 1.0
*
* @var string
*/
protected $directory;
/**
* Constructor, duh.
*
* @since 1.0
* @uses $directory Holds the data directory, which the constructor sets.
*
* @param string $directory
*/
public function __construct($directory = null) {
if ($directory === null)
$directory = get_data_dir();
if (substr($directory, -1) != '/')
$directory .= '/';
$this->directory = (string) $directory;
}
/**
* Prepares filename and content for saving
*
* @since 1.0
* @uses $directory
* @uses put()
*
* @param string $filename Filename to save to
* @param string $content Content to save to cache
*/
public function save($filename, $content) {
$file = $this->directory . $filename;
if(!$this->put($file, $content)) {
trigger_error(get_class($this) . " error: Couldn't write to $file", E_USER_WARNING);
return false;
}
return true;
}
/**
* Saves data to file
*
* @since 1.0
* @uses $directory
*
* @param string $file Filename to save to
* @param string $data Data to save into $file
*/
protected function put($file, $data, $mode = false) {
if(file_exists($file) && file_get_contents($file) === $data) {
touch($file);
return true;
}
if(!$fp = @fopen($file, 'wb')) {
return false;
}
fwrite($fp, $data);
fclose($fp);
$this->chmod($file, $mode);
return true;
}
/**
* Change the file permissions
*
* @since 1.0
*
* @param string $file Absolute path to file
* @param integer $mode Octal mode
*/
protected function chmod($file, $mode = false){
if(!$mode)
$mode = 0644;
return @chmod($file, $mode);
}
/**
* Returns the content of the cached file if it is still valid
*
* @since 1.0
* @uses $directory
* @uses check() Check if cache file is still valid
*
* @param string $id Unique ID for content type, used to distinguish between different caches
* @return null|string Content of the cached file if valid, otherwise null
*/
public function load($filename) {
return $this->get($this->directory . $filename);
}
/**
* Returns the content of the file
*
* @since 1.0
* @uses $directory
* @uses check() Check if file is valid
*
* @param string $id Filename to load data from
* @return bool|string Content of the file if valid, otherwise null
*/
protected function get($filename) {
if(!$this->check($filename))
return null;
return file_get_contents($filename);
}
/**
* Check a file for validity
*
* Basically just a fancy alias for file_exists(), made primarily to be
* overriden.
*
* @since 1.0
* @uses $directory
*
* @param string $id Unique ID for content type, used to distinguish between different caches
* @return bool False if the cache doesn't exist or is invalid, otherwise true
*/
protected function check($filename){
return file_exists($filename);
}
/**
* Delete a file
*
* @param string $filename Unique ID
*/
public function delete($filename) {
return unlink($this->directory . $filename);
}
}
?>
Он хранит каждую запись в виде отдельного файла, который, как мы обнаружили, достаточно эффективен для использования (не загружаются ненужные данные, и его быстрее сохранить).
Если вы собираетесь использовать плоский файл для сохранения данных, используйте XML для структурирования данных. PHP имеет встроенный парсер XML .
Я написал две простые функции, предназначенные для хранения данных в файле. Вы можете сами судить, полезно ли это в данном случае. Смысл в том, чтобы сохранить переменную php (если это либо массив, строка или объект) в файл.
<?php
function varname(&$var) {
$oldvalue=$var;
$var='AAAAB3NzaC1yc2EAAAABIwAAAQEAqytmUAQKMOj24lAjqKJC2Gyqhbhb+DmB9eDDb8+QcFI+QOySUpYDn884rgKB6EAtoFyOZVMA6HlNj0VxMKAGE+sLTJ40rLTcieGRCeHJ/TI37e66OrjxgB+7tngKdvoG5EF9hnoGc4eTMpVUDdpAK3ykqR1FIclgk0whV7cEn/6K4697zgwwb5R2yva/zuTX+xKRqcZvyaF3Ur0Q8T+gvrAX8ktmpE18MjnA5JuGuZFZGFzQbvzCVdN52nu8i003GEFmzp0Ny57pWClKkAy3Q5P5AR2BCUwk8V0iEX3iu7J+b9pv4LRZBQkDujaAtSiAaeG2cjfzL9xIgWPf+J05IQ==';
foreach($GLOBALS as $var_name => $value) {
if ($value === 'AAAAB3NzaC1yc2EAAAABIwAAAQEAqytmUAQKMOj24lAjqKJC2Gyqhbhb+DmB9eDDb8+QcFI+QOySUpYDn884rgKB6EAtoFyOZVMA6HlNj0VxMKAGE+sLTJ40rLTcieGRCeHJ/TI37e66OrjxgB+7tngKdvoG5EF9hnoGc4eTMpVUDdpAK3ykqR1FIclgk0whV7cEn/6K4697zgwwb5R2yva/zuTX+xKRqcZvyaF3Ur0Q8T+gvrAX8ktmpE18MjnA5JuGuZFZGFzQbvzCVdN52nu8i003GEFmzp0Ny57pWClKkAy3Q5P5AR2BCUwk8V0iEX3iu7J+b9pv4LRZBQkDujaAtSiAaeG2cjfzL9xIgWPf+J05IQ==')
{
$var=$oldvalue;
return $var_name;
}
}
$var=$oldvalue;
return false;
}
function putphp(&$var, $file=false)
{
$varname=varname($var);
if(!$file)
{
$file=$varname.'.php';
}
$pathinfo=pathinfo($file);
if(file_exists($file))
{
if(is_dir($file))
{
$file=$pathinfo['dirname'].'/'.$pathinfo['basename'].'/'.$varname.'.php';
}
}
file_put_contents($file,'<?php'."\n\$".$varname.'='.var_export($var, true).";\n");
return true;
}
Если вы хотите получить результат, читаемый человеком, вы также можете использовать этот тип файла :
ofaurax|27|male|something|
another|24|unknown||
...
Таким образом, у вас есть только один файл, вы можете легко отладить его (и вручную исправить), вы можете добавить поля позже (в конце каждой строки), и код PHP прост (для каждой строки, разделенной в соответствии с |).
Однако недостатком является то, что вы должны разобрать весь файл для поиска чего-то (если у вас есть миллионы записей, это не нормально), и вы должны обрабатывать разделитель в данных (например, если Ник WaR|ordz).
ИМХО, у вас есть два варианта, если вы хотите избежать доморощения чего-то:
SQLite
Если вы знакомы с PDO, вы можете установить драйвер PDO, который поддерживает SQLite. Никогда не использовал его, но я использовал PDO тонну с MySQL. Я собираюсь дать этому шанс на текущий проект.
XML
Это делается много раз для относительно небольших объемов данных. XMLReader -это легкий класс, предназначенный для чтения вперед и работы с курсором. SimpleXML упрощает чтение документа XML в объект, к которому можно получить доступ так же, как и к любому другому экземпляру класса.
Этот вариант вдохновляет как практическое решение:
https://github.com/mhgolkar/FlatFire
Он использует несколько стратегий для обработки данных...
[Скопировано из файла Readme]
Свободный или Структурированный или смешанный
- STRUCTURED
Regular (table, row, column) format.
[DATABASE]
/ \
TX TableY
\_____________________________
|ROW_0 Colum_0 Colum_1 Colum_2|
|ROW_1 Colum_0 Colum_1 Colum_2|
|_____________________________|
- FREE
More creative data storing. You can store data in any structure you want for each (free) element, its similar to storing an array with a unique "Id".
[DATABASE]
/ \
EX ElementY (ID)
\________________
|Field_0 Value_0 |
|Field_1 Value_1 |
|Field_2 Value_2 |
|________________|
recall [ID]: get_free("ElementY") --> array([Field_0]=>Value_0,[Field_1]=>Value_1...
- MIXD (Mixed)
Mixed databases can store both free elements and tables.If you add a table to a free db or a free element to a structured db, flat fire will automatically convert FREE or SRCT to MIXD database.
[DATABASE]
/ \
EX TY
Просто указывая на потенциальную проблему с базой данных плоских файлов с этим типом системы:
data|some text|more data
row 2 data|bla hbalh|more data
...и т.д.
Проблема в том, что данные ячейки содержат "|" или "\n", тогда данные будут потеряны. Иногда было бы проще разделить их на комбинации букв, которые большинство людей не использовали бы.
Например:
Разделитель столбцов: #$% (Shift+345)
Разделитель строк: ^&* (Shift+678)
Текстовый файл: test data#$%blah blah#$%^&*new row#$%new row data 2
Затем используйте: explode("#$%", $data); use foreach, the explode again to separate columns
Или что-нибудь в этом роде. Кроме того, я мог бы добавить, что базы данных плоских файлов хороши для систем с небольшими объемами данных (т. е. менее 20 строк), но становятся огромными кабанами памяти для больших баз данных.