Files
crm.clientright.ru/crm_extensions/file_storage/analyze_comment_files.php

239 lines
8.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Analyze Comment Files Script
*
* Этот скрипт анализирует файлы, прикрепленные к комментариям в CRM
* и проверяет, охвачены ли они нашей S3 миграцией
*/
ini_set('memory_limit', '512M');
set_time_limit(0);
date_default_timezone_set('Europe/Moscow');
$ROOT = '/var/www/fastuser/data/www/crm.clientright.ru/';
require_once $ROOT . 'config.inc.php';
// Database connection
$mysqli = new mysqli($dbconfig['db_server'], $dbconfig['db_username'], $dbconfig['db_password'], $dbconfig['db_name']);
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
$mysqli->set_charset("utf8");
echo "=== АНАЛИЗ ФАЙЛОВ В КОММЕНТАРИЯХ ===\n";
echo "Дата отчета: " . date('Y-m-d H:i:s') . "\n\n";
// 1. Проверяем общее количество комментариев
$query = "SELECT COUNT(*) as total_comments FROM vtiger_modcomments";
$result = $mysqli->query($query);
$totalComments = $result->fetch_assoc()['total_comments'];
echo "Всего комментариев: $totalComments\n\n";
// 2. Ищем комментарии с файлами (проверяем поле commentcontent на наличие файлов)
$query = "SELECT modcommentsid, commentcontent
FROM vtiger_modcomments
WHERE commentcontent LIKE '%<img%'
OR commentcontent LIKE '%<a%href%'
OR commentcontent LIKE '%file%'
ORDER BY modcommentsid DESC
LIMIT 100";
$result = $mysqli->query($query);
if (!$result) {
die("Query failed: " . $mysqli->error);
}
$commentsWithFiles = [];
while ($row = $result->fetch_assoc()) {
$commentsWithFiles[] = $row;
}
echo "Комментариев с потенциальными файлами (первые 100): " . count($commentsWithFiles) . "\n\n";
// 3. Проверяем таблицу vtiger_attachments для комментариев
$query = "SELECT COUNT(*) as total_attachments
FROM vtiger_attachments a
INNER JOIN vtiger_seattachmentsrel s ON s.attachmentsid = a.attachmentsid
INNER JOIN vtiger_modcomments m ON m.modcommentsid = s.crmid";
$result = $mysqli->query($query);
if (!$result) {
die("Query failed: " . $mysqli->error);
}
$totalCommentAttachments = $result->fetch_assoc()['total_attachments'];
echo "Файлов прикрепленных к комментариям: $totalCommentAttachments\n\n";
// 4. Детальный анализ файлов в комментариях
if ($totalCommentAttachments > 0) {
$query = "SELECT a.attachmentsid, a.name, a.path, a.storedname, a.type,
m.modcommentsid, m.commentcontent,
s.crmid
FROM vtiger_attachments a
INNER JOIN vtiger_seattachmentsrel s ON s.attachmentsid = a.attachmentsid
INNER JOIN vtiger_modcomments m ON m.modcommentsid = s.crmid
ORDER BY m.modcommentsid DESC
LIMIT 50";
$result = $mysqli->query($query);
if (!$result) {
die("Query failed: " . $mysqli->error);
}
$commentFiles = [];
while ($row = $result->fetch_assoc()) {
$commentFiles[] = $row;
}
echo "ДЕТАЛЬНЫЙ АНАЛИЗ ФАЙЛОВ В КОММЕНТАРИЯХ (первые 50):\n";
echo str_repeat("-", 90) . "\n";
printf("%-12s %-15s %-30s %-20s %-10s\n",
"Comment ID", "Attachment ID", "Filename", "Path", "Type");
echo str_repeat("-", 90) . "\n";
foreach ($commentFiles as $file) {
printf("%-12s %-15s %-30s %-20s %-10s\n",
$file['modcommentsid'],
$file['attachmentsid'],
substr($file['name'], 0, 27) . (strlen($file['name']) > 27 ? '...' : ''),
substr($file['path'], 0, 17) . (strlen($file['path']) > 17 ? '...' : ''),
substr($file['type'], 0, 9) . (strlen($file['type']) > 9 ? '...' : '')
);
}
echo "\n";
// 5. Проверяем, есть ли эти файлы в vtiger_notes (охвачены ли миграцией)
echo "ПРОВЕРКА ОХВАТА МИГРАЦИЕЙ:\n";
$migratedCount = 0;
$notMigratedCount = 0;
$notMigratedFiles = [];
foreach ($commentFiles as $file) {
$checkQuery = "SELECT COUNT(*) as count FROM vtiger_notes WHERE notesid = ?";
$checkStmt = $mysqli->prepare($checkQuery);
$checkStmt->bind_param('i', $file['attachmentsid']);
$checkStmt->execute();
$result = $checkStmt->get_result();
$count = $result->fetch_assoc()['count'];
$checkStmt->close();
if ($count > 0) {
$migratedCount++;
} else {
$notMigratedCount++;
$notMigratedFiles[] = $file;
}
}
echo "Охвачено миграцией: $migratedCount\n";
echo "НЕ охвачено миграцией: $notMigratedCount\n\n";
if ($notMigratedCount > 0) {
echo "ФАЙЛЫ В КОММЕНТАРИЯХ, НЕ ОХВАЧЕННЫЕ МИГРАЦИЕЙ:\n";
echo str_repeat("-", 90) . "\n";
printf("%-12s %-15s %-30s %-20s %-10s\n",
"Comment ID", "Attachment ID", "Filename", "Path", "Type");
echo str_repeat("-", 90) . "\n";
foreach ($notMigratedFiles as $file) {
printf("%-12s %-15s %-30s %-20s %-10s\n",
$file['modcommentsid'],
$file['attachmentsid'],
substr($file['name'], 0, 27) . (strlen($file['name']) > 27 ? '...' : ''),
substr($file['path'], 0, 17) . (strlen($file['path']) > 17 ? '...' : ''),
substr($file['type'], 0, 9) . (strlen($file['type']) > 9 ? '...' : '')
);
}
echo "\n";
}
}
// 6. Проверяем физическое существование файлов
echo "ПРОВЕРКА ФИЗИЧЕСКОГО СУЩЕСТВОВАНИЯ ФАЙЛОВ:\n";
$storageDir = $ROOT;
$existingFiles = 0;
$missingFiles = 0;
if (isset($commentFiles)) {
foreach ($commentFiles as $file) {
$filePath = $storageDir . $file['path'] . $file['attachmentsid'] . '_' . $file['storedname'];
if (file_exists($filePath) && is_readable($filePath)) {
$existingFiles++;
} else {
$missingFiles++;
}
}
echo "Физически существуют: $existingFiles\n";
echo "Физически отсутствуют: $missingFiles\n\n";
}
// 7. Анализ по типам файлов
echo "АНАЛИЗ ПО ТИПАМ ФАЙЛОВ:\n";
if (isset($commentFiles)) {
$fileTypes = [];
foreach ($commentFiles as $file) {
$extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
$fileTypes[$extension] = ($fileTypes[$extension] ?? 0) + 1;
}
arsort($fileTypes);
foreach ($fileTypes as $type => $count) {
echo " $type: $count файлов\n";
}
echo "\n";
}
// 8. Анализ по физическим размерам файлов
echo "АНАЛИЗ ПО ФИЗИЧЕСКИМ РАЗМЕРАМ ФАЙЛОВ:\n";
if (isset($commentFiles)) {
$sizeRanges = [
'0-1KB' => 0,
'1-10KB' => 0,
'10-100KB' => 0,
'100KB-1MB' => 0,
'1MB-10MB' => 0,
'10MB+' => 0
];
foreach ($commentFiles as $file) {
$filePath = $storageDir . $file['path'] . $file['attachmentsid'] . '_' . $file['storedname'];
if (file_exists($filePath) && is_readable($filePath)) {
$size = filesize($filePath);
if ($size < 1024) {
$sizeRanges['0-1KB']++;
} elseif ($size < 10240) {
$sizeRanges['1-10KB']++;
} elseif ($size < 102400) {
$sizeRanges['10-100KB']++;
} elseif ($size < 1048576) {
$sizeRanges['100KB-1MB']++;
} elseif ($size < 10485760) {
$sizeRanges['1MB-10MB']++;
} else {
$sizeRanges['10MB+']++;
}
}
}
foreach ($sizeRanges as $range => $count) {
echo " $range: $count файлов\n";
}
echo "\n";
}
// 9. Рекомендации
echo "РЕКОМЕНДАЦИИ:\n";
echo "1. Файлы в комментариях НЕ охвачены нашей текущей миграцией\n";
echo "2. Они хранятся в vtiger_attachments, но не в vtiger_notes\n";
echo "3. Нужно создать отдельный скрипт для миграции файлов комментариев\n";
echo "4. Или расширить существующий скрипт для работы с vtiger_attachments\n\n";
echo "СЛЕДУЮЩИЕ ШАГИ:\n";
echo "- Создать скрипт migrate_comment_files_to_s3.php\n";
echo "- Обновить n8n скрипт для работы с комментариями\n";
echo "- Протестировать миграцию файлов комментариев\n";
$mysqli->close();
?>