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