Save all currently accumulated repository changes as a backup snapshot for Gitea so no local work is lost.
178 lines
7.5 KiB
PHP
178 lines
7.5 KiB
PHP
<?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";
|