За последние 24 часа нас посетили 9157 программистов и 449 роботов. Сейчас ищут 169 программистов ...

Как загрузить данные из файла?

Тема в разделе "PHP для новичков", создана пользователем Marille, 23 май 2017.

  1. Marille

    Marille Новичок

    С нами с:
    23 май 2017
    Сообщения:
    7
    Симпатии:
    1
    Добрый день.

    Осваиваю php для автоматизации своих рутинных задач (уже три дня как, предполагаю, что в коде полный ужас), возник вопрос.

    Алгоритм такой - загрузить список ссылок из txt файла, получить список картинок из каждой ссылки, проверить наличие этих картинок на сервере, если их нет - выгрузить в текстовый файл ссылку на страницу, где с картинками проблема.

    Вот сейчас всё работает, но только по одной ссылке, как заменить значение одной ссылки на файл?
    При использовании $file = file('result.txt'); или $file=file_get_contents('result.txt'); лезут ошибки или ничего не происходит. Подозреваю, что упускаю что-то в логике работы.

    Код (Text):
    1. <?php
    2. $url = "http://***";
    3. $file=file_get_contents($url);
    4. preg_match_all ('~(?<![^\\s"])http://[^\\s"]*?\\.jpe?g(?![^\\s"])~i',$file,$matches, PREG_SET_ORDER);
    5.  
    6.  
    7.     foreach ($matches as $val) {
    8.         // echo $val[0] . "<br>";
    9.     }  
    10.  
    11.         foreach ($matches as $val) {  
    12.                 $urlscr = $val;
    13.                 $Headers = @get_headers($urlscr[0]);
    14.                 // проверяем ответ от сервера с кодом 200
    15.                 if(preg_match("|200|", $Headers[0])) {
    16.                     echo $urlscr[0] . " true <br>"; }
    17.                     else {
    18.                     echo $urlscr[0] . " not <br>";
    19.                     file_put_contents("result1.txt", $url."\r\n", FILE_APPEND);}
    20.         }
    21.  
    22. ?>
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    6.692
    Симпатии:
    1.059
    Адрес:
    Лень
    определись, с сервера грузишь инфу или у себя где исполняются твои скрипты
    PHP:
    1. $ch = curl_init();
    2.  
    3. curl_setopt($ch, CURLOPT_URL, $url);
    4. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    5. curl_setopt($ch, CURLOPT_HEADER, 0);
    6.  
    7. $output = curl_exec($ch);
    8.  
     
  3. Marille

    Marille Новичок

    С нами с:
    23 май 2017
    Сообщения:
    7
    Симпатии:
    1
    В идеале хочу, чтобы загружались из текстового файла на жестом диске. Мне, по сути, нужен только финальный результат со списком ссылок, поэтому всё исполняется на моем компе.
     
  4. Marille

    Marille Новичок

    С нами с:
    23 май 2017
    Сообщения:
    7
    Симпатии:
    1
    Проблема решена, всем спасибо. Я решила сделать через загрузку файлика всё-таки :)

    Код (Text):
    1. <?php
    2. set_time_limit(100000000000000000); // задаем лимит ожидания апача
    3. $list = file('result.txt'); // пишем название загружаемого файла
    4. $i = 0;
    5. while($i<count($list)){
    6. $url = trim($list[$i]);
    7.  
    8. $file=file_get_contents($url);
    9. preg_match_all ('~(?<![^\\s"])http://[^\\s"]*?\\.(jpe?g|gif|png)(?![^\\s"])~i',$file,$matches, PREG_SET_ORDER);
    10.  
    11.  
    12.     foreach ($matches as $val) {
    13.         //echo $val[0] . "<br>";
    14.     }  
    15.     $i++;
    16.  
    17.  
    18.         foreach ($matches as $val) {  
    19.                 $urlscr = $val;
    20.                 $Headers = @get_headers($urlscr[0]);
    21.                 // проверяем ответ от сервера с кодом 200
    22.                 if(preg_match("|200|", $Headers[0])) {
    23.                     echo $urlscr[0] . " true <br>"; }
    24.                     else {
    25.                     echo $urlscr[0] . " not <br>"; // выводим на экран ссылки на картинки с комментарием
    26.                     file_put_contents("result1.txt", $url."\r\n", FILE_APPEND);} // сохраняем в файл ссылки на страницы без картинок
    27.         }
    28. }
    29.  
    30. $mass=array();
    31. $mass=file('result1.txt');  // загоняем файл в массив, элементы массива - строки файла(вместе с переносом строки)
    32. $mass=array_unique($mass);  // убираем дубликаты
    33. file_put_contents('result2.txt', implode('',$mass)); // записывам обратно в файл
    34. ?>
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    6.692
    Симпатии:
    1.059
    Адрес:
    Лень
    капец
    [​IMG]
    --- Добавлено ---
    Сорь за словарный запас, но код реальный ...
    Дайте лучше исходную инфу тхт файла, и результат какой бы хотели увидеть. Сам код перепишу.
     
  6. Marille

    Marille Новичок

    С нами с:
    23 май 2017
    Сообщения:
    7
    Симпатии:
    1
    Исходная инфа - список ссылок столбцом в текстовике (во вложении).
    И финальный результат - такой же список ссылок в текстовике, но уже на страницы, где картинки выдают 404.

    Понимаю ваше возмущение, я делаю только первые шаги, а до этого никогда не изучала программирование. Надеюсь, что через пару лет с таким же ужасом посмотрю на этот код :)
     

    Вложения:

    • result.txt
      Размер файла:
      158 байт
      Просмотров:
      6
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    6.692
    Симпатии:
    1.059
    Адрес:
    Лень
    PHP:
    1. <?php
    2.  
    3. error_reporting ( E_ALL );
    4.  
    5. define ( '__DIRECTORY__', dirname ( __FILE__ ) );
    6.  
    7. function Bytes ( $size )
    8. {
    9.    $filesizename = [ " Bytes", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB" ];
    10.    return $size ? round ( $size / pow ( 1024, ( $i = floor ( log ( $size, 1024 ) ) ) ), 2 ) . $filesizename[$i] : '0 Bytes';
    11. }
    12.  
    13. $t0 = microtime ( TRUE );
    14. $inicio = memory_get_usage ();
    15.  
    16. foreach ( file ( __DIRECTORY__ . '/links.txt' ) AS $URL )
    17. {
    18.      echo "<hr>{$URL}<hr>";
    19.    
    20.      preg_match_all ( '/http(s|)?:\/\/\S+\.(png|jpe?g|gif)/i', file_get_contents ( $URL ), $AI );
    21.      array_unique ( $AI[0] );
    22.    
    23.      $IM_TEXT = '';
    24.    
    25.      foreach ( $AI[0] AS $IL )
    26.      {
    27.        $PU = parse_url ( $IL );
    28.      
    29.        $ch = curl_init ();
    30.  
    31.        curl_setopt ( $ch, CURLOPT_URL, "https://{$PU['host']}{$PU['path']}" );
    32.        curl_setopt ( $ch, CURLOPT_TIMEOUT, 2 );
    33.        curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 2 );
    34.        curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, TRUE );
    35.  
    36.        $O = curl_exec ( $ch );
    37.        $H = curl_getinfo ( $ch, CURLINFO_HTTP_CODE );
    38.  
    39.        curl_close ( $ch );
    40.      
    41.        $IM_TEXT .= sprintf ( '<p>%s | %s</p>', "https://{$PU['host']}{$PU['path']}", ( $H == 200 ? 'TRUE' : "FALSE | $H" ) );
    42.      }
    43.      echo $IM_TEXT;
    44.    }
    45. }
    46.  
    47. $fin = memory_get_usage ();  
    48. echo '<p>complecte: ' . ( microtime ( TRUE ) - $t0 ) . "</p>";
    49. echo '<p>memory: ' . bytes ( $fin - $inicio ) . "</p>";
    --- Добавлено ---
    Нехватает вишенки

    [​IMG]
     
    Marille и denis01 нравится это.
  8. Marille

    Marille Новичок

    С нами с:
    23 май 2017
    Сообщения:
    7
    Симпатии:
    1
    Большое спасибо! Подскажите, пожалуйста, может у меня лыжи не едут, но он всегда показывает результат FALSE, хотя картинки отдают 200. Мне не хватает навыков понять, как поправить конструкцию для корректного определения ответа на запрос о наличии файла. Можете подсказать или бросить в меня какой-нибудь ссылкой, желательно с примерами?
     
    denis01 нравится это.
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    6.692
    Симпатии:
    1.059
    Адрес:
    Лень
    как ты определила ?:)
    --- Добавлено ---
    если заметила, что в курле я место обычного протокола прописываю https защищенный, чтобы не пересылал в пустую меня апач или что там стоит , с http на https.
    при перенаправлении код 301 шлет. Об этом в логе пишется когда FALSE флаг пишет скрипт
    --- Добавлено ---
    PHP:
    1. ( $H == 200 ? 'TRUE' : "FALSE | $H" )
    тут дописать условие и всего делов
     
    Marille нравится это.
  10. Marille

    Marille Новичок

    С нами с:
    23 май 2017
    Сообщения:
    7
    Симпатии:
    1
    Действительно, я категорически это не учла. Некоторые хостинги просто неадекватно реагируют, например по такой ссылке https://4put.ru/pictures/max/118/365549.jpg сервер ничего не отдаст, хотя картинка есть, если убрать s

    Последний, я надеюсь, вопрос - как в эту конструкцию вписать file_put_contents("result1.txt", $URL."\r\n", FILE_APPEND); - т.е. чтобы сохранялись ссылки в файле только на страницы, где есть битые картинки. А то у меня получается сохранять все)) Я предполагаю, что нужно прописать if, но не понимаю, к чему аргументировать.
     
  11. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    6.692
    Симпатии:
    1.059
    Адрес:
    Лень
    я логики не понимаю чем будет отличать от исходного txt, или вы имеете ввиду:
    в результат финиш тхт должны записываться ссылки изображений тех, кто прошел проверку
    --- Добавлено ---
    да, придется заменять
     
  12. Marille

    Marille Новичок

    С нами с:
    23 май 2017
    Сообщения:
    7
    Симпатии:
    1
    Логика такая - мне нужны страницы, на которых картинки битые. Я потом буду ходить по ним и ручками восстанавливать эти картинки.
    Т.е. логика обратная, нужны только страницы с битыми ссылками на картинки, а те, где картинки есть - не нужны.