Битрикс search_broken_images_in_logs.php собирает по логам данные о битых картинках и отдаёт csv

<?php // <pre> // Битрикс search_broken_images_in_logs.php собирает по логам данные о битых картинках и отдаёт csv /** * Возвращает массив строк, находящихся между двумя указанными строками. * * @param string $text Исходная строка * @param string $start Начальная строка * @param string $end Конечная строка * * @return array Массив строк, которые находятся между $start и $end */ function getStringsBetween($text, $start, $end) { $result = []; $list = explode($start, $text); array_shift($list); foreach ($list as $i => $item) { $tmp = explode($end, $item); $result[] = trim($tmp[0]); } return $result; } /** * Функция получает часть текста до или после разделителя в строке. * * @param string $string Исходная строка. * @param string $delimiter Разделитель. * @param bool $before Флаг, указывающий, нужно ли возвращать текст до ($before=true) или после ($before=false) разделителя. * @param bool $includeDelimiter Флаг, указывающий, нужно ли включать разделитель в результат. * * @return string Часть текста до или после разделителя. */ function getSubstringBeforeOrAfter($string, $delimiter = ' ', $before = true, $includeDelimiter = false) { $pos = $before ? strpos($string, $delimiter) : strrpos($string, $delimiter); if ($pos === false) return ''; if ($before) { $subString = substr($string, 0, $pos); if ($includeDelimiter) { $subString .= $delimiter; } } else { $subString = substr($string, $pos + ($includeDelimiter ? 0 : strlen($delimiter))); } return trim($subString); } unset($_GET, $_POST, $_COOKIE, $_FILES); $result = []; // 1 Достаём все битые картинки $log_img_url = $_SERVER['DOCUMENT_ROOT'].'/logs/img.php'; if (!file_exists($log_img_url)) { echo 'not img.php file'; exit(); } $log_img_text = file_get_contents($log_img_url); $list = getStringsBetween($log_img_text, '[name] => ', '[tmp_name]'); $list = array_unique($list); foreach ($list as $i => $item) { $result[] = [ 'image_name' => getSubstringBeforeOrAfter($item, '[size]'), 'image_description' => getSubstringBeforeOrAfter($item, '[description] => ', false) ]; } unset($log_img_url, $log_img_text, $list, $item, $i); //print_r(get_defined_vars()); exit(); //print_r($result); exit(); // 2 Достаём все файлы $xmls = glob($_SERVER['DOCUMENT_ROOT'].'/logs/*.xml'); foreach ($xmls as $url_i => $url) { $xml_text = file_get_contents($url); foreach ($result as $item_i => $item) { if (strpos($xml_text, $item['image_name']) === false) continue; $tmp = getSubstringBeforeOrAfter($xml_text, $item['image_name']); $tmp = getSubstringBeforeOrAfter($tmp, '<Наименование>', false); $result[$item_i]['product_name'] = $tmp = getSubstringBeforeOrAfter($tmp, '</Наименование>'); //print_r($result[$item_i]); exit(); } } header('Content-Type: text/csv'); header('Content-disposition: attachment;filename=broken_images_in_logs.csv'); $delimiter = ';'; //"\t" $result_text = implode($delimiter, ['N', 'tproduct_name', 'timage_description', 'timage_name'])."\n"; foreach ($result as $item_i => $item) $result_text .= implode($delimiter, [(int) $item_i + 1, $item['product_name'], $item['image_description'], $item['image_name']])."\n"; echo $result_text, PHP_EOL;