PDA

Просмотр полной версии : Поиск // Сессия


vorona
15.12.2009, 00:12
1. Как быстро и эффективно организовать поиск на PHP в файле в несколько мб?
2. Как сделать, чтоб сессия на поддомене не терялась?

Serzh CS
15.12.2009, 00:32
Скорее всего нужно будет ssesion_start(); привязывать как-то к ip адресу.

Root-access
15.12.2009, 00:38
1. Как быстро и эффективно организовать поиск на PHP в файле в несколько мб?
2. Как сделать, чтоб сессия на поддомене не терялась?


Что-то очень размытый вопрос.. Какой поиск нужен?
Может просто воспользоваться готовыми строковыми функциями? Или нужен продвинутый поиск?

vorona
15.12.2009, 22:02
Что-то очень размытый вопрос.. Какой поиск нужен?
Может просто воспользоваться готовыми строковыми функциями? Или нужен продвинутый поиск?
Ну есть файл размером 3 мб. Какой самый быстрый способо произвести поиск в этом файле?

m0Hze
15.12.2009, 23:21
1) Хранить сессию в БД,и уже ручками привязывать клиенту как нужно.
2) Ну пхп не так много предоставляет для работы с ФС.Либо массив,либо считывать побайтово, и искать по мере поступления.Но это эффективно,только если нужно найти 1 вхождение,а если нет,то так и так парсить фесь файл = загружать в оперативку,а уж как - дело хозяйское.

vorona
15.12.2009, 23:49
1) Хранить сессию в БД,и уже ручками привязывать клиенту как нужно.
2) Ну пхп не так много предоставляет для работы с ФС.Либо массив,либо считывать побайтово, и искать по мере поступления.Но это эффективно,только если нужно найти 1 вхождение,а если нет,то так и так парсить фесь файл = загружать в оперативку,а уж как - дело хозяйское.
1) по другому никак?

vorona
15.12.2009, 23:51
Встречный вопрос - сколько ты знаеш способов поиска ?
Ну все делают стандартно: file_get_contents или file, а потом в цикле preg_match или ereg. Но это ресурсоёмно слижко для больших файлов...

m0Hze
15.12.2009, 23:59
1) по другому никак?
Ну вообще,я слышал недавно придумали такую штучку...cookies называеться.Так вот там говорят можно привязать к домену,да даже к любому!
2) А я бы все же считывал побайтово,если необходимо только 1 вхождение,и важно время.

Gifts
16.12.2009, 01:30
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 метровом файле, уже что-то другое будете использовать?

Pashkela
16.12.2009, 01:36
с файлом понятно, чтобы не зависеть от памяти:

$a = fopen ('123.txt', 'r');
while (!feof($a)) {
$b = fgets($a);
.......
}

построковая обработка. Если линукс - то проще grep юзать

b3
16.12.2009, 01:40
Ну все делают стандартно: file_get_contents или file, а потом в цикле preg_match или ereg. Но это ресурсоёмно слижко для больших файлов...
Делать было нечего...


<?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 фтп

?>



Стартанули: 0.368Mb
Fgets 0.79Mb
Расход времени на открытие файла 0.102569
Fread 0.79Mb
Расход времени на открытие файла 0.005163
File Get Cont 0.79Mb
Расход времени на открытие файла 0.007277
File 1.924Mb

Расход времени на открытие файла 0.012859
Очистили память 0.369Mb
Расход памяти FGETS 0.968Mb
Расход времени 0.223655
4730
Расход памяти FREAD 0.423Mb
Расход времени 0.012558
431
Расход памяти FGC 1.966Mb
Расход времени -0.937841
4730
Расход памяти FILE 2.941Mb
Расход времени 0.156725
4730

Gifts
16.12.2009, 03:34
b3 Несколько странный результат в вашем посте. По времени-то все правильно (вроде), но по потреблению памяти - в скрипте результаты чтения не удаляются, следовательно памяти отжирать должно, приблизительно, одинаково. Если же не сохранять - то fread, fgets - логично должны быть впереди.

Плюс поиск с fread сделан не совсем правильно, потому и результаты не те.

vorona
16.12.2009, 10:35
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 метровом файле, уже что-то другое будете использовать?
Перебить в БД геморно будет наверно. Это нада перебить в БД и переписать весь код.
За ссыль спасибо - почсмотрю.

vorona
16.12.2009, 10:40
Делать было нечего...



Спасибо за код, но если несколько юзерей будут работать с большими файлами, то уже умножатся расходы.

b3
16.12.2009, 12:21
b3в скрипте результаты чтения не удаляются, следовательно памяти отжирать должно, приблизительно, одинаково. Если же не сохранять - то fread, fgets - логично должны быть впереди.

Плюс поиск с fread сделан не совсем правильно, потому и результаты не те.
Там везде unset() и хендлеры закрываются. А пример с fread специально сделан по анологии с другими, что б показать с какой дополнительной проблемой можно столкнутся.

Спасибо за код, но если несколько юзерей будут работать с большими файлами, то уже умножатся расходы.
Странный ты человек, я тебе привел "таблицу" потребляемости, ты же вообще хотел fgc или file() использовать, в последнем случае потребляет больше всего ресурсов.

Gifts
16.12.2009, 18:04
b3 Я про такую строчку (в самом начале) @$data .= fgets($fp, 1024); Ансетится переменная ПОСЛЕ того как смотрим на потребление. И в таком виде все эти способы будут потреблять одинаково памяти: Стартанули: 0.091Mb
Fgets 2.799Mb
Расход времени на открытие файла 0.296297
Fread 2.799Mb
Расход времени на открытие файла 0.13753
File Get Cont 2.799Mb
Расход времени на открытие файла -0.798061
File 2.823Mb
Расход времени на открытие файла 0.134742975235

vorona
18.12.2009, 10:51
если сайт на фс, то лучше использовать поиск гуглом по сайту?