1. Как быстро и эффективно организовать поиск на PHP в файле в несколько мб? 2. Как сделать, чтоб сессия на поддомене не терялась?
Что-то очень размытый вопрос.. Какой поиск нужен? Может просто воспользоваться готовыми строковыми функциями? Или нужен продвинутый поиск?
Ну все делают стандартно: file_get_contents или file, а потом в цикле preg_match или ereg. Но это ресурсоёмно слижко для больших файлов...
vorona строковые функции + fread - если в пределах пхп, то будет достаточно быстро. Но вопрос - стоит ли, что это за файл в котором ищется, не проще ли будет переработать все в БД? http://php.net/session_set_cookie_params - третий параметр позволяет устанавливать домен для сессионной куки. Выдержка из мана: To make cookies visible on all subdomains then the domain must be prefixed with a dot like '.php.net'. m0Hze а если надо найти 5 вхождений в 50 метровом файле, уже что-то другое будете использовать?
с файлом понятно, чтобы не зависеть от памяти: $a = fopen ('123.txt', 'r'); while (!feof($a)) { $b = fgets($a); ....... } построковая обработка. Если линукс - то проще grep юзать
Делать было нечего... PHP: <?php echo 'Стартанули: '.round((memory_get_usage() /1024/1024), 3)."Mb<hr>"; $SRART = microtime(); $fp = fopen('ftp.txt','r'); // 430 КБ (441*095 байт) while (!feof($fp)) { @$data .= fgets($fp, 1024); } fclose($fp); $END = microtime(); echo 'Fgets '.round((memory_get_usage() /1024/1024), 3)."Mb<br>"; echo 'Расход времени на открытие файла '.($END - $SRART).'<hr>'; unset($data); $SRART = microtime(); $fp = fopen('ftp.txt','r'); // 430 КБ (441*095 байт) while (!feof($fp)) { @$data .= fread($fp, 1024); } fclose($fp); $END = microtime(); echo 'Fread '.round((memory_get_usage() /1024/1024), 3)."Mb<br>"; echo 'Расход времени на открытие файла '.($END - $SRART).'<hr>'; unset($data); $SRART = microtime(); $fgc = file_get_contents('ftp.txt'); $END = microtime(); echo 'File Get Cont '.round((memory_get_usage() /1024/1024), 3)."Mb<br>"; echo 'Расход времени на открытие файла '.($END - $SRART).'<hr>'; unset($fgc); $SRART = microtime(); $file = file('ftp.txt'); $END = microtime(); echo 'File '.round((memory_get_usage() /1024/1024), 3)."Mb<br><br>"; echo 'Расход времени на открытие файла '.($END - $SRART).'<hr>'; unset($file); echo 'Очистили память '.round((memory_get_usage() /1024/1024), 3)."Mb <hr>"; $SRART = microtime(); $fp = fopen('ftp.txt','r'); // 430 КБ (441*095 байт) while (!feof($fp)) { $data = fgets($fp, 1024); if(preg_match('#(.*)\.ru#',$data,$m)) @$arr[] = $m[0]; } fclose($fp); $END = microtime(); echo 'Расход памяти FGETS '.round((memory_get_usage() /1024/1024), 3)."Mb<br>\r\n"; echo 'Расход времени '.($END - $SRART).'<br>'; echo count($arr).'<hr>'; // найдено 4730 ФТП unset($arr); ########################################################################################### $SRART = microtime(); $fp = fopen('ftp.txt','r'); // 430 КБ (441*095 байт) while (!feof($fp)) { $data = fread($fp, 1024); if(preg_match('#(.*)\.ru#',$data,$m)) @$arr[] = $m[0]; } fclose($fp); $END = microtime(); echo 'Расход памяти FREAD '.round((memory_get_usage() /1024/1024), 3)."Mb<br>\r\n"; echo 'Расход времени '.($END - $SRART).'<br>'; echo count($arr).'<hr>'; // найдено 431 ФТП unset($arr); ########################################################################################### $SRART = microtime(); $fgc = file_get_contents('ftp.txt'); preg_match_all('#(.*)\.ru#',$fgc,$m); $END = microtime(); echo 'Расход памяти FGC '.round((memory_get_usage() /1024/1024), 3)."Mb<br>\r\n"; echo 'Расход времени '.($END - $SRART).'<br>'; echo count($m[1]).'<hr>'; // найдено 4730 фтп unset($m); ########################################################################################### $SRART = microtime(); $file = file('ftp.txt'); foreach ($file as $str) { if(preg_match('#(.*)\.ru#',$str,$m)) $arr[] = $m[0]; } $END = microtime(); echo 'Расход памяти FILE '.round((memory_get_usage() /1024/1024), 3)."Mb<br>\r\n"; echo 'Расход времени '.($END - $SRART).'<br>'; echo count($arr); // найдено 4730 фтп ?>
b3 Несколько странный результат в вашем посте. По времени-то все правильно (вроде), но по потреблению памяти - в скрипте результаты чтения не удаляются, следовательно памяти отжирать должно, приблизительно, одинаково. Если же не сохранять - то fread, fgets - логично должны быть впереди. Плюс поиск с fread сделан не совсем правильно, потому и результаты не те.
Перебить в БД геморно будет наверно. Это нада перебить в БД и переписать весь код. За ссыль спасибо - почсмотрю.
Спасибо за код, но если несколько юзерей будут работать с большими файлами, то уже умножатся расходы.
Там везде unset() и хендлеры закрываются. А пример с fread специально сделан по анологии с другими, что б показать с какой дополнительной проблемой можно столкнутся. Странный ты человек, я тебе привел "таблицу" потребляемости, ты же вообще хотел fgc или file() использовать, в последнем случае потребляет больше всего ресурсов.
b3 Я про такую строчку (в самом начале) @$data .= fgets($fp, 1024); Ансетится переменная ПОСЛЕ того как смотрим на потребление. И в таком виде все эти способы будут потреблять одинаково памяти: