Быстрая база на файлах для узких целей

workOnFood

Новичок
без глупых вопросов и "гениальных" идей
8 лет назад понятия говнокода в php не было в силу объективных причин :)
но как только я прочитал стандарты кодирования - я стал им следовать
Ну не знаю в моем понимании гвнокод - это не оптимизированный код -
PHP:
$str = '<span> LaLaLa </span>';
$new_mega_str= substr($str,7,1);
$new_mega_str.= substr($str,8,1);
$new_mega_str.= substr($str,9,1);
$new_mega_str.= substr($str,10,1);
$new_mega_str.= substr($str,11,1);
$new_mega_str.= substr($str,12,1);
echo $new_mega_str;
А как писать, с табуляциями или без, ставить пробел до или после запятой, на мой взгляд дело каждого(в разумных пределах), конечно если не пишешь в команде - в этом случае лучше договориться.

А глупый вопрос и "гениальная идея" - это понятия относительные. Если ты не освоился в среде то можешь голову себе сломать, прочитать сто пядтьдесят примеров найденных в поисковике но так и не понять в чем ошибка в коде -
PHP:
$str = '<span> LaLaLa </span>';
$new_mega_str= substr($str,7,1);
$new_mega_str= substr($str,8,1);
$new_mega_str= substr($str,9,1);
$new_mega_str= substr($str,10,1);
$new_mega_str= substr($str,11,1);
$new_mega_str= substr($str,12,1);
echo $new_mega_str;
 

workOnFood

Новичок
workOnFood
Ты не вкуриваешь что тебе пишут даже, а лезишь базы на файлах строить. Тебе говорят одно: мы все учились учимся и будем учиться, а ты пишешь. Есть разница? Да когда мы учимся мы тоже пишем, но мы не пишем а) за бабло б) не посмотрев примеров и других реализаций.
а) Поздравляю
б) Примеров приемлемых для изучения в короткие сроки, по данной теме(база на файлах) я не знаю, а сроки горят.
 

Mols

Новичок
workOnFood
Вообще я Вам так скажу... Вы конечно делайте... но помните, что Вам тут сказали.
И когда Ваши собственные шишки набьёте - отнеситесь с пониманием к тому, что придётся переделать модуль хранения/обработки данных.
Если же переделывать не придётся... то никаких "нагрузок" нет и в помине.
Ну не знаю в моем понимании гвнокод - это не оптимизированный код
Это классическое заблуждение начинающих программистов.
Код в первую очередь должен быть расширяемым и удобным в поддержке.
То есть максимально хорошо спроектированным.
А говорить про оптимизацию в Вашем случае просто смешно.
Правда это (тяга к оптимизации по началу) на самом деле нормально))) Но лучше побыстрее этот этап пройти.
 

workOnFood

Новичок
ты решил нам показать, что прочитал, что такое конкатенация?
Нет просто захотелось наглядно выразить свою мысль, а это первое что пришло в голову. Цепляться к словам каждый может, лучше бы по коду цеплялся=) Хоть какая польза.
 

workOnFood

Новичок
workOnFood
Вообще я Вам так скажу... Вы конечно делайте... но помните, что Вам тут сказали.
И когда Ваши собственные шишки набьёте - отнеситесь с пониманием к тому, что придётся переделать модуль хранения/обработки данных.
Если же переделывать не придётся... то никаких "нагрузок" нет и в помине.
Ну не знаю, мне кажется когда я закончу с кодом он вполне сможет держать нагрузки. Спасибо fixxxer, я теперь знаю что такое Apache Benchmark и усиленно им пользуюсь. Расставил где нужно flock(), сейчас переписываю функцию создания индекса, затем перепишу функцию вывода сообщений, и если обнаружу еще недочеты - исправлю их. Если вы все-таки прочитали код то должны знать что у меня каждый файл содержит инфу об относящемся к нему фале, т.е. доступ осуществляется непосредственно через путь, а все возможные операции описаны в функциях класса, т.е. от увеличения количества информации нагрузка расти не будет. Конечно не отрицаю что возможно я не вижу пока всех недочетов.
workOnFood
Это классическое заблуждение начинающих программистов.
Код в первую очередь должен быть расширяемым и удобным в поддержке.
То есть максимально хорошо спроектированным.
А говорить про оптимизацию в Вашем случае просто смешно.
Правда это (тяга к оптимизации по началу) на самом деле нормально))) Но лучше побыстрее этот этап пройти.
Учту.
 

workOnFood

Новичок
Кто-нибудь ответьте про бинарник плиз.

Ты тоже походу ни код не читал не предидущие сообщения.

Блин, что-то я не соображу как сделать индекс в бинарнике, в общих чертах это звучало так просто, а как взялся за реализацию подзалип.
Встает вопрос как писать данные строками заданной длины, в голову снова не приходит ничего лучше чем добавлять пробелы в конец, и вообще помоему я не совсем то делаю -
PHP:
$str = '1 12341231 123';
for($i=strlen($str);$i<50;$i++){
	$str.=' ';
}
$fp = fopen('data.bin','ab');
flock($fp,LOCK_EX);
fputs($fp,$str);
fclose($fp);
По моему у меня получается обычный текстовый файл. Я понимаю что любой будь то текстовый или еще какой файл является бинарным, но вроде он не должен нормально отображаться в редакторе, как текстовый.
Напишите плиз для примера как мне записать эту строку в бинарном виде, или все же у меня все правильно?
 

cDLEON

Онанист РНРСlub
http://php.net/pack
Только, по-моему, кто то изобретает велосипед. При чём не понимая основных принципов "индексирования"
 

tz-lom

Продвинутый новичок
б) Примеров приемлемых для изучения в короткие сроки, по данной теме(база на файлах) я не знаю, а сроки горят.
тебе уже сказали - SQLite
Кто-нибудь ответьте про бинарник плиз.
а ты знаешь что файлы бывают не только текстовые?
 

iceman

говнокодер
да пусть пишит

workOnFood
только не беги сразу на форум спрашивать, сходи в поиск, прочти умные книжки, изучи предметную область в конце концов.
вот будет тебе хорошая практика.

учеба состоит из того - с начало теория, потом практика.
а ты начал с практики, при этом даже не подозреваешь что делать и как делать, ну и надо ли делать... я имею ввиду не можешь с*ать не мучай попу
 

MiksIr

miksir@home:~$
А чо, я тоже начинал на файлах писать. В 98-м... потом набил шишки и вычитал про блокировки. Но как бы дргого особо и не было, даже мускуль не ахти как доступен был на хостингах. А потом появились базы и т.п... и больше к файлам я не возвращался =) Приятно, человек гордо идет моим путем. Это ничего, что 13 лет спустя, ну бывают такие люди, которым нужно самим все шишки набить - другим они не верят =)
 

workOnFood

Новичок
Да блин люди, читайте тему прежде чем постить!

Я делаю эту хрень не по собственному желанию это раз, мне не нужен функционал полноценной ДБ это два, и три - я хочу научиться работать с файлами, а на практике у меня получается учиться значительно лучше нежели зубрежкой манулов, естественно я читаю их по мере надобности, а иногда и полностью если знаю что об этой теме не имею ни малейшего предствления, стараюсь не задавать идиотских вопросов и гуглом я пользоваться умею. Откуда столько негатива и желания поучить жизни я вот чего не пойму. Неужели вы считаете что наша система образования настолько идеальна что нужно беспрекословно ей следовать? Информация по факту гораздо лучше усваивается мозгом в процессе создания чего-либо по законам изучаемого предмета, все факты расставляются по нужным местам в голове а не закидывются туда кучей хлама как при системной зубрежке.
 

AmdY

Пью пиво
Команда форума
workOnFood
1. тебя попросили сделать несусветную чушь, которая сломает проект
2. ты взялся это делать за деньги
3. ты пишешь, что сроки горят.
5. тебе предлагают хорошие готовые решения, но ты отказываешься.
Вместо того, чтобы научиться делать правильно, ты как наш президент., который долбит, что нужно работать 25 часов в сутки, а если надо, то и 50. Но своим совковским образованием не понимает что есть другой способ - работать 4-часа, но эффективно, делая то, что нужно и успевая выполнить всё работу за меньшее время.
а не закидывются туда кучей хлама как при системной зубрежке
хочешь скажу сколько раз я пользовался ftell - 0 раз за 6-ть лет, с самопальной бд на файлах работал 1 раз и то, в итоге переписал всё на dba, потому что под php 4 под freebsd у меня через определённое время файл становился пустым. так что ты занимаешься бесполезной зубрёжкой
 
  • Like
Реакции: craz

workOnFood

Новичок
Отвечать на 5 перечисленных тобой пунктов это уже форменный копипаст.
По поводу президента, вообще не к месту, кто сказал что я за то чтобы работать 25 часов в сутки. Я обеими руками за эффективность, просто я говорю что зубрежка - это не эффективно.
По поводу ftell() - понятное дело косяк, я его уже исправил.
 

cDLEON

Онанист РНРСlub
Тебе ни кто не говорит зазубривать. Прежде чем делать, нужно, хотя бы, немножко понимать то, что ты делаешь.
А у тебя нет даже минимума, но в тоже время ты корчишь умное лицо и пытаешься всем доказать, что твой подход самый правильный.
 

vovanium

Новичок
Кто-нибудь ответьте про бинарник плиз.
читать про pack/unpack,
пакуешь 3 числа, типа pack('NNN', $id, $time, $seek) пишешь в файл без всяких разделителей, соответственно у тебя будет файл с блоками по 12 байт (N - это 4-байтное целое число),
т.е. чтобы прочитать последние 10 записей, смещаешься fseek'ом на 120 байт назад от конца файла (не вздумай сюда пихать filesize, почитай доку по fseek),
читаешь одним куском 120 байт и разбиваешь на 10 частей, либо делаешь 10 чтений по 12 байт (я предпочитаю первый вариант),
после чего unpack('Nid/Ntime/Nseek', $binary_item) и получаешь свои данные
 

workOnFood

Новичок
vovanium

Спасибо. Правда не совсем понятно про filesize, его же можно здесь использовать чтобы узнать количество всех сообщений?
Вобщем написал все как ты сказал, но все равно вчера весь день ломал себе голову и до сих пор не могу понять в чем дело - некоторые участки получаются битыми, т.е. через unpack они уже не перекодируются, а на страницу выводится куча Warning типа этого -

Warning: unpack() [function.unpack]: Type N: not enough input, need 4, have 1 in Z:\home\sites.test\www\messys\core.php on line 75

Функция записи сообщений -

PHP:
function writeMessage($id,$gr,$mes){
		$mes = preg_replace("/\n/s",'<br/>',htmlspecialchars($mes));
		$fp = fopen($this->dirOfBase.'groups/'.$gr.'/gr.fb','a');
		flock($fp,LOCK_EX);
		$pos = filesize($this->dirOfBase.'groups/'.$gr.'/gr.fb');
		fputs($fp,$mes."\n");
		fclose($fp);
		$data_bin = pack('N3',$id,time(),$pos);
		$fp = fopen($this->dirOfBase.'groups/'.$gr.'/m_index.bin','ab');
		flock($fp,LOCK_EX);
		fputs($fp,$data_bin);
		fclose($fp);
	}
Функция чтения сообщений, плюс в конце выводится массив неудачных секторов. Сколько раз я не записывал по 500 штук, массив с ошибками был почти одинаковым, отсюда можно сделать что ошибка зависит от числа позиции в файле и иногда от текущей метки времени, так как id я всегда передаю один и тот же.

PHP:
function getDialogArr($gr,$from=0,$howmany=0){
		$all = 0-filesize($this->dirOfBase.'groups/'.$gr.'/m_index.bin');
		$fp = fopen($this->dirOfBase.'groups/'.$gr.'/m_index.bin','rb');
		flock($fp,LOCK_EX);
		$from = $from=='all'?$all:$from = 0 - $from*12;
		$howmany = 0 - $howmany*12;
		for($i=$from;$i<$howmany;$i+=12){
			if($i!=0){
				fseek($fp,$i,SEEK_END);
				$bin = fgets($fp,13);
				$index_arr[] = unpack('N3',$bin);
                if(!unpack('N3',$bin))$bad[]=$i;
			}
		}
		fclose($fp);
		$fp =fopen($this->dirOfBase.'groups/'.$gr.'/gr.fb','r');
		foreach($index_arr as $mes_x){
			fseek($fp,$mes_x[3]);
			$mes = fgets($fp);
			if(date("j",$mes_x[2])<date("j"))$df = "d.m.Y H:i";
			else $df = "H:i";
			$user = file_get_contents($this->dirOfBase.'users/'.$mes_x[1].'.fb');
			$user = explode("\t",$user);
			$disp_arr[] = array($user[1],$user[2],date($df,$mes_x[2]),$mes);
		}
		fclose($fp);
		var_dump($bad);
		echo '<br/>';
		return $disp_arr;
	}
Битые сектора пытался читать не через цикл, та же история возвращает warning.
 

workOnFood

Новичок
Вот с таким входящим текстом ошибка - $id=1; $time=1306919327 $pos = 2813
Type N: not enough input, need 4, have 3

В переводе - недостаточно входящих данных -нужно 4 есть 3
 
Сверху