сохранить результат работы

Тема в разделе "PHP", создана пользователем zxxx, 21 май 2011.

Модераторы: latteo
  1. zxxx

    zxxx Постоялец

    Регистр.:
    9 окт 2009
    Сообщения:
    148
    Симпатии:
    4
    есть скрипт для многопоточной скачки страниц

    PHP:
     for ($i 1$i 10$i++) {
        
    $urls[$i] = "http://ru.wikipedia.org/wiki/$i";


    $cmh curl_multi_init();
     

    $tasks = array();

    foreach (
    $urls as $url) {


        
    $ch curl_init('http://'.$url);

        
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);

        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);

        
    curl_setopt($chCURLOPT_HEADER0);

        
    curl_setopt($chCURLOPT_CONNECTTIMEOUT10);

        
    curl_setopt($chCURLOPT_TIMEOUT10);

        
    $tasks[$url] = $ch;

        
    curl_multi_add_handle($cmh$ch);
    }
     

    $active null;

    do {
        
    $mrc curl_multi_exec($cmh$active);
    }
    while (
    $mrc == CURLM_CALL_MULTI_PERFORM);


    while (
    $active && ($mrc == CURLM_OK)) {

        if (
    curl_multi_select($cmh) != -1) {

            do {
                
    $mrc curl_multi_exec($cmh$active);

                
    $info curl_multi_info_read($cmh);

                if (
    $info['msg'] == CURLMSG_DONE) {
                    
    $ch $info['handle'];

                    
    $url array_search($ch$tasks);


                    
    $tasks[$url] = curl_multi_getcontent($ch);


                    
    curl_multi_remove_handle($cmh$ch);

                    
    curl_close($ch);

                }
            }
            while (
    $mrc == CURLM_CALL_MULTI_PERFORM);
        }
    }

    curl_multi_close($cmh);
    нужно сохранить результат работы в текстовый файл
    каждый результат содержится в $tasks[$url]
    пробовал после него функцию записи в файл, но возникла проблема с именем файла
     
  2. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    200
    Симпатии:
    55
    А может быть стоило привести код где проблема записи в файл а не то что работает?
     
    zxxx нравится это.
  3. zxxx

    zxxx Постоялец

    Регистр.:
    9 окт 2009
    Сообщения:
    148
    Симпатии:
    4
    PHP:
    for ($i 1$i 10$i++) {
        
    $urls[$i] = "http://ru.wikipedia.org/wiki/$i";


    $cmh curl_multi_init();
     

    $tasks = array();

    foreach (
    $urls as $url) {


        
    $ch curl_init('http://'.$url);

        
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);

        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);

        
    curl_setopt($chCURLOPT_HEADER0);

        
    curl_setopt($chCURLOPT_CONNECTTIMEOUT10);

        
    curl_setopt($chCURLOPT_TIMEOUT10);

        
    $tasks[$url] = $ch;

        
    curl_multi_add_handle($cmh$ch);
    }
     

    $active null;

    do {
        
    $mrc curl_multi_exec($cmh$active);
    }
    while (
    $mrc == CURLM_CALL_MULTI_PERFORM);


    while (
    $active && ($mrc == CURLM_OK)) {

        if (
    curl_multi_select($cmh) != -1) {

            do {
                
    $mrc curl_multi_exec($cmh$active);

                
    $info curl_multi_info_read($cmh);

                if (
    $info['msg'] == CURLMSG_DONE) {
                    
    $ch $info['handle'];

                    
    $url array_search($ch$tasks);


                    
    $tasks[$url] = curl_multi_getcontent($ch);

    $fp fopen("app//$url.txt""a");
    fwrite($fp,"\r\n$tasks[$url]");
    fclose($fp);

                    
    curl_multi_remove_handle($cmh$ch);

                    
    curl_close($ch);

                }
            }
            while (
    $mrc == CURLM_CALL_MULTI_PERFORM);
        }
    }

    curl_multi_close($cmh);  

    пробовал так, все получается, но только в имени содержаться недопустимые символы / ? и т.п. Проповал их убирать preg_replace, но ничего не вышло

    здесь пояснение к скрипту http://job-interview.ru/articles/post/67
     
  4. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    200
    Симпатии:
    55
    Сейчас так:
    PHP:
    .....
    for (
    $i 1$i 10$i++) { 
        
    $urls[$i] = "http:[B]//[/B]ru.wikipedia.org[B]/[/B]wiki[B]/[/B]$i"
    }
    .....
    foreach (
    $urls as $url) {
      .....
      
    $fp fopen("app//$url.txt""a");  
      ...... 
    }
    .....
    Совершенно верно замечено что fopen("app//$url.txt", "a"); приведет к абракадабре в имени файла, в частности слеши недопустимы. Просто используйте например директорию для сохранения по имени домена, а файлы по $i.html.
    Или/и замените недопустимые символы
    PHP:
    ...
    $url=str_replace(array('/'),array('_'),$url); //тут можно список недопустимух символов продолжить при необходимости
    ...
    $fp fopen("app//$url.txt""a");  
     
    zxxx нравится это.
  5. zxxx

    zxxx Постоялец

    Регистр.:
    9 окт 2009
    Сообщения:
    148
    Симпатии:
    4
    Так не получается, вместо 10 результатов создает 2 пустых файла
     
  6. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.036
    Симпатии:
    699
    попробуй так
    PHP:
    $url=str_replace(array('/',':','.'),'_',$url);
    а 2 слеша то зачем ХЗ
    PHP:
    $fp fopen("app/".$url.".txt""a");
    да и закрытие открытие файлов я бы из цикла убрал оно вам надо?
     
  7. zxxx

    zxxx Постоялец

    Регистр.:
    9 окт 2009
    Сообщения:
    148
    Симпатии:
    4
    PHP:
    $url=preg_replace(array('/',':'),'_',$url);  
    с этим не получается, на выходе получается 2 файла пустых
     
  8. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.036
    Симпатии:
    699
    вот так
    PHP:
    <?php
    for ($i 1$i 10$i++) {
        
    $urls[$i] = "http://ru.wikipedia.org/wiki/$i";


    $cmh curl_multi_init();
     

    $tasks = array();

    foreach (
    $urls as $url) {


        
    $ch curl_init($url);

        
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);

        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);

        
    curl_setopt($chCURLOPT_HEADER0);

        
    curl_setopt($chCURLOPT_CONNECTTIMEOUT10);

        
    curl_setopt($chCURLOPT_TIMEOUT10);

        
    $tasks[$url] = $ch;

        
    curl_multi_add_handle($cmh$ch);
    }
     

    $active null;

    do {
        
    $mrc curl_multi_exec($cmh$active);
    }
    while (
    $mrc == CURLM_CALL_MULTI_PERFORM);


    while (
    $active && ($mrc == CURLM_OK)) {

        if (
    curl_multi_select($cmh) != -1) {

            do {
                
    $mrc curl_multi_exec($cmh$active);

                
    $info curl_multi_info_read($cmh);

                if (
    $info['msg'] == CURLMSG_DONE) {
                    
    $ch $info['handle'];

                    
    $url array_search($ch$tasks);


                    
    $tasks[$url] = curl_multi_getcontent($ch);
    $name=str_replace(array('/',':','.'),'_',$url);
    $fp fopen("app/".$name.".txt""w");
    fwrite($fp,$tasks[$url]."\n");
    fclose($fp);

                    
    curl_multi_remove_handle($cmh$ch);

                    
    curl_close($ch);

                }
            }
            while (
    $mrc == CURLM_CALL_MULTI_PERFORM);
        }
    }

    curl_multi_close($cmh); 
     
    zxxx нравится это.
  9. zxxx

    zxxx Постоялец

    Регистр.:
    9 окт 2009
    Сообщения:
    148
    Симпатии:
    4
    незнаю как, но заработало :) Я тоже делал примерно так

    PHP:
    $url=str_replace(array('/',':','.'),'_',$url);
    $fp fopen("app//$url.txt""a");
    fwrite($fp,$tasks[$url]);
    fclose($fp);
    но у меня глюк выходил, огромное спасибо
     
  10. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.036
    Симпатии:
    699
    вот смотрите
    PHP:
    $ch curl_init('http://'.$url);
    что вы курлу скармливаете в итоге
    ну и здесь если
    делать так как у вас
    PHP:
    $url=str_replace(array('/',':','.'),'_',$url); 
    $fp fopen("app//$url.txt""a"); 
    fwrite($fp,$tasks[$url]); 
    fclose($fp); 
    у вас просто пустые файлы как минимум будут вы же заменяете значение $url а потом пытаетесь по этому новому значению чтото достать из массива
     
    zxxx нравится это.