Files
crm.clientright.ru/analyze_nextcloud_web_vs_api.php

194 lines
9.8 KiB
PHP
Raw Normal View History

<?php
/**
* Анализ: почему веб-интерфейс Nextcloud медленный, а API (n8n) быстрый
*/
error_reporting(E_ALL);
ini_set('display_errors', 1);
echo "════════════════════════════════════════════════════════════════════════════════\n";
echo "🔍 АНАЛИЗ: ВЕБ-ИНТЕРФЕЙС VS API (n8n)\n";
echo "════════════════════════════════════════════════════════════════════════════════\n\n";
$nextcloudUrl = 'https://office.clientright.ru:8443';
$username = 'admin';
$password = 'office'; // Нужно проверить правильный пароль
// 1. Что использует n8n (WebDAV PROPFIND)
echo "1⃣ ЧТО ИСПОЛЬЗУЕТ n8n (БЫСТРО):\n";
echo "────────────────────────────────────────────────────────────────────────────\n";
echo " API: WebDAV PROPFIND\n";
echo " URL: /remote.php/dav/files/{username}/{path}\n";
echo " Метод: PROPFIND\n";
echo " Depth: 1 (только прямые дети)\n";
echo " Формат: XML\n\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);
$duration = (microtime(true) - $startTime) * 1000;
curl_close($ch);
echo " ⏱️ Время выполнения: " . round($duration, 2) . " мс\n";
echo " 📊 HTTP код: $httpCode\n";
if ($httpCode == 207) {
$xml = simplexml_load_string($response);
if ($xml) {
$count = 0;
foreach ($xml->xpath('//d:response') as $response) {
$count++;
}
echo " 📁 Найдено элементов: $count\n";
}
echo " ✅ Это то, что использует n8n - работает быстро!\n";
} else {
echo " ⚠️ Ошибка (возможно нужен другой пароль)\n";
}
// 2. Что использует веб-интерфейс Nextcloud
echo "\n2⃣ ЧТО ИСПОЛЬЗУЕТ ВЕБ-ИНТЕРФЕЙС (МЕДЛЕННО):\n";
echo "────────────────────────────────────────────────────────────────────────────\n";
echo " Nextcloud веб-интерфейс использует СВОЙ API, не WebDAV!\n\n";
echo " 📋 Возможные endpoints:\n";
echo " 1. /apps/files/ajax/list.php - список файлов\n";
echo " 2. /index.php/apps/files/api/v1/files - Files API\n";
echo " 3. /ocs/v2.php/apps/files/api/v1/files - OCS Files API\n";
echo " 4. JavaScript делает запросы через fetch() к внутренним API\n\n";
// Проверяем Files API
echo " 🔍 Проверяем Files API:\n";
$filesApiUrl = $nextcloudUrl . '/index.php/apps/files/api/v1/files?dir=' . urlencode($testPath);
$startTime = microtime(true);
$ch = curl_init($filesApiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/nc_cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/nc_cookies.txt');
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$duration = (microtime(true) - $startTime) * 1000;
curl_close($ch);
echo " URL: $filesApiUrl\n";
echo " ⏱️ Время: " . round($duration, 2) . " мс\n";
echo " 📊 HTTP код: $httpCode\n";
if ($httpCode == 200) {
$data = json_decode($response, true);
if ($data && isset($data['data'])) {
echo " 📁 Найдено элементов: " . count($data['data']) . "\n";
}
} else {
echo " ⚠️ Может требовать сессию или другой формат\n";
}
// 3. Разница в логике
echo "\n3⃣ РАЗНИЦА В ЛОГИКЕ:\n";
echo "────────────────────────────────────────────────────────────────────────────\n";
echo " ✅ n8n (WebDAV PROPFIND):\n";
echo " - Прямой запрос к S3 через Nextcloud\n";
echo " - Только список файлов (минимальные данные)\n";
echo " - Один запрос = один ответ\n";
echo " - Быстро! ⚡\n\n";
echo "Веб-интерфейс Nextcloud:\n";
echo " - Использует внутренний Files API\n";
echo " - Может делать НЕСКОЛЬКО запросов:\n";
echo " • Список файлов\n";
echo " • Метаданные (размеры, даты)\n";
echo " • Права доступа\n";
echo " • Превью (если включены)\n";
echo " • Теги и комментарии\n";
echo " - Может проверять кеш Nextcloud (oc_filecache)\n";
echo " - Если кеш устарел - сканирует S3\n";
echo " - Медленно! 🐌\n\n";
// 4. Почему веб-интерфейс медленный
echo "4⃣ ПОЧЕМУ ВЕБ-ИНТЕРФЕЙС МЕДЛЕННЫЙ:\n";
echo "────────────────────────────────────────────────────────────────────────────\n";
echo " 🔍 Возможные причины:\n\n";
echo " 1. Nextcloud проверяет кеш (oc_filecache)\n";
echo " - Если кеш устарел → сканирует S3\n";
echo " - filesystem_check_changes=0 должно помочь, но...\n\n";
echo " 2. Веб-интерфейс делает ДОПОЛНИТЕЛЬНЫЕ запросы:\n";
echo " - Запрос метаданных для каждого файла\n";
echo " - Запрос прав доступа\n";
echo " - Запрос превью (если включены)\n";
echo " - Запрос тегов и комментариев\n\n";
echo " 3. JavaScript загружает данные ПОСТЕПЕННО:\n";
echo " - Сначала структура папок\n";
echo " - Потом метаданные файлов\n";
echo " - Потом превью\n";
echo " - Каждый запрос = задержка\n\n";
echo " 4. Nextcloud может сканировать ВСЮ папку:\n";
echo " - Даже если нужно показать только один уровень\n";
echo " - Проверяет все подпапки\n";
echo " - Особенно при filesystem_check_changes=1\n\n";
// 5. Решение
echo "5⃣ РЕШЕНИЕ:\n";
echo "────────────────────────────────────────────────────────────────────────────\n";
echo " 💡 ИСПОЛЬЗОВАТЬ ПРЯМОЙ WebDAV API (как n8n):\n\n";
echo " Вместо открытия через веб-интерфейс:\n";
echo " https://office.clientright.ru:8443/apps/files/?dir=/crm/...\n\n";
echo " Использовать прямой WebDAV запрос:\n";
echo " https://office.clientright.ru:8443/remote.php/dav/files/admin/crm/...\n\n";
echo " Или создать свой endpoint в CRM, который:\n";
echo " 1. Делает PROPFIND запрос (как n8n)\n";
echo " 2. Парсит XML\n";
echo " 3. Возвращает JSON\n";
echo " 4. Кеширует результат в Redis\n\n";
echo " 📊 ОЖИДАЕМЫЙ ЭФФЕКТ:\n";
echo " - Вместо 3-5 секунд → 0.1-0.5 секунды\n";
echo " - Ускорение в 10-50 раз!\n\n";
echo "════════════════════════════════════════════════════════════════════════════════\n";
echo "✅ ИТОГ: Веб-интерфейс делает больше запросов, чем нужно\n";
echo "💡 Решение: Использовать прямой WebDAV API (как n8n)\n";
echo "════════════════════════════════════════════════════════════════════════════════\n";