Добрый день. Осваиваю php для автоматизации своих рутинных задач (уже три дня как, предполагаю, что в коде полный ужас), возник вопрос. Алгоритм такой - загрузить список ссылок из txt файла, получить список картинок из каждой ссылки, проверить наличие этих картинок на сервере, если их нет - выгрузить в текстовый файл ссылку на страницу, где с картинками проблема. Вот сейчас всё работает, но только по одной ссылке, как заменить значение одной ссылки на файл? При использовании $file = file('result.txt'); или $file=file_get_contents('result.txt'); лезут ошибки или ничего не происходит. Подозреваю, что упускаю что-то в логике работы. Код (Text): <?php $url = "http://***"; $file=file_get_contents($url); preg_match_all ('~(?<![^\\s"])http://[^\\s"]*?\\.jpe?g(?![^\\s"])~i',$file,$matches, PREG_SET_ORDER); foreach ($matches as $val) { // echo $val[0] . "<br>"; } foreach ($matches as $val) { $urlscr = $val; $Headers = @get_headers($urlscr[0]); // проверяем ответ от сервера с кодом 200 if(preg_match("|200|", $Headers[0])) { echo $urlscr[0] . " true <br>"; } else { echo $urlscr[0] . " not <br>"; file_put_contents("result1.txt", $url."\r\n", FILE_APPEND);} } ?>
определись, с сервера грузишь инфу или у себя где исполняются твои скрипты PHP: $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); $output = curl_exec($ch); curl_close($ch);
В идеале хочу, чтобы загружались из текстового файла на жестом диске. Мне, по сути, нужен только финальный результат со списком ссылок, поэтому всё исполняется на моем компе.
Проблема решена, всем спасибо. Я решила сделать через загрузку файлика всё-таки Код (Text): <?php set_time_limit(100000000000000000); // задаем лимит ожидания апача $list = file('result.txt'); // пишем название загружаемого файла $i = 0; while($i<count($list)){ $url = trim($list[$i]); $file=file_get_contents($url); preg_match_all ('~(?<![^\\s"])http://[^\\s"]*?\\.(jpe?g|gif|png)(?![^\\s"])~i',$file,$matches, PREG_SET_ORDER); foreach ($matches as $val) { //echo $val[0] . "<br>"; } $i++; foreach ($matches as $val) { $urlscr = $val; $Headers = @get_headers($urlscr[0]); // проверяем ответ от сервера с кодом 200 if(preg_match("|200|", $Headers[0])) { echo $urlscr[0] . " true <br>"; } else { echo $urlscr[0] . " not <br>"; // выводим на экран ссылки на картинки с комментарием file_put_contents("result1.txt", $url."\r\n", FILE_APPEND);} // сохраняем в файл ссылки на страницы без картинок } } $mass=array(); $mass=file('result1.txt'); // загоняем файл в массив, элементы массива - строки файла(вместе с переносом строки) $mass=array_unique($mass); // убираем дубликаты file_put_contents('result2.txt', implode('',$mass)); // записывам обратно в файл ?>
капец --- Добавлено --- Сорь за словарный запас, но код реальный ... Дайте лучше исходную инфу тхт файла, и результат какой бы хотели увидеть. Сам код перепишу.
Исходная инфа - список ссылок столбцом в текстовике (во вложении). И финальный результат - такой же список ссылок в текстовике, но уже на страницы, где картинки выдают 404. Понимаю ваше возмущение, я делаю только первые шаги, а до этого никогда не изучала программирование. Надеюсь, что через пару лет с таким же ужасом посмотрю на этот код
PHP: <?php error_reporting ( E_ALL ); define ( '__DIRECTORY__', dirname ( __FILE__ ) ); function Bytes ( $size ) { $filesizename = [ " Bytes", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB" ]; return $size ? round ( $size / pow ( 1024, ( $i = floor ( log ( $size, 1024 ) ) ) ), 2 ) . $filesizename[$i] : '0 Bytes'; } $t0 = microtime ( TRUE ); $inicio = memory_get_usage (); foreach ( file ( __DIRECTORY__ . '/links.txt' ) AS $URL ) { echo "<hr>{$URL}<hr>"; preg_match_all ( '/http(s|)?:\/\/\S+\.(png|jpe?g|gif)/i', file_get_contents ( $URL ), $AI ); array_unique ( $AI[0] ); $IM_TEXT = ''; foreach ( $AI[0] AS $IL ) { $PU = parse_url ( $IL ); $ch = curl_init (); curl_setopt ( $ch, CURLOPT_URL, "https://{$PU['host']}{$PU['path']}" ); curl_setopt ( $ch, CURLOPT_TIMEOUT, 2 ); curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 2 ); curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, TRUE ); $O = curl_exec ( $ch ); $H = curl_getinfo ( $ch, CURLINFO_HTTP_CODE ); curl_close ( $ch ); $IM_TEXT .= sprintf ( '<p>%s | %s</p>', "https://{$PU['host']}{$PU['path']}", ( $H == 200 ? 'TRUE' : "FALSE | $H" ) ); } echo $IM_TEXT; } } $fin = memory_get_usage (); echo '<p>complecte: ' . ( microtime ( TRUE ) - $t0 ) . "</p>"; echo '<p>memory: ' . bytes ( $fin - $inicio ) . "</p>"; --- Добавлено --- Нехватает вишенки
Большое спасибо! Подскажите, пожалуйста, может у меня лыжи не едут, но он всегда показывает результат FALSE, хотя картинки отдают 200. Мне не хватает навыков понять, как поправить конструкцию для корректного определения ответа на запрос о наличии файла. Можете подсказать или бросить в меня какой-нибудь ссылкой, желательно с примерами?
как ты определила ? --- Добавлено --- если заметила, что в курле я место обычного протокола прописываю https защищенный, чтобы не пересылал в пустую меня апач или что там стоит , с http на https. при перенаправлении код 301 шлет. Об этом в логе пишется когда FALSE флаг пишет скрипт --- Добавлено --- PHP: ( $H == 200 ? 'TRUE' : "FALSE | $H" ) тут дописать условие и всего делов
Действительно, я категорически это не учла. Некоторые хостинги просто неадекватно реагируют, например по такой ссылке https://4put.ru/pictures/max/118/365549.jpg сервер ничего не отдаст, хотя картинка есть, если убрать s Последний, я надеюсь, вопрос - как в эту конструкцию вписать file_put_contents("result1.txt", $URL."\r\n", FILE_APPEND); - т.е. чтобы сохранялись ссылки в файле только на страницы, где есть битые картинки. А то у меня получается сохранять все)) Я предполагаю, что нужно прописать if, но не понимаю, к чему аргументировать.
я логики не понимаю чем будет отличать от исходного txt, или вы имеете ввиду: в результат финиш тхт должны записываться ссылки изображений тех, кто прошел проверку --- Добавлено --- да, придется заменять
Логика такая - мне нужны страницы, на которых картинки битые. Я потом буду ходить по ним и ручками восстанавливать эти картинки. Т.е. логика обратная, нужны только страницы с битыми ссылками на картинки, а те, где картинки есть - не нужны.