239 lines
8.9 KiB
PHP
239 lines
8.9 KiB
PHP
<?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();
|
||
?>
|