Поиск // Сессия

Discussion in 'PHP' started by vorona, 14 Dec 2009.

  1. vorona

    vorona Member

    Joined:
    7 Sep 2009
    Messages:
    392
    Likes Received:
    7
    Reputations:
    1
    1. Как быстро и эффективно организовать поиск на PHP в файле в несколько мб?
    2. Как сделать, чтоб сессия на поддомене не терялась?
     
  2. Serzh CS

    Serzh CS New Member

    Joined:
    13 Dec 2009
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    Скорее всего нужно будет ssesion_start(); привязывать как-то к ip адресу.
     
  3. Root-access

    Root-access Elder - Старейшина

    Joined:
    18 Jun 2008
    Messages:
    193
    Likes Received:
    195
    Reputations:
    91

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

    vorona Member

    Joined:
    7 Sep 2009
    Messages:
    392
    Likes Received:
    7
    Reputations:
    1
    Ну есть файл размером 3 мб. Какой самый быстрый способо произвести поиск в этом файле?
     
  5. vorona

    vorona Member

    Joined:
    7 Sep 2009
    Messages:
    392
    Likes Received:
    7
    Reputations:
    1
    1) по другому никак?
     
  6. vorona

    vorona Member

    Joined:
    7 Sep 2009
    Messages:
    392
    Likes Received:
    7
    Reputations:
    1
    Ну все делают стандартно: file_get_contents или file, а потом в цикле preg_match или ereg. Но это ресурсоёмно слижко для больших файлов...
     
  7. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    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 метровом файле, уже что-то другое будете использовать?
     
    _________________________
  8. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    с файлом понятно, чтобы не зависеть от памяти:

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

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

    b3 Moderator

    Joined:
    5 Dec 2004
    Messages:
    2,041
    Likes Received:
    933
    Reputations:
    199
    Делать было нечего...

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

    ?>
     
    _________________________
  10. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    b3 Несколько странный результат в вашем посте. По времени-то все правильно (вроде), но по потреблению памяти - в скрипте результаты чтения не удаляются, следовательно памяти отжирать должно, приблизительно, одинаково. Если же не сохранять - то fread, fgets - логично должны быть впереди.

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

    vorona Member

    Joined:
    7 Sep 2009
    Messages:
    392
    Likes Received:
    7
    Reputations:
    1
    Перебить в БД геморно будет наверно. Это нада перебить в БД и переписать весь код.
    За ссыль спасибо - почсмотрю.
     
  12. vorona

    vorona Member

    Joined:
    7 Sep 2009
    Messages:
    392
    Likes Received:
    7
    Reputations:
    1
    Спасибо за код, но если несколько юзерей будут работать с большими файлами, то уже умножатся расходы.
     
  13. b3

    b3 Moderator

    Joined:
    5 Dec 2004
    Messages:
    2,041
    Likes Received:
    933
    Reputations:
    199
    Там везде unset() и хендлеры закрываются. А пример с fread специально сделан по анологии с другими, что б показать с какой дополнительной проблемой можно столкнутся.

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

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    b3 Я про такую строчку (в самом начале) @$data .= fgets($fp, 1024); Ансетится переменная ПОСЛЕ того как смотрим на потребление. И в таком виде все эти способы будут потреблять одинаково памяти:
     
    _________________________
  15. vorona

    vorona Member

    Joined:
    7 Sep 2009
    Messages:
    392
    Likes Received:
    7
    Reputations:
    1
    если сайт на фс, то лучше использовать поиск гуглом по сайту?