|
Бесплатные PHP скрипты - форум техподдержки |
Форум техподдержки WR-Скриптов на php. Обсуждаем: основы программирования на PHP 5 - 7 версий, различные подходы к написанию скриптов на php 7 без MySQL. А также WR-скрипты: бесплатные доски объявлений, скрипты форумов, Гостевые книги, Каталог ссылок, Галерея, Фотоальбом, Счётчики, Рассылки, Анекдот и другие. Принимаются пожелания для новых версий. Сообщите какой скрипт нужен для Вашего сайта, постараемся найти или реализовать. Скачать скрипты можно бесплатно. Вместе мы сделаем бесплатные php скрипты лучше и доступнее!
|
| Сегодня: 23.11.2024 - 15:23:12 Длинна файлов форумаОбъявление - WR-Scriptы в UTF-8 кодировке |
---|
Активно обновляю скрипты и перевожу их в UTF-8 кодировку. Список перекодированных php скриптов доступен на главной странице сайта. Скачивайте скрипты и устанавливайте на свой сайт! В ближайшее время обновлю каталог знакомств, форум Про, фотоальбом, доски объявлений лайт и ЛЮКС.
На форуме, пожалуйста, пишите что модернизировать в скриптах в первую очередь. Постараюсь исправить большую часть пожеланий! Планирую продолжить работы весь 2023 год.
|
Автор | Сообщение |
---|
proggi •
P Участник форума
|
Тут я выявил недостаток, при создании слишком больших файлов тем, форум работает медленно, так как происходит чтение файла в буфер, и последующая работа с ним.
Вот думаю пока как более грамотно это поправит... Пока тестирую предварительно файл базы будет ограничен гигабайтным размером, правда предусмотрено и более большее увеличение. в теории до 2^72 степени. Хотя вероятно уменьшу этот размер, тогда таблица позиционирования головки харда форума будет меньше. пока 9 байт на позиционирование отвел я. | |
|
Сообщение # 1 |
06.06.09 - 15:41:20
| | proggi •
P Участник форума
|
Так, ну вот что я наваял короче Код: function readlin($table, $begin, $end) //Специально для СВЕРХ огромных файлов ДО 1 ГИГАБАЙТА!!! { if (is_file("$table~")) { //Проверим сколько записей в базе $stat=stat("$table~"); $kolline=($stat[7])/9; if (($kolline<$end) or ($end<="0")) { $end=$kolline;} $rezult=""; //Результат в ноль. $rezult[0]=$kolline; $file_table = fopen("$table~", "r"); //Таблица секторов //переходим на начальный сектор в таблице $nachalo=($begin-1)*9; //Позиционирование головки харда на секторов fseek($file_table, $nachalo); //Берем элемент, идем в базу секторов, тянем сектор. for ($i = 0; $i <= $end-$begin; $i++) { $lin=$i+$begin; $sektor_bait[$lin] = fgets($file_table,10); //побайтовые сектора на харде } fclose($file_table); //Закрываем пути к таблице секторов //Выводим строки согласно масиву секторов $file = fopen("$table", "r"); //Целевой файл for ($i=$begin; $i<=$end; $i++) { //Позиционирование головки харда на секторов fseek($file, $sektor_bait[$i]); //Считываем секторор в нашу переменную $rezult[$i] = fgetss($file); //fgetss //fgets } } return $rezult; }
function reclin($table, $mass, $line) //Специально для СВЕРХ огромных файлов ДО 1 ГИГАБАЙТА!!! { //Считаем количесво записей в таблице секторов $stat=stat("$table~"); $kolline=$stat[7]/9; //Размер целевого файла $dlinna=stat("$table"); // strlen($dlinna); $dlinna=$dlinna[7]; $dlinna = sprintf("%09d", $dlinna);
//Вначате запись в таблицу секторов if (($kolline<$line) or ($line<="0")) { $line=$kolline; $fp = fopen("$table~", "a"); flock ($fp, LOCK_EX); fputs ($fp, "$dlinna"); flock ($fp, LOCK_UN); fclose ($fp); } else { $fp = fopen("$table~", "r+"); //Позиционирование головки харда на секторов $sektor=($line-1)*9; fseek($fp, $sektor); flock ($fp, LOCK_EX); fputs ($fp, "$dlinna"); flock ($fp, LOCK_UN); fclose ($fp); } //Пишев в целевой файл $fp = fopen("$table", "a"); flock ($fp, LOCK_EX); fputs ($fp, "$mass\n"); flock ($fp, LOCK_UN); fclose ($fp); } |
Короче используется две таблицы, одна таблица индексов, вторая таблица с самими данными. Таблица "секторов" (индексов), хранит в себе длинну файла куда надо позиционировать курсор и начинать читать нашу запись, концовкой чтения является новая строка в файле базы. Когда пишется новая строка, или изменяется ее значение. То новая/измененная строка ВСЕГДА прописывается в конец файла данных, а в индексном указывается место откуда производить чтение. | |
|
Сообщение # 2 |
06.06.09 - 16:39:51
| | proggi •
P Участник форума
|
Итак, после моих переделак вышли такие параметры таблиц/файл базы данных на форуме.
ОСОБЕННОСТИ: 1) Длинна файлы базы (таблицы) до 2,1 гиг 2) Длинна записываемого файла (строки в таблице) до 1,68 мегабайт. Быстрая запись, и редактирование строк.
Дефрагментация файловой системы планируется "на лету" или по кроновским задачам.
Таблица позиционирования головок диска хранит в себе данные о начале файле, и его длинне в 32 битном фармате (для сжатия). Редактирование записей и их добавление осуществляется одинаково по времени БЕЗ ПЕРЕЗАПИСИ ФАЙЛА С ДАННЫМИ!!!!!!!!!!!
Заметим что в оригинальном движке форума при изменении/редактировании админом чего либо файлы базы переписываются. Также отличительной особенностью является что при чтении из файла, происходит чтение ТОЛЬКО необходимого сектора, а не записывание файла в память php и работа с ним.
Потестирую еще, посмотрю как и что, но главное что такие методы работы ускорят работу с файлами, и снизят нагрузку на сервер = ускорят работу форума.
Пример (скрипт) скачать можно http://dow.exergo.ru/data.zip Ну и с индексовой странички побаловаться записямя в базу, и чтение строк из нее. | |
|
Сообщение # 3 |
06.06.09 - 20:11:25
| | proggi •
P Участник форума
|
Попробую доработать еще пару опций таблиц, сделать функцию дефрагментации, и думаю все будет нормально ;)
Выложу модуль с документацией, это будет видимо почти аналог нормальной БД, но на файлах, причем с достаточно быстрым доступом, в 10-100 раз быстре чем скажем на этом форуме. Правда для мелких файлов отличия малозаметны будут. Но зато можно будет строить более сложные структуры БЕЗ ПОТЕРИ СКОРОСТИ РАБОТЫ С БАЗОЙ!!!!!!!!!!!!!!
Одна из причин почему в этом форуме много файлов "базы данных" потомучто если положить все в один то это до утра ждать придется пока откроется страница)))) Для файлов может это и оптимально, хотя тут как сказать.
Выложу когда полное описание моих таблиц и как с ними работать, думаю многие оценят это. Кстати, некоторые параметры не дадут пользователю записать в файл скрипты, которые могут привести к "падению" сайта/форума, а следовательно можно не писать проверки и замены что сделано в оригинальном форуме. Следовательно мы получим несколько больше возможнотей + скорость работы намного выше. Но на мелких файлах вероятно проиграем, но когда на форуме будет большее 500 постов это будет куда быстрее работать чем оригинал, а следовательно и иные "тяжеловесы".
Хотя некоторые совсем легкие форумы вероятно обойдут нас((( но зато мы сможем добится полноценной работы используя ТОЛЬКО средства php.
Кстати, потестил работу скрипта работы с базой, при размере таблицы базы в 350 мегабайт, скорость работы приятно удивила Так что я думаю в итоге будет очень простой механизм работы с базой и функции понятные интуитивно и все это на php. | |
|
Сообщение # 4 |
07.06.09 - 01:07:00
|
| proggi •
P Участник форума
|
Вот тут Код: Почемуто ошибка по скорости выполнения, хз что там не так.... Но если сразу добавить тысячу постов, то тут она после 1000 остановится (ето если на сервере ограничение по времени выполнения функции).
Почему, хз. Но в течении секунды пока нельзя добавить более 1000 новых постов на форум.
Хотя локально, можно добавлять до 100 тысяч новых постов сразу, но уже упирается почемуто в Код: Тоже несовсем понятно в чем дело.
После 100000 записей, файл просто теряет доступ, и нехочет открываться.
Короче на практике, выходит что больше 1000 постов на форум в течении секунды отослать нельзя будет. Правда таких масштабов ни на каком форуме нет))))))))))))))))))) | |
|
Сообщение # 5 |
07.06.09 - 09:21:28
| | Регион33 •
Р гость
|
для таких маштабов нужно один форум на страну иметь. не более | |
|
Сообщение # 6 |
07.06.09 - 19:08:55
| | proggi •
P Участник форума
|
Цитата:
для таких маштабов нужно один форум на страну иметь. не более |
Ну а почему не сделать движок форума с запасом... Там еще косяков вских много.
Фрагментацию на лету "файловой системы" я придумал, но вышло что на дну запись в базу данных идет 16 байт.
Нк к примеру, вы пишете пост, а в базе данных лишние 16 байт появляются.... БЕЗ фрагментации на лету 10 байт Правда.... в оригинальном форуме тоже 16 байт лишние (совпало однако...) появляться, но там совершенно иная структура. Да и потом, посути в оригинальном в базе СТРОКИ, разделение строк это 2 байта (так заложено в форуме, ибо есть "символ" переноса строки") в моей же базе НЕТ переноса строк, конечно для визуального чтения это НЕ пригодно, зато преимуществ море. Тут мне надо служебную информацию уменьшить... И былоб все замечательно. В теории можно служебку уменьшить но почему-то пока не могу найти функции php для "этого". А самому писать функцию, хоть там все и просто, но боюсь что на пару десятитысячных долей секунд проиграю.
Короче я думаю.
Кстати, текушие параметры, если брать размер поста 1,6 мегабайта (это ТЕКСТ!!!! поста в 1,6 метра (1,6 миллиона символов нигде нет!) то увеличивая служебную информацию с 16 до 17 бит мы имеем размер (максимально возможный) не 2,1 (в теории можно 2,27) а 87,4 гигабайта. (хотя есть идея сделать плавающую величину...) | |
|
Сообщение # 7 |
08.06.09 - 19:42:27
| | proggi •
P Участник форума
|
|
Сообщение # 8 |
08.06.09 - 19:43:22
| | qwerty •
Q гость
|
Это что. У форума ваще БД не просто избыточна а СВЕРХИЗБЫТОЧНА, одни и те же данные дублируются в разных файлах. Имя юзера, название темы, первое сообщение. Вместо того чтобы как положено в нормальной БД делать все по ключевым полям. Когда я учился у нас преподы выгоняли вон переделывать весь курсовик за такие реализации БД. Ну и не забываем про функцию serialize для текста.
| |
|
Сообщение # 9 |
09.06.09 - 06:38:29
| | proggi •
P Участник форума
|
qwerty, Верно.
Ну сама база данного форума конечно верно. С другой стороны я то хосу чохранить php а не подключать иные базы данных.
Тут то и проблемка, как хранить записи, понятно что если записей под сотню то храни как хочеш, а если их под сто тыщ??? Тобиш пока я работаю над реализацией динамических полей, и их хранение а в частности ИЗМЕНЕНИЕ. В обычной базе есть поле "Фрагментировано" тобиш налету база не совсем хорошо делает фрагментацию когда что-то в ней меняеш, для этого у нее встроенная "кнопка" ест, нажав на которую происходит оптимизация базы. Иными словами, надо на php сделать аналог MySQL.
Кстати есть брать поля с фиксированной длинной (выставить при создании таблицы) то тут проблем с фрагментацией почти нет, пишется при изменении поверх и все, а вот если пишем в базу например текст поста... то когда он пишется, у меня, в конец своей таблицы, и в другом файле просто пишется 10 байт, первые 6 байт это место откуда надо считывать файл, и 4 за ним, это его длинна.
Когда нам надо считать ТЕКСТОВУЮ запись, например запись номер 17, то мы знаем что у нас в таблице позиционирования блоки по 10 байт, берем и считываем с 170 по 180 байт, в php делаем потом чтото типа ну вот код начинаная от точки позиционирования Код: $sektor = fgets($file_table,11); //побайтовые сектора на харде $sektor_bait[$lin]=substr($sektor, 0, 6); $sektor_dist[$lin]=substr($sektor, 6, 4); $sektor_bait[$lin]=base_convert($sektor_bait[$lin], 36, 10); $sektor_dist[$lin]=base_convert($sektor_dist[$lin], 36, 10); | Конечно может пока не совсем оптимально... но мы получаем ы итоге два параметра ОТКУДА И ДО КУДА считвать нашу запись из целевой таблицы Код: $file = fopen("$table", "r"); //Целевой файл for ($i=$begin; $i<=$end; $i++) { //Позиционирование головки харда на сектор fseek($file, $sektor_bait[$i]); //Считываем секторор в нашу переменную $rezult[$i] = fgets($file, $sektor_dist[$i]+1); } |
Ну вот чтото типа этого, тобиш считваем с место найденного в предыдушем коде нашу запись.
Работает это все достаточно быстро, хотя я с оптимизайией вобще не занимался пока
А так пока выходит неплохо. Но нужна фрагментировать файл таблицы, для этого кроме того как перед самой записью впихнуть некий ФЛАГ начала записи, и после него присобачить номер в таблице позиционирования пока ничего не придумал. Получается, что при фрагментации, мы почастям (сразу форагментировать не хочу) пробегаем файл с записями, как натыкаемся на запись, смотрим ее длину, ну и проверяем находится она СРАЗУ после предыдущей записи, короче есть ли "дырки" в файле или нет, если дырка есть, то запись сдвигается в сторону начала файла, а посути на величину дырки, и в файле позиционирования пишется новое значение позиционирования.
Конечно вероятно несколько мудрено, но пока ничего более лучшего ИМЕННО НА PHP я не придумал.
Ну а работа с базой, да как обчно (как и с первым вариантом базы, который частично уже внедрен в стабильную ветку нового МОЕГО форума), надо записать запись, делаем Код: Base::reclin("table", $message, $nomer); | table -имя таблицы $message - что записываем в нее $nomer - в какое поле (если значение 0 или отрицательное, или больше чем всего записей в таблице пишется запись в конец таблицы)
Чтение строки, соответственно Код: $lin=Base::readlin("table", $nschalo, $konec); | $nschalo - откуда считывать (номер записи) $konec -до куда (номер записи) Также можно запрос подать в виде массива, если на форуме посты хранятся в ОДНОЙ таблице, а нам надо к примеру 4 5 84 90 153 это все в масив и передаем запросом.
Короче я еще размышляю) как доделаю покажу код, как его встроить в практически ЛЮБОЙ сайт, и как просто его использовать. | |
|
Сообщение # 10 |
09.06.09 - 10:40:58
| | qwerty •
Q гость
|
Про сохренить php чет не понял. serialize это стандартная функция php. Собствено вы как раз делаете ключевые слова. Однакао имхо.. Проще не парить мозги и сразу переписать форум на mysql, плюс дополнительный скрипт для конвертирования текстовой БД в sql-формат штоб уадмина не возникало проблем при переходе на мускульную версию. А там уж сразу есть и оптимизация и все остальное. И главное индексацию по тексту сделать. Видели как в phpbb это делается? Впрочем сие классический метод.
Набросал тут как примерно может выглядеть эта база.
Типа того
create table wr_users( user_id int(10) auto_increment, username varchar(64), password varchar(64), status int default '0', email varchar(64), regtime timestamp, birthday varchar(32), icg varchar(16), gender int, homesite varchar(255), town varchar(255), work varchar(255), sign text, avatar varchar(255), forum_status varchar(255) defalut 'Участник форума', reputation int default '0', primary key (user_id) );
create table wr_mainforum( forum_id int auto_increment, forum_razdel varchar(6) default '', forumname varchar(255), forumdesc text, lasttopic_id int(10), lastmsg_id int(10), primary key(forum_id), key lasttopic_id (lasttopic_id), key lastmsg_id (lastmsg_id) );
create table wr_topics ( topic_id int(10) auto_increment, forum_id int, user_id int(10) default '0', guestname varchar(64) default '', topicname varchar(255), pubtime timestamp, lastmsgtime varchar(32), primary key(topic_id) key forum_id (forum_id), key user_id (user_id) );
create table wr_messages( message_id int(10) auto_increment, topic_id int(10), user_id int(10) default '0', guestname varchar(64) default '', pubtime timestamp, message text, primary key (message_id), key topic_id (topic_id), key user_id (user_id) );
По имени переменных думаю разберетесь. | |
|
Сообщение # 11 |
11.06.09 - 05:14:16
| | proggi •
P Участник форума
|
Цитата:
Набросал тут как примерно может выглядеть эта база. |
Да спасибо. Да варианты есть, например можно SQLite она полностью на php, работает как класс.
Посути я ее повторяю). Но у меня фрагментация кусочков на лету, что нету в базах.
Насчет форума, ну я доработал оригинал, порой некоторые нововведения ввожу, а так новый
Который в разработке, там нет совместимости с оригиналом, а функцию конвертирования... Вероятно будет, но вероятно также конвертировать и от других форумов.
Да и не о том речь, суть простой базы, с фрагментацией на лету! Посмотрим что выйдет, но пока неплохо получается. Работаю над фрагментацией, также отказался от секторов, и таблиц, потипу как тотже FAT сделан. Куски идут у меня подряд, это минимизирует избыточность, ну и так как очень быстрая перезапись/запись, то обратная сторона этого вопроса - нужна фрагментация, так как при перезаписи остаются некие "дырки" в базе. Пока над этим работаю. Но есть и иные идейки по базе, главное что хочу сделать более быстрый вывод информации, который конечно может не сравниться с нормальной базой, но будет куда быстрее чем в оригинальном форуме, ну и самих файлов в десятки раз меньше надо.
Насчет типов, тут я думаю... В одной стороны, конечно надо разные типы данных, но это время на перекнвертирование, хоть и доли секунд но всеже. Так например числа можно переводить в 32-ричное исчисление. С другой стороны, некоторые типы порой не нужны. Или их в ведение не так сильно отразится на величине служебной информации.
Ну например чтобы записать скажем 1,6 мегабайта данных надо служебной информации 17 байт (в mysql, кстати, 18-19, и размер записи меньше чем 1600000 символов, а порядка 48000 если делать как у mysql то служебной будет еще меньше.) Если примерно делать запись (ну или картинки хранить неважно) до 60466176 байт (60 мегабайт примерно) то служебной информации надо 18 байт, и в них уже включены данные для быстрого поиска, для востановления индексной таблицы (кстати, за возможность востановлени индексов при их крахе, прямо из файла записей, пришлось заплатить... нет не размером, а скоростью фрагментации), флаги начала записей. И еще по мелочи.
Короче сделать неполучается хотя ВОЗМОЖНО!
Но я хочу сделать базу и все запросы к ней с нуля, особо я не ориентируюсь на других, но помимо с типами данных, будет еще ТРИ типа таблиц, конечно они автоматом создаются (уже написал функции создания, кстати, сделал пока предел на создание до 99999 таблиц, тобш примерно 10 тыш таблиц поддерживает моя база), но тут база в основном для более узкого использования, при всей кажущейся сложности запросы в нее достаточно компактные, при этом получаем то что нам необходимо. Ну и фрагментация базы на лету, это тоже не малое преимущество, особенно там где НЕ фиксированые поля (ну типа TEXT) часто меняются. | |
|
Сообщение # 12 |
11.06.09 - 10:36:54
| |
|