Битрикс 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;