Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Поиск // Сессия (https://forum.antichat.xyz/showthread.php?t=163620)

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

Цитата:

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


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

vorona 15.12.2009 22:02

Цитата:

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

Ну есть файл размером 3 мб. Какой самый быстрый способо произвести поиск в этом файле?

m0Hze 15.12.2009 23:21

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

vorona 15.12.2009 23:49

Цитата:

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

1) по другому никак?

vorona 15.12.2009 23:51

Цитата:

Сообщение от b3
Встречный вопрос - сколько ты знаеш способов поиска ?

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

m0Hze 15.12.2009 23:59

Цитата:

Сообщение от vorona
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

Цитата:

Сообщение от vorona
Ну все делают стандартно: file_get_contents или file, а потом в цикле preg_match или ereg. Но это ресурсоёмно слижко для больших файлов...

Делать было нечего...

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($fp1024);
}
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($fp1024);
}
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($fp1024);
    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($fp1024);
    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

Цитата:

Сообщение от Gifts
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
Делать было нечего...


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

b3 16.12.2009 12:21

Цитата:

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

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

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

Цитата:

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

Странный ты человек, я тебе привел "таблицу" потребляемости, ты же вообще хотел 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

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


Время: 00:32