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

239 lines
8.9 KiB
PHP
Raw Normal View History

<?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();
?>