Files
crm.clientright.ru/analyze_nextcloud_web_vs_api.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

194 lines
9.8 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 медленный, а 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";