148 lines
6.0 KiB
PHP
148 lines
6.0 KiB
PHP
|
|
<?php
|
|||
|
|
/**
|
|||
|
|
* Fast search for broken files - optimized version
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
$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\n";
|
|||
|
|
|
|||
|
|
// 1. Считаем общее количество проблемных файлов
|
|||
|
|
echo "1. Подсчет проблемных файлов...\n";
|
|||
|
|
|
|||
|
|
$count_queries = [
|
|||
|
|
'truncated' => "SELECT COUNT(*) as count FROM vtiger_notes WHERE filelocationtype = 'E' AND filename LIKE '%s3.twcstorage.ru%' AND filename LIKE '%D0%B'",
|
|||
|
|
'realfile' => "SELECT COUNT(*) as count FROM vtiger_notes WHERE filelocationtype = 'E' AND filename LIKE '%s3.twcstorage.ru%' AND filename LIKE '%#realfile%'",
|
|||
|
|
'russian' => "SELECT COUNT(*) as count FROM vtiger_notes WHERE filelocationtype = 'E' AND filename LIKE '%s3.twcstorage.ru%' AND filename REGEXP '[А-Яа-я]'"
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
$counts = [];
|
|||
|
|
foreach ($count_queries as $type => $query) {
|
|||
|
|
$result = $mysqli->query($query);
|
|||
|
|
if ($result) {
|
|||
|
|
$row = $result->fetch_assoc();
|
|||
|
|
$counts[$type] = $row['count'];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
echo "Файлов с обрезанными ссылками: " . ($counts['truncated'] ?? 0) . "\n";
|
|||
|
|
echo "Файлов с #realfile: " . ($counts['realfile'] ?? 0) . "\n";
|
|||
|
|
echo "Файлов с русскими символами: " . ($counts['russian'] ?? 0) . "\n";
|
|||
|
|
|
|||
|
|
// 2. Получаем примеры каждого типа проблем
|
|||
|
|
echo "\n2. Примеры проблемных файлов...\n";
|
|||
|
|
|
|||
|
|
// Обрезанные ссылки
|
|||
|
|
if ($counts['truncated'] > 0) {
|
|||
|
|
echo "\n--- Обрезанные ссылки ---\n";
|
|||
|
|
$query = "SELECT notesid, title, LEFT(filename, 100) as filename_short, s3_key
|
|||
|
|
FROM vtiger_notes
|
|||
|
|
WHERE filelocationtype = 'E'
|
|||
|
|
AND filename LIKE '%s3.twcstorage.ru%'
|
|||
|
|
AND filename LIKE '%D0%B'
|
|||
|
|
ORDER BY notesid DESC
|
|||
|
|
LIMIT 5";
|
|||
|
|
|
|||
|
|
$result = $mysqli->query($query);
|
|||
|
|
if ($result) {
|
|||
|
|
while ($row = $result->fetch_assoc()) {
|
|||
|
|
echo "ID: {$row['notesid']} - {$row['title']}\n";
|
|||
|
|
echo "URL: {$row['filename_short']}...\n";
|
|||
|
|
echo "S3 Key: " . ($row['s3_key'] ?: 'NULL') . "\n---\n";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Файлы с #realfile
|
|||
|
|
if ($counts['realfile'] > 0) {
|
|||
|
|
echo "\n--- Файлы с #realfile ---\n";
|
|||
|
|
$query = "SELECT notesid, title, LEFT(filename, 100) as filename_short, s3_key
|
|||
|
|
FROM vtiger_notes
|
|||
|
|
WHERE filelocationtype = 'E'
|
|||
|
|
AND filename LIKE '%s3.twcstorage.ru%'
|
|||
|
|
AND filename LIKE '%#realfile%'
|
|||
|
|
ORDER BY notesid DESC
|
|||
|
|
LIMIT 5";
|
|||
|
|
|
|||
|
|
$result = $mysqli->query($query);
|
|||
|
|
if ($result) {
|
|||
|
|
while ($row = $result->fetch_assoc()) {
|
|||
|
|
echo "ID: {$row['notesid']} - {$row['title']}\n";
|
|||
|
|
echo "URL: {$row['filename_short']}...\n";
|
|||
|
|
echo "S3 Key: " . ($row['s3_key'] ?: 'NULL') . "\n---\n";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Файлы с русскими символами
|
|||
|
|
if ($counts['russian'] > 0) {
|
|||
|
|
echo "\n--- Файлы с русскими символами ---\n";
|
|||
|
|
$query = "SELECT notesid, title, LEFT(filename, 100) as filename_short, s3_key
|
|||
|
|
FROM vtiger_notes
|
|||
|
|
WHERE filelocationtype = 'E'
|
|||
|
|
AND filename LIKE '%s3.twcstorage.ru%'
|
|||
|
|
AND filename REGEXP '[А-Яа-я]'
|
|||
|
|
ORDER BY notesid DESC
|
|||
|
|
LIMIT 5";
|
|||
|
|
|
|||
|
|
$result = $mysqli->query($query);
|
|||
|
|
if ($result) {
|
|||
|
|
while ($row = $result->fetch_assoc()) {
|
|||
|
|
echo "ID: {$row['notesid']} - {$row['title']}\n";
|
|||
|
|
echo "URL: {$row['filename_short']}...\n";
|
|||
|
|
echo "S3 Key: " . ($row['s3_key'] ?: 'NULL') . "\n---\n";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 3. Проверяем доступность нескольких файлов каждого типа
|
|||
|
|
echo "\n3. Проверка доступности (тест 10 файлов каждого типа)...\n";
|
|||
|
|
|
|||
|
|
$test_queries = [
|
|||
|
|
'realfile' => "SELECT notesid, title, filename, s3_key, s3_bucket FROM vtiger_notes WHERE filelocationtype = 'E' AND filename LIKE '%s3.twcstorage.ru%' AND filename LIKE '%#realfile%' ORDER BY notesid DESC LIMIT 10",
|
|||
|
|
'russian' => "SELECT notesid, title, filename, s3_key, s3_bucket FROM vtiger_notes WHERE filelocationtype = 'E' AND filename LIKE '%s3.twcstorage.ru%' AND filename REGEXP '[А-Яа-я]' ORDER BY notesid DESC LIMIT 10"
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
$broken_count = 0;
|
|||
|
|
$total_tested = 0;
|
|||
|
|
|
|||
|
|
foreach ($test_queries as $type => $query) {
|
|||
|
|
echo "\nТестирование типа: $type\n";
|
|||
|
|
$result = $mysqli->query($query);
|
|||
|
|
if ($result) {
|
|||
|
|
while ($row = $result->fetch_assoc()) {
|
|||
|
|
$total_tested++;
|
|||
|
|
$headers = @get_headers($row['filename'], 1);
|
|||
|
|
if (!$headers || strpos($headers[0], '200') === false) {
|
|||
|
|
$broken_count++;
|
|||
|
|
echo "❌ ID: {$row['notesid']} - {$row['title']}\n";
|
|||
|
|
} else {
|
|||
|
|
echo "✅ ID: {$row['notesid']} - {$row['title']}\n";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
echo "\n=== ИТОГОВАЯ СТАТИСТИКА ===\n";
|
|||
|
|
echo "Всего файлов с #realfile: " . ($counts['realfile'] ?? 0) . "\n";
|
|||
|
|
echo "Всего файлов с русскими символами: " . ($counts['russian'] ?? 0) . "\n";
|
|||
|
|
echo "Протестировано файлов: $total_tested\n";
|
|||
|
|
echo "Битых файлов из тестовых: $broken_count\n";
|
|||
|
|
|
|||
|
|
if ($broken_count > 0) {
|
|||
|
|
$estimated_broken = round(($broken_count / $total_tested) * ($counts['realfile'] + $counts['russian']));
|
|||
|
|
echo "Примерное количество битых файлов в системе: $estimated_broken\n";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$mysqli->close();
|
|||
|
|
echo "\n=== Быстрый поиск завершен ===\n";
|
|||
|
|
?>
|