Files
crm.clientright.ru/check_nextcloud_performance.php

178 lines
7.5 KiB
PHP
Raw Normal View History

<?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";