[php] Новичкам: задаем вопросы

Discussion in 'PHP' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Мен, если тебе нужно сразу много парсить страничек, то тут есть несколько вариантов, а именно 2:

    1) Циклом ты оперируешь двумя операциями: а) проход по ссылке с помощью сокетов б) парсинг тела
    2) Используешь многопоточный курл, экономишь дофига времени и получаешь нужный результат

    Немного цифр: имеется 1000 страниц, каждая загружается за 2 секунды:

    1) первым вариантом это будет 1000 х 2 = 2000 секунд + время на парсинг
    2) вторым вариантом это будет 2 секунды + время на парсинг

    А все потому, что сокеты для многопотока неподойдут. Нет, можно конечно сделать скрипт "оператор" на сокетах + скрипт, который бы 1000 этих "операторов" вызывал одномоментно, но это, так сказать, костыли.

    По теме: кури в сторону функций curl_multi_init(), curl_init(), curl_setopt(), curl_multi_exec()...

    //Gifts: хочется помочь бесплатно - пишите сюда, не стесняйтесь. Платно - пишите ему в личку и чтобы в разделе этого не видел. Считайте предупреждением
     
    #20541 |qbz|, 10 May 2012
    Last edited by a moderator: 11 May 2012
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    4XE До тех пор пока вы скрипты не пишете, а находите, и просите чтобы их вам улучшили вместо вас - вам здесь не рады. Почитайте книжки по основам программирования. Например о циклах, чтении из файла и прочем

    |qbz|
    Можете считать занудой, но на сокетах тоже можно "2 секунды + время на парсинг"
     
    _________________________
  3. 4XE

    4XE New Member

    Joined:
    10 May 2012
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Gifts, Я не прошу написать а лишь посоветовать, с помощь каких функций можно решить ту или иную задачу..

    |qbz|, спасибо, об curl мне известно, граберы с использованием curl я так же встречал в интернетах..




    и так с загрузкой базы из файла я разобрался. а вот с циклами мягко говоря ерунда получается

    PHP:
    <?php 
    function input_into($text)
    {
        
    $a_file=fopen("./grab_output.txt","a+");
        
    fputs($a_file,"$text");
        
    fclose($a_file);

    function 
    get_URL_by_socket ($host,$path) { 
     
    //Получает URL $path с хоста $host через сокеты.
     
    $fp fsockopen($host80); 
     if (!
    $fp) { 
      die (
    "Не могу получить данные с url http://$host/$path"); 
     } 
     else { 
      
    $out "GET $path HTTP/1.0\r\n"
      
    $out .= "Accept: image/gif, application/xhtml+xml, */*\r\n"
      
    $out .= "Accept-Language: ru\r\n"
      
    $out .= "Host: $host\r\n"
      
    //Имитируем браузер Opera Mini:
      
    $out .= "User-Agent: Opera/8.01 (J2ME/MIDP; ".
       
    "Opera Mini/2.0.4509/1716; ru; U; ssr)\r\n"
      
    $out .= "Cache-Control: no-cache\r\n"//Не кэшировать 
      
    $out .= "Connection: Close\r\n\r\n"
      
    fwrite($fp$out); 
      
    $headers ""
      while (
    $str trim(fgets($fp))) 
       
    $headers .= "$str\n"
      
    $body ""
      while (!
    feof($fp)) 
       
    $body .= fgets($fp); 
       
    input_into($body); 
      
    fclose($fp); 
     } 
     return 
    $body


    function 
    process($s,$start,$end,$include) { 
     
    //Парсит полученный файл - здесь-то и пишется главное
     //У нас это извлечение содержимого от $start до $end
     
    $s1=strpos ($s,$start);
     
    $s2=strpos ($s,$end);
     if (!
    is_integer($s1)) {
      return 
    "Не найден начальный сегмент: ".htmlspecialchars($start);
     }
     if (!
    is_integer($s2)) {
      return 
    "Не найден конечный сегмент: ".htmlspecialchars($end);
     }
     if (
    $s1>$s2) {
      return 
    "Конечный сегмент предшествует начальному";
     }
     if (
    $include) { //Включать начало и конец
      
    return substr ($s,$s1,$s2-$s1+strlen($end));
     }
     else { 
    //Исключить начало и конец
      
    $s1+=strlen($start);
      return 
    substr ($s,$s1,$s2-$s1);
     }


    function 
    parser ($host,$path,$start,$end,$include) {
     
    //Основной вызов парсера:
     //$host, $path - хост без http://www. и путь к файлу, начиная с /
     //$start, $end - строки начала и конца извлекаемого содержимого
     //$include - если true, включать в вывод строки $start и $end
     
    static $first=true;
     
    $sget_URL_by_socket ($host,$path); 
     if (
    $first) {  //Заголовок посылается только при 1-м вызове
      
    $first=false//Если вызывается из "движка" - можно убрать этот блок
      
    header('Conte    nt-type:text/html;charset=windows-1251'); 
     }
     return 
    process($s,$start,$end,$include);
    }
    $file file ("./url.txt");
    foreach(
    $file as $to){          ///почему-то работает только ссылка из последней строки, остальные же 
    $host="sitename.ru";            ///выдают ошибку(о том что страница не имеет нужных тегов), при подстановке в 
    $path"$to";                  ///код. 
    $start="<body>";
    $end="</body>";
    $include=false;
    print 
    parser ($host,$path,$start,$end,$include);
    почему-то работает только ссылка из последней строки, остальные же выдают ошибку(о том что страница не имеет нужных тегов), при подстановке в код.
    Собственно вопрос, почему так?
     
    #20543 4XE, 11 May 2012
    Last edited: 11 May 2012
  4. Rastamanka

    Rastamanka Elder - Старейшина

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Доброе утро. Есть ли какая нить готовая функция которая при определенном условии в цикле foreach повторяет последнее действие еще раз?

    То есть имеем цикл

    foreach ($arr as $key) {

    // тут подключаемся по определенному урлу и если в ответе сервера нету нужного
    // нам пробуем еще раз повторить это же действие цикла

    }
     
  5. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Можно, у меня пара скриптов только на сокетах и стоит, так как курл с подобными задачами не справляется. Просто я хотел человеку донести, что в его случаях оптимальнее юзать курл.

    Оффтоп: вот незнаю, но мне почему-то смешно от вашей мелочности, уважаемый Gifts )
     
  6. AnGeI

    AnGeI Elder - Старейшина

    Joined:
    8 Dec 2008
    Messages:
    395
    Likes Received:
    79
    Reputations:
    16
    Какие плюсы низкоуровневых сокетов перед обычными?
     
  7. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    4XE При чтении из файла в массив с помощью функции file() в конце каждой строки (быть может последней) остаются символы перевода строки, от них надо избавляться с помощью функции trim()

    Rastamanka выделите тело цикла в отдельную функцию и в зависимости от возвращаемого значения - выполняйте. А ответ на ваш вопрос - специализированных конструкций для этого нет.

    |qbz|
    Просто еще не натыкались, или принимаете как должное. Но дьявол действительно кроется в деталях

    AnGeI
    Возможность реализации любого протокола без ограничений. У курла есть некоторые болячки, которые надо тяжело обходить.
     
    _________________________
    1 person likes this.
  8. Metal-Core

    Metal-Core Member

    Joined:
    20 Sep 2011
    Messages:
    224
    Likes Received:
    21
    Reputations:
    0
    Не ставится кодировка utf-8 ,в исходном коде присутсвует.. браузер видит как 1251

    PHP:
    <?php
        
        $ch 
    curl_init();
       
    $header[0] = "Content-type: text/xml; charset=utf-8";
        
            
    curl_setopt($ch,CURLOPT_HTTPHEADER,$header);
            
    curl_setopt($ch,CURLOPT_URL,'www.mail.ru');
            
    curl_setopt($ch,CURLOPT_USERAGENT,'Opara/1.0 (compatible; MSIE 5.01; Windows NT 5.0)');
            
    curl_exec($ch);
            
    curl_close($ch);
            
            echo 
    $ch;

    ?>
     
  9. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Metal-Core Простите, но вы, надеюсь, не ожидаете, что такая конструкция заставит пхп отправить нужный заголово по волшебству?
    PHP:
    $header[0] = "Content-type: text/xml; charset=utf-8"
    Используйте
    PHP:
    header("Content-type: text/xml; charset=utf-8"); 
     
    _________________________
  10. Adio

    Adio Elder - Старейшина

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    Есть данные типа
    Code:
    <part1>data</part1>
    <part2>data</part2>
    <part3>data</part3>
    
    Как на ПХП сделать так что бы они не повторялись ? т.е идет 1 2 3, потом идет 4 5 6, 7 8 9, как сделать так что бы можно было генерировать ? я понимаю что это в цикле но я не знаю как кадый раз прибавлять нужно или как ? т.е логику я понимаю что может это и просто мат не шарю )
     
  11. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    PHP:
    for($i 1$i <= 9; ++$i)
      echo 
    "<part$i>data</part$i>";
     
  12. Adio

    Adio Elder - Старейшина

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    Не смешно : )

    Code:
    <part1>data</part1>
    <part2>data</part2>
    <part3>data</part3>
    
    потом вот так


    Code:
    <part4>data</part4>
    <part5>data</part5>
    <part6>data</part6>
    

    Там не просто 1 2 3 4 5 6 идет построчно :) - а идут цифры которые повторяються в начале и конце тегов
     
  13. Adio

    Adio Elder - Старейшина

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    Тут как то по хитрому надо я не знаю...
     
  14. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Adio Вас ОЧЕНЬ тяжело понять. Вы вначале решите что вам нужно, а потом напишите это. А после написания спросите кого-нибудь знакомого - понял ли он вас.
     
    _________________________
  15. Adio

    Adio Elder - Старейшина

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18

    Code:
    <part1>data</part1>
    <part2>data</part2>
    <part3>data</part3>
    
    что тяжелого ?

    Вы не видете тегов ?

    Вопрос был в том как сгенерировать такие теги по возврастанию цифер, но проблема в том что эти цифры на оба концах тегов т.е

    т.е у нас к примеру есть тег


    Code:
    <part1>data</part1>
    нужно сгенирировать таких 10 штук

    что мы получаем

    Code:
    <part1>data</part1>
    <part2>data</part2>
    и так до десяти..
    
     
  16. qaz

    qaz Elder - Старейшина

    Joined:
    12 Jul 2010
    Messages:
    1,551
    Likes Received:
    173
    Reputations:
    75
    Adio, вас дейстаительно не понять. что вас не устраивает в коде который дал GRRRL Power ??

    код

    PHP:
    <?php  
     
    for($i 1$i <= 9; ++$i
      echo 
    "<part$i>data</part$i>\n"
    ?>
    результат

    <part1>data</part1>
    <part2>data</part2>
    <part3>data</part3>
    <part4>data</part4>
    <part5>data</part5>
    <part6>data</part6>
    <part7>data</part7>
    <part8>data</part8>
    <part9>data</part9>


    разве не то что вам нужно?
     
    #20556 qaz, 11 May 2012
    Last edited: 11 May 2012
  17. Adio

    Adio Elder - Старейшина

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18

    аа забылллллл вот

    Code:
    <good1>data</good1>
     <bad2>data</bad2>
     <ok3>data</ok3>
    
    Этот код изначально есть !
    Понял почему вы не поняли и где ошибся я..

    Нужно генерировать по три к примеру столбца т.е в генерации это будет выглядить так


    Code:
    <good1>data</good1>
     <bad2>data</bad2>
     <ok3>data</ok3>
    
    
    <good4>data</good4>
     <bad5>data</bad5>
     <ok6>data</ok6>
    
    
    <good7>data</good7>
     <bad8>data</bad8>
     <ok9>data</ok9>
    
     
  18. Rastamanka

    Rastamanka Elder - Старейшина

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    <?php

    $i = 1;
    $b = 0;

    while($i<=9) {

    $b++;

    if($b==1) echo "<good".$i.">data</good".$i.">\n";
    if($b==2) echo "<bad".$i.">data</bad".$i.">\n";
    if($b==3) {echo "<ok".$i.">data</ok".$i.">\n"; $b=0; }


    $i++;
    }

    ?>
     
    1 person likes this.
  19. Adio

    Adio Elder - Старейшина

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    Cпасибо !!!! буду дома проверю на коде - на примере работает !
     
  20. Skofield

    Skofield Elder - Старейшина

    Joined:
    27 Aug 2008
    Messages:
    960
    Likes Received:
    392
    Reputations:
    58
    Adio
    PHP:
    <?php
    for($i 1$j 2$c 3$c <= 9$i += 3$j += 3$c += 3) {
        echo 
    "<good".$i.">data</good".$i.">\r\n";
        echo 
    "<bad".$j.">data</bad".$j.">\r\n";
        echo 
    "<ok".$c.">data</ok".$c.">\r\n\r\n";
    }
    Adio, это просто ужасно! Даже если захочешь, то не получится структурировать речь подобным образом.
    Извини конечно, но я все же поинтересуюсь. Неужто и в реальной жизни ты так же выстраиваешь предложения?
    Или может ты из далеких стран и русский язык для тебя не родной?
     
Thread Status:
Not open for further replies.