Files
crm.clientright.ru/check_nextcloud_performance.php
Fedor 01c4fe80b5 chore: snapshot current working tree changes
Save all currently accumulated repository changes as a backup snapshot for Gitea so no local work is lost.
2026-03-26 14:19:01 +03:00

178 lines
7.5 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
/**
* Проверка производительности Nextcloud при открытии папок
*/
error_reporting(E_ALL);
ini_set('display_errors', 1);
echo "=== ПРОВЕРКА ПРОИЗВОДИТЕЛЬНОСТИ NEXTCLOUD ===\n\n";
// 1. Проверка настроек external storage
echo "1⃣ НАСТРОЙКИ EXTERNAL STORAGE\n";
echo "────────────────────────────────────────────────────────────────────────────\n";
$nextcloudUrl = 'https://office.clientright.ru:8443';
$username = 'admin';
$password = 'CRM_Nextcloud_Pass_2025_Secure!'; // Нужно проверить правильный пароль
// Проверяем настройки через OCS API
$ocsUrl = $nextcloudUrl . '/ocs/v2.php/apps/files_external/api/v1/mounts';
$ch = curl_init($ocsUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'OCS-APIRequest: true',
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode == 200) {
$data = json_decode($response, true);
if (isset($data['ocs']['data'])) {
foreach ($data['ocs']['data'] as $mount) {
if (strpos($mount['mount_point'], 'crm') !== false) {
echo " 📁 Mount: {$mount['mount_point']}\n";
echo " Backend: {$mount['backend']}\n";
echo " Options: " . json_encode($mount['options'], JSON_PRETTY_PRINT) . "\n";
echo "\n";
}
}
}
} else {
echo " ⚠️ Не удалось получить настройки (HTTP $httpCode)\n";
}
// 2. Тест скорости PROPFIND запроса
echo "2ТЕСТ СКОРОСТИ PROPFIND ЗАПРОСА\n";
echo "────────────────────────────────────────────────────────────────────────────\n";
$testPath = '/crm/crm2/CRM_Active_Files/Documents/Project';
$webdavUrl = $nextcloudUrl . '/remote.php/dav/files/' . $username . $testPath;
echo " Тестируем путь: $testPath\n";
echo " URL: $webdavUrl\n\n";
$xmlRequest = '<?xml version="1.0"?>
<d:propfind xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns">
<d:prop>
<d:displayname/>
<d:getcontentlength/>
<d:getlastmodified/>
<oc:fileid/>
</d:prop>
</d:propfind>';
$startTime = microtime(true);
$ch = curl_init($webdavUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PROPFIND');
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlRequest);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Depth: 1',
'Content-Type: application/xml'
]);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$totalTime = curl_getinfo($ch, CURLOPT_TOTAL_TIME);
$connectTime = curl_getinfo($ch, CURLINFO_CONNECT_TIME);
$sizeDownload = curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD);
curl_close($ch);
$endTime = microtime(true);
$duration = ($endTime - $startTime) * 1000; // в миллисекундах
echo " ⏱️ Время выполнения: " . round($duration, 2) . " мс\n";
echo " 📊 HTTP код: $httpCode\n";
echo " 📦 Размер ответа: " . round($sizeDownload / 1024, 2) . " KB\n";
echo " 🔌 Время подключения: " . round($connectTime * 1000, 2) . " мс\n";
if ($httpCode == 207) {
// Парсим XML ответ
$xml = simplexml_load_string($response);
if ($xml) {
$namespaces = $xml->getNamespaces(true);
$count = 0;
foreach ($xml->xpath('//d:response') as $response) {
$count++;
}
echo " 📁 Найдено элементов: $count\n";
if ($duration > 5000) {
echo "\n ⚠️ ВНИМАНИЕ: Запрос выполняется более 5 секунд!\n";
echo " Это может быть причиной медленной загрузки.\n";
} else if ($duration > 2000) {
echo "\n ⚠️ Запрос выполняется более 2 секунд - можно оптимизировать\n";
} else {
echo "\n ✅ Скорость нормальная\n";
}
}
} else {
echo " ❌ Ошибка запроса (HTTP $httpCode)\n";
if ($response) {
echo " Ответ: " . substr($response, 0, 200) . "\n";
}
}
// 3. Проверка Redis индекса
echo "\n3⃣ ПРОВЕРКА REDIS ИНДЕКСА\n";
echo "────────────────────────────────────────────────────────────────────────────\n";
try {
$redis = new Redis();
$redis->connect('147.45.146.17', 6379);
$redis->auth('CRM_Redis_Pass_2025_Secure!');
// Проверяем наличие индекса для тестового пути
$testRedisKey = 'crm:nc:fileid:' . $testPath;
$indexed = $redis->exists($testRedisKey);
if ($indexed) {
echo " ✅ Путь проиндексирован в Redis\n";
$data = json_decode($redis->get($testRedisKey), true);
if ($data) {
echo " fileId: {$data['fileId']}\n";
}
} else {
echo " ⚠️ Путь НЕ проиндексирован в Redis\n";
echo " Это может замедлять загрузку\n";
}
// Проверяем количество записей в индексе
$keys = $redis->keys('crm:nc:fileid:' . $testPath . '*');
echo " 📊 Записей для Project: " . count($keys) . "\n";
} catch (Exception $e) {
echo " ❌ Ошибка подключения к Redis: " . $e->getMessage() . "\n";
}
// 4. Рекомендации
echo "\n4⃣ РЕКОМЕНДАЦИИ\n";
echo "────────────────────────────────────────────────────────────────────────────\n";
if ($duration > 2000) {
echo " 💡 ПРОБЛЕМА: Медленные PROPFIND запросы\n\n";
echo " Решения:\n";
echo " 1. Использовать Redis индекс для получения fileId\n";
echo " 2. Кешировать результаты PROPFIND запросов\n";
echo " 3. Использовать прямой доступ к S3 вместо Nextcloud для просмотра\n";
echo " 4. Оптимизировать настройки Nextcloud external storage\n";
} else {
echo " ✅ Производительность в норме\n";
echo " 💡 Если все равно медленно, проблема может быть в:\n";
echo " - Количестве файлов в папке\n";
echo " - Размере XML ответа\n";
echo " - Задержке сети до S3\n";
}
echo "\n=== Проверка завершена ===\n";