ну тут кто то писал что надо для большого количества юзеров надо на на смещениях в файле и т.д.. ну вот даже для реального с локальным файлом sqlite. да даже для теста sqlite.. а это фан --- Добавлено --- ненужно. и так все понятно же
не буду спорить не знаю как MySQL поведёт себя на миллионе пользователей, только вот кажется что даже не чухнет. Ну да ладно. когда буду данные такими кол-вами пробрасывать, подумаю над твоими словами, а пока можно не заморачиваться есть вещи по серьёзней в данный момент.
@rodent90 херню не неси. "прочитать файл и потом изучить этот поток на наличие подстроки" сравни с "прочитать файл, разбив его по строкам занести в массив, и потом найти в этом массиве значение равное строке". так-то первая операция быстрее, поэтому предложенный @pinokio вариант один из самых быстрых. Другое дело что скил у него ещё нулевой и он предложил рукожопое решение. На предложение поработать головой и напильником над своим кодом - пациент бросается на окружающих. Всё придет со временем. И у тебя. И у него.
@Schrodinger но база данных та удобней и привычней... Ну и думаю, защита у неё оч серьёзная Ну только конечно, если дырко в ней не оставить Но в php куда быстрее оставить дырки чем при стыковки к бд.... xD там всё элементарно pdo::quote и всё или pdo:repare и всё и запрос, элементарный и он полностью рабочий) А главное что там много поточность запросов реализована, то есть он сам будет распределять запросы и выдачу овтетов, в общем это оч умная система на самом деле.
Вы опять меняете условия задачи. Зачем? Самое быстрое решение - preg_match, только не такой, какой @Schrodinger предложил. Оригинальная задумка ТС всегда либо самая медленная, либо почти самая медленная.
О да! Гении блин собрались. Смехота. Хотел дать более правильное решение, но вы не достойны его, пользуйтесь этим калом дальше, оно же самое быстрое Для меня тема умерла, как и вы! Удачи! Шпиюны
@rodent90 давай без обедулек и пустозвонства. Есть "более правильное решение" - выкладывай. Нет - не трынди.
самый быстрый не индексированный поиск будет вида PHP: $data = file_get_contents('users.txt'); $search = "{$login}{$pass}\n"; if ( (substr($data, 0, strlen($search)) === $search) || (strpos($data, "\n{$search}") !== false) ) { echo "Valid\n"; } else { echo "Invalid\n"; } при условии что добавляли как fwrite($fp, "{$login}{$pass}\n"); ---- индексированное же будет самое быстрое будет(скорей всего на чтение быстрее mysql и sqlite Будет, хотя я не сравнивал с ними) вида(только проверу ключа надо доделать т.к. могут быть совпадения) PHP: interface Cache { public function Get($key, $callback = null); public function Set($key, $value); } class FileCache implements Cache { private $pathDB; private $handle; public function __construct($pathDB = null) { $pathDB = $pathDB === null ? __DIR__ . "/_cache" : $pathDB; if ( !is_dir($dir = dirname($pathDB)) ) { if ( !@mkdir($dir, 0777, 1) ) throw new \Excpection("File ~mkdir('$dir')~ error."); } if ( !$this->handle = fopen($pathDB, "c+") ) throw new \Excpection("File ~fopen('$pathDB')~ error."); if ( $this->Stat('size') < 1 << 24 << 2 ) { $this->Lock(function() { if ( $this->Stat('size') < 1 << 24 << 2 ) { ftruncate($this->handle, 1 << 24 << 2); } }); } } public function Get($key, $callback = null) { return $this->doKV($key)->Lock(function() use($callback) { $offset = $this->ReadUInt32($this->offset); while(1) { if ( !$offset ) { if ( $callback !== null ) { $this->Set( $data = $callback() ); return $data; } return null; } if ( $this->ReadBuffer($offset, strlen($this->hash)) === $this->hash ) { break; } $offset = $this->ReadUInt32($offset + strlen($this->hash)); } $size = $this->ReadUInt32($offset + strlen($this->hash) + 4); return $this->ReadBuffer($offset + strlen($this->hash) + 4 + 4, $size); }, LOCK_SH); } public function Set($key, $value) { $this->doKV($key, $value)->Lock(function() { $prevOffset = $this->offset; $offset = $this->ReadUInt32($this->offset); while( $offset ) { if ( $this->ReadBuffer($offset, strlen($this->hash)) === $this->hash ) { break; } $prevOffset = $offset; $offset = $this->ReadUInt32($offset + strlen($this->hash)); } if ( $offset ) { $prevOffset = $this->ReadUInt32($offset + strlen($this->hash)); } $this->WriteUInt32( $this->offset, $this->WriteNew( $this->hash, $this->value, $this->ReadUInt32($this->offset) ) ); }, LOCK_EX); return $this; } private function WriteNew($hash, $value, $next) { $offset = $this->Stat('size'); ftruncate($this->handle, $offset + strlen($hash) + 4 + 4 + strlen($value)); $this->WriteBuffer($offset, $hash); $this->WriteUInt32($offset + strlen($hash) , $next); $this->WriteUInt32($offset + strlen($hash) + 4, strlen($value)); $this->WriteBuffer($offset + strlen($hash) + 4 + 4, $value); return $offset; } private function Lock($callback, $mode = LOCK_EX) { if ( !flock($this->handle, $mode) ) throw new \Excpection("File ~flock()~ error."); $result = $callback(); if ( !flock($this->handle, LOCK_UN) ) throw new \Excpection("File ~flock()~ error."); return $result; } private function Stat($params = null) { if ( $params === null ) { return fstat($this->handle); } return fstat($this->handle)[$params]; } private function ReadUInt32($offset) { fseek($this->handle, $offset); return unpack("l", fread($this->handle,4))[1]; } private function ReadBuffer($offset, $size) { fseek($this->handle, $offset); return fread($this->handle, $size); } private function WriteUInt32($offset, $value) { fseek($this->handle, $offset); fwrite($this->handle, pack("l", $value)); return $this; } private function WriteBuffer($offset, $value) { fseek($this->handle, $offset); fwrite($this->handle, $value); return $this; } private $hash; private $offset; private $value; private function doKV($key, $value = null) { $this->hash = md5($key); $this->offset = hexdec(substr($this->hash,0,6)) << 2; $this->hash = substr($this->hash, 6); $this->value = $value; return $this; } } $cache = new FileCache(__DIR__ . "/users-fc-data"); if ( $cache->Get($login) === $pass ) { // some } ,а самое красивое квл( хотя скорость там будет не большой( изза общей локировки на запись что при чтении что при записи, и изза большой абстракции) --- Добавлено --- пс: все рассматриваемое в рамках файловых функций php
Вообще использовать заглушки ошибок в виде "@" плохой тон. Лично я пишу код, чтобы не было даже e-notice.
@Schrodinger твой код дает фолс-позитивы. Тем не менее я его прогнал через свой бенч этой темы. Медленнее, чем preg_match. На больших объемах, конечно, быстрее, но это можно не учитывать, в виду кривизны.
Из-за этой "орфографии" может поломаться весь код Допустим, чтобы вы сделали заглушки, а потом через пол года полезли в код и где-то в далеком начале скриптов что-то изменили. Конечно же заглушенные ошибки не отобразятся и вы посчитаете скрипт рабочим, хотя на самом деле скрипт уже будет либо с багами, либо в "боевых" условиях не рабочий. И если не ошибаюсь, то @ кушает дополнительные ресурсы сервера. Немного, но кушает. И так с каждого пользователя.
что это такое? где кривизна в коде?( я про неиднексированный способ ) помой му с задачей проверки существования набора символов(кроме \n) вполне справляется
ложные срабатывания. В данном случае ложно совпадение со строкой, с которой совпадения быть не должно. Учи матчасть. Правильно это слово пишется "по-моему". Или всё же ты реально предлагаешь помыть какую-то му? Ты перед тем как публиковать - тестируй. По опыту бенчмарка прошлой темы (с айпишниками) - сначала "решение" надо тестировать на корректность алгоритма а потом уже время замерять. Не имеет смысл тестировать алгоритм, который неверно работает с данными. Так что я твоё "решение" лишь скопипастил, оно не прошло тест, ну и как следствие - дало бессмысленные результаты бенчмарка. Да, прошу меня малость извинить. Конечно же, самым быстрым является решение со strpos. Но не те, которые предложили @pinokio и @Schrodinger. У первого вообще не тестировалось, так как фолс-позитивы видно даже при чтении сурса. А второй написал было сложную конструкцию, но выстрелил ею себе в ногу. На втором месте - preg_match, но не в версии @Schrodinger.
я ошибок не вижу. если вы про это {$login}{$pass} то изначально как я у автора скоприровал $ud=$name.$pass; так и пошло. к тестам скорости это врятли относится
PHP: function _check($login, $pass) { $data = @file_get_contents('users222.txt'); $search = "$login\r$pass\n"; return ( (substr($data, 0, strlen($search)) === $search) || (strpos($data, "\n{$search}") !== false) ); } function _set($login, $pass) { $search = "$login\r$pass\n"; $fp=fopen('users222.txt', "a+"); fwrite($fp, $search); fclose($fp); } так лучше?
@Schrodinger сорян! В процессе копипаста потерял одну важную строку. С ней твой алгоритм вполне не дает фолс-позитивов. И даже выигрывает трофеи в моём бенчмарке.